Перейти к содержанию
    

navovvol

Участник
  • Постов

    104
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о navovvol

  • Звание
    Частый гость
    Частый гость
  • День рождения 30.12.1988
  1. Вышла Atmel Studio 6

    Кто-нить знает есть ли в версии 6.1 встроенный SVN (локальный) или подобие ?
  2. Не работает код

    Блин, походу топикстартер сначало вставил сюда половину кода, а потом еще раз вставил, но уже весь код. Полтора раза одно и тоже. Mr_Gish, посмотрите, что вообще на ножках разъема осциллографом или хотя бы мультиметром. И вы вообще к какому разъему подключились ? Вам нужен DB9F, это тот, что типа-мама.
  3. Не работает код

    Ааа! Используйте codebox плиз.
  4. .def count_VERY_HIGHT = R22 .def count_HIGHT= R21 .def count_LOW = R20 //Перменная счётчик .def temp = R16 .def NewState= R17 ///Сюда записываем новое состояние ///пинов на которых висит энкодер .def OldState= R18 //Тут хранится состояние пинов //предыдущего опроса .def count_encoder = R23 ENCODER_RAM: .byte 6 ; FLASH ====================================================== //////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////// ТАБЛИЦА ВЕКТОРОВ ПРЕРЫВАНИЙ ///////////////////////////////////// .CSEG .org $0000 rjmp RESET ; Переход на обработку сброса .org $0012 jmp TIM2_COMP ; Переход на обработку при выполнении условия сравнения таймера 2 .ORG INT_VECTORS_SIZE ; Конец таблицы прерываний //////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////// иницилизация стека///////////////////////// RESET: ldi r16,low(RAMend) out SPL,r16 ldi r16,high(RAMend) out SPH,r16 // ;ENCODER INIT CLRB DDRE,3,R16 ;DDRE.3 = 0 датчик зенита на вход CLRB DDRE,4,R16 ;DDRE.4 = 0 датчик зенита на вход SETB PORTE,3,R16 ;PORTE.3 = 1 Pull-up SETB PORTE,4,R16 ;PORTE.4 = 1 Pull-up // ///////////////Инициализация Прерываний////////////////////// ;....................................................................... .equ XTAL = 16000000 .equ baudrate =115200 /// в реале скорость 115200. т.к. бит удвоенной скорости=1 .equ bauddivider = XTAL/(8*baudrate)-1 .equ frequncy = 1000 .equ encoder_number = (XTAL/(frequncy))/64 outi TCCR2,0<<WGM00|0<<COM01|0<<COM00|1<<WGM01|0<<CS02|1<<CS01|1<<CS00 outi OCR2, encoder_number //обработка прерывания таймера 2 TIM2_COMP: PUSHF PUSH ZL PUSH ZH PUSH R17 PUSH R18 PUSH R19 clr R16 clr R17 clr R18 LDS NewState,ENCODER_RAM LDS OldState,ENCODER_RAM+1 LDS count_LOW,ENCODER_RAM+2 LDS count_HIGHT,ENCODER_RAM+3 LDS count_VERY_HIGHT,ENCODER_RAM+4 LDS count_encoder,ENCODER_RAM+5 ;............................................................. IN NewState,PINE ;Читаем порт к которому подключен энкодер CBR NewState,0b11100111 LSR NewState LSR NewState LSR NewState cpi OldState,0;OldState,0 brne Cpi1 //Если нет то проверяем другое условие cpi NewState,2;NewState,2 brne Cpi11 rcall RightShift ;............................................................. Cpi11: cpi NewState,1;NewState,1 brne Cpi12 rcall LeftShift ;............................................................. Cpi12: mov OldState,NewState;OldState,NewState //То что было новым состоянием энкодера, стало старым... rjmp EXIT_ENCODER ;............................................................. Cpi1: //2) При прошлом опросе Пин А=1 и Пин В=0 ? cpi OldState,1;OldState,1 brne Cpi2 //Если нет то проверяем другое условие cpi NewState,0;NewState,0 // brne Cpi21 rcall RightShift ;............................................................. Cpi21: cpi NewState,3;NewState,3 brne Cpi22 rcall LeftShift ;............................................................. Cpi22: mov OldState,NewState;OldState,NewState //То что было новым состоянием энкодера, стало старым... rjmp EXIT_ENCODER ;............................................................. Cpi2: //3 ) При прошлом опросе Пин В=1 и Пин А=0 ? cpi OldState,2;OldState,2 brne Cpi3 //Если нет то проверяем другое условие cpi NewState,3;NewState,3 brne Cpi31 rcall RightShift ;............................................................. Cpi31: cpi NewState,0;NewState,0 brne Cpi12 rcall LeftShift ;............................................................. Cpi32: mov OldState,NewState;OldState,NewState //То что было новым состоянием энкодера, стало старым... rjmp EXIT_ENCODER ;............................................................. Cpi3: ///4) При прошлом опросе Оба пина=1 ? cpi OldState,3;OldState,3 brne Cpi4 //Если нет то выходим из процедуры сканирования cpi NewState,1;NewState,1 brne Cpi41 rcall RightShift ;............................................................. Cpi41: cpi NewState,2;NewState,2 brne Cpi42 rcall LeftShift ;............................................................. Cpi42: mov OldState,NewState;OldState,NewState //То что было новым состоянием энкодера, стало старым... ;............................................................. Cpi4: rjmp EXIT_ENCODER ;............................................................. RightShift: clr count_encoder STS count_Left,count_encoder LDS count_encoder,count_Right cpi count_encoder,4;count,4 //Состояние пинов сменилось 4 раза? brne exitRS clr count_encoder;count STS count_Right,count_encoder ldi R16,1 ADD count_LOW,R16 clr R16 ADC count_HIGHT,R16 ADC count_VERY_HIGHT,R16 rjmp exitRS2 exitRS: inc count_encoder;count STS count_Right,count_encoder exitRS2: RET ;............................................................. LeftShift: clr count_encoder STS count_Right,count_encoder LDS count_encoder,count_Left cpi count_encoder,4;count,4 //Состояние пинов сменилось 4 раза? brne exitLS clr count_encoder;count STS count_Left,count_encoder LDI R16,1 SUB count_LOW,R16 clr R16 SBC count_HIGHT,R16 SBC count_VERY_HIGHT,R16 rjmp exitLS2 exitLS: inc count_encoder;count STS count_Left,count_encoder exitLS2: RET ;............................................................. /// подпрограммы для энкодера EXIT_ENCODER: STS ENCODER_RAM,NewState STS ENCODER_RAM+1,OldState STS ENCODER_RAM+2,count_LOW STS ENCODER_RAM+3,count_HIGHT STS ENCODER_RAM+4,count_VERY_HIGHT STS ENCODER_RAM+5,count_encoder POP R19 POP R18 POP R17 ; Корректный выход из прерывания. POP ZH POP ZL POPF RETI Идеальная программа для энкодера на АСМе. Разбирайтесь. P.S. к сожалению, при копировании накрылась медным тазом табуляция.
  5. Вышла Atmel Studio 6

    Если честно, то я не пойму как им пользоваться. Визардом добавил всяких драйверов и сервисов, а как ими пользоваться хз. И не могу найти описание или примеры.
  6. Вышла Atmel Studio 6

    Товарищи, кто-нибудь пользовался ASF, его визардом, сервисами и драйверами ? Насколько это удобно и понятно ?
  7. Мда.. я в со Флешем ваще не дружу. может так надо ? PROGMEM const char *Day_Pointer [] { DS3231_Day1,DS3231_Day2, DS3231_Day3,DS3231_Day4, DS3231_Day5,DS3231_Day6, DS3231_Day7; } //
  8. Вопросы по XMega

    Ах да совсем забыл... в режиме HiRes нормальный режим таймера не доступен. А он нужен для захвата.
  9. Вопросы по XMega

    Xenia, я кажется понял, что требуется. Пусть Atxmega128A1 тактируется от внешнего кварца на 8МГц. И через PLL вытворяем такое: (код сгенерирован CV AVR) // System Clocks initialization void system_clocks_init(void) { unsigned char n,s; // Optimize for speed #pragma optsize- // Save interrupts enabled/disabled state s=SREG; // Disable interrupts #asm("cli") // External 8000.000 kHz clock source on XTAL1 initialization OSC.XOSCCTRL=OSC_XOSCSEL_EXTCLK_gc; // Enable the external clock source OSC.CTRL|=OSC_XOSCEN_bm; // System Clock prescaler A division factor: 1 // System Clock prescalers B & C division factors: B:2, C:2 // ClkPer4: 128000.000 kHz // ClkPer2: 64000.000 kHz // ClkPer: 32000.000 kHz // ClkCPU: 32000.000 kHz n=(CLK.PSCTRL & (~(CLK_PSADIV_gm | CLK_PSBCDIV1_bm | CLK_PSBCDIV0_bm))) | CLK_PSADIV_1_gc | CLK_PSBCDIV_2_2_gc; CCP=CCP_IOREG_gc; CLK.PSCTRL=n; // PLL initialization // PLL clock source: External Osc. or Clock // PLL multiplication factor: 16 // PLL frequency: 128.000000 MHz // Set the PLL clock source and multiplication factor n=(OSC.PLLCTRL & (~(OSC_PLLSRC_gm | OSC_PLLFAC_gm))) | OSC_PLLSRC_XOSC_gc | 16; CCP=CCP_IOREG_gc; OSC.PLLCTRL=n; // Enable the PLL OSC.CTRL|=OSC_PLLEN_bm; // System Clock prescaler A division factor: 1 // System Clock prescalers B & C division factors: B:2, C:2 // ClkPer4: 128000.000 kHz // ClkPer2: 64000.000 kHz // ClkPer: 32000.000 kHz // ClkCPU: 32000.000 kHz n=(CLK.PSCTRL & (~(CLK_PSADIV_gm | CLK_PSBCDIV1_bm | CLK_PSBCDIV0_bm))) | CLK_PSADIV_1_gc | CLK_PSBCDIV_2_2_gc; CCP=CCP_IOREG_gc; CLK.PSCTRL=n; // Wait for the PLL to stabilize while ((OSC.STATUS & OSC_PLLRDY_bm)==0); // Select the system clock source: Phase Locked Loop n=(CLK.CTRL & (~CLK_SCLKSEL_gm)) | CLK_SCLKSEL_PLL_gc; CCP=CCP_IOREG_gc; CLK.CTRL=n; // Disable the unused oscillators: 2 MHz, 32 MHz, internal 32 kHz OSC.CTRL&= ~(OSC_RC2MEN_bm | OSC_RC32MEN_bm | OSC_RC32KEN_bm); // ClkPer output: Disabled bit 7 PORTCFG.CLKEVOUT=(PORTCFG.CLKEVOUT & (~PORTCFG_CLKOUT_gm)) | PORTCFG_CLKOUT_OFF_gc; // Restore interrupts enabled/disabled state SREG=s; // Restore optimization for size if needed #pragma optsize_default } Далее берем таймер и заставляем его работать в режиме "высокой точности" Hi-Res в этом режиме он тактируется от Clkper4, т.е. от 128MHz. А далее пин таймера ставим на Capture. Нее ? не подойдет ?
  10. Вопросы по XMega

    Можно нарушать, только неизвестно, как долго проработает. У меня один опытный образец уже полтора года на 48МГц работает и полностью исправен. Работает от внешнего кварца на 8 МГц и PLL на 6. Выше поднимать удавалось, уже не помню до скольки, но потом засомневался и прекратил эксперименты, оставив на 48МГц. Нагреваний МК-ра замечено не было. Ну, а таймеры могут тактироваться вместе с CPU или через делитель, так что - да, таймеры заработают быстрее.
  11. Спасибо. Если задуманное получиться, покажу, что вышло.
  12. Буду краток. Работают ли операторы "new" и "delete" ? Есть ли их аналоги ? Проект делается на Си.
  13. А я делаю вот так : void system_clocks_EXTERNAL8x4(void) { OSC_XOSCCTRL=0xCB;//OSC_FRQRANGE_2TO9_gc | OSC_XOSCSEL_XTAL_16KCLK_gc;// внешний 8000_000 kHz кварц OSC_CTRL=0x08;//OSC_CTRL|=OSC_XOSCEN_bm;// Вкл. внешний кварц while ((OSC_STATUS & OSC_XOSCRDY_bm)==0);// ожидание инициализация OSC_PLLCTRL=OSC_PLLSRC_gm|PLL_multiplay;////OSC_PLLSRC_gm=0xC0-внешний источник тактир-ия. PLL_multiplay- множитель 4 OSC_CTRL=0x19;//OSC_CTRL|=OSC_PLLEN_bm;// включение блока PLL while ((OSC_STATUS & OSC_PLLRDY_bm)==0);// // ожидание инициализация PLL asm ("ldi r16,0xd8"); asm ("ldi r17,0x04"); asm ("out 0x34,r16"); asm ("sts 64,r17"); OSC_CTRL=0x18; } Кварц туда втыкаете ? может он ваще не на тех пинах тактирует.
  14. Вообщем я решил траблу, нашел странное поведение компилятора. Было:( Работало не понятно как) /Чтение inSourceDelta=(int16_t)eeprom_read_word(&eep_SD_WL); Теперь переделал вот так: /Чтение inSourceDelta=eeprom_read_word(&eep_SD_WL); Почему-то так работает без нареканий. Включена оптимизация Q1.
  15. EEPROM AtXMega и типы int16,int32,double.

    Не могу нормально реализовать запись/чтение EEPROM на AtXMega128A1. (AVR Studio 6, Си) Использовал стандартную библиотеку #include <avr/eeprom.h> Пример использования EEMEM int16_t eep_SD_WL;// EEMEM int16_t eep_SZ_WL;// EEMEM int32_t eep_DD_WL;// EEMEM int32_t eep_DZ_WL;// EEMEM int32_t eep_KM_WL;// //..... int16_t inSourceDelta; int16_t inSourceZero; int32_t inDestinationDelta; int32_t inDestinationZero; //Чтение inSourceDelta=(int16_t)eeprom_read_word(&eep_SD_WL); inSourceZero=(int16_t)eeprom_read_word(&eep_SZ_WL); inDestinationDelta=(int32_t)eeprom_read_dword(&eep_DD_WL); inDestinationZero=(int32_t)eeprom_read_dword(&eep_DZ_WL); //Запись eeprom_write_word(eep_SD_WL,4095); eeprom_write_word(eep_SZ_WL,100); eeprom_write_dword(eep_DD_WL,1); eeprom_write_dword(eep_DZ_WL,1); Чтение и Запись проходят удачно. Но как только сбрасываю питание - значения теряются. Нашел на сайте Атмел Апликатион ноте AVR1315 Accessing the XMEGA EEPROM, но он ваще не удобный, нужно вычислять адреса страниц, байтов, и запись только побайтная.
×
×
  • Создать...