|
TIMER1 в mega8, не могу заставить работать в СТС |
|
|
|
May 7 2010, 22:10
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
вот его определение Код TCCR1A= (1<<COM1A0); TCCR1B= (0<<CS02)|(0<<CS01) |(1<<CS00)|(1<<WGM12); //CTC mode, no prescaled TIMSK = (1<<TOIE0)|(1<<OCIE1A); //for counter 0 and counter 1 (1<<TICIE1)| OCR1AL= 150; //init OCR1AL for CTC mode OCR1AH= 0; хочу, чтобы счетчик досчитывал до 150, прерывался, там я инк. переменную, дальше он обнуляется и снова считает до 150... пробовал без Код TCCR1A= (1<<COM1A0); та же фигня. моя переменная, кот. должна инк. =0 постоянно вроде как ничего в коде не упустил?
Сообщение отредактировал rezident - May 8 2010, 23:53
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
May 8 2010, 05:36
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
т.е. поменять местами Код OCR1AL= 150; //init OCR1AL for CTC mode OCR1AH= 0; на Код OCR1AH= 0; OCR1AL= 150; //init OCR1AL for CTC mode ? это принципиально разве? Код TCCR1A= (1<<COM1A0); TCCR1B= (0<<CS02)|(0<<CS01) |(1<<CS00)|(1<<WGM12); //CTC mode, no prescaled тоже менял- результат тот же- не работатет
Сообщение отредактировал rezident - May 8 2010, 23:54
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
May 8 2010, 06:45
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
Код char __low_level_init (void) { //this function will starts after reset AVR
UBRRL = ((OSC / 16 / RS232_BAUDRATE - 1) >> 0) & 0xFF; //for mega8 UCSRB = (1 << RXCIE) | (1<<RXEN) | (1<<TXEN); //for UART for RX & TX, enable interrupts
TCCR0 = (1<<CS02)|(0<<CS01) |(1<<CS00); //prescaler for counter 0 TCCR1B= (0<<CS02)|(0<<CS01) |(1<<CS00)|(1<<WGM12); //CTC mode, no prescaled TCCR1A= (1<<COM1A0); TIMSK = (1<<TOIE0)|(1<<OCIE1A); //for counter 0 and counter 1 (1<<TICIE1)| OCR1AH= 0; OCR1AL= koeff; //init OCR1AL for CTC mode
PORTB = (0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0); // all pins to 0 DDRB =(1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0); // all pins to out
PORTD = (0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0); // all pins to 0 DDRD =(0<<7)|(0<<6)|(0<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0); // pins 5,6,7 to in
return 1; // after return initialise memory }
#pragma vector = TIMER1_OVF_vect __interrupt void overflow_timer1(void) { CntMC++; cpl(TST); //for each ms on 24 pin } даташиту уже зачитал до дыр наверное ))) что за Код TCCR1A= (1<<COM1A0); что этот рег. делает? может по другому вектору надо ловить? по вектору сравнения какому- то?
Сообщение отредактировал rezident - May 8 2010, 23:55
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
May 8 2010, 07:20
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
в этой таблице говорится, что если я хочу режим СТС, с вершиной OCR1, мне надо включить бит WGM12. итого, вектор прерывания должен быть другой? Код #pragma vector = TIMER1_OVF_vect скажете какой? пока читаю даташиты так а этот надо включать? Код что за TCCR1A= (1<<COM1A0);
Сообщение отредактировал rezident - May 8 2010, 23:55
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
May 8 2010, 09:57
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Метценгерштейн @ May 8 2010, 11:20)  в этой таблице говорится, что если я хочу режим СТС, с вершиной OCR1, мне надо включить бит WGM12. В этой таблице есть графа "TOV1 Flag Set on", которая определяет условие установки флага переполнения (а, значит, и соответствующего прерывания). Из неё видно, что в этом режиме прерывание по переполнению - не подходит Цитата(Метценгерштейн @ May 8 2010, 11:20)  итого, вектор прерывания должен быть другой? Код #pragma vector = TIMER1_OVF_vect скажете какой? У этого таймера всего четыре прерывания. Одно из них - не подходит. Угадайте с трёх раз: какой вектор, если условие сброса счетчика - регистр OCR1 А. По-моему, это очевидно... Цитата(Метценгерштейн @ May 8 2010, 11:20)  так а этот надо включать? что за Код TCCR1A= (1<<COM1A0); Вам - на ноге ОС1А сигнал таймера нужен? Если - нет, не трогайте настройки, относящиеся к этому сигналу
|
|
|
|
|
May 8 2010, 17:22
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
"TOV1 Flag Set on" одного не пойму, в таблице написано что это МАХ, а ТОР это OCR1A тогда при чем здесь МАХ? думаю мне надо прерывание Код #pragma vector = TIMER1_ COMPA_vect но вот беда, ИАР ругается на такое объявление (((
Сообщение отредактировал rezident - May 8 2010, 23:56
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
May 18 2010, 17:14
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(sigmaN @ May 9 2010, 20:57)  При использовании Си, чтобы не париться с порядком записи байтов в двухбайтовый регистр - можно просто объявить этот регистр как двухбайтовую переменную(указатель на адрес регистра) и присваивать туда сразу 16бит за один раз. При условии что эти два байта идут подряд в памяти, что не гарантировано в 100% случаев (считай никогда если пишешь универсальный модуль)... Цитата(Метценгерштейн @ May 18 2010, 18:25)  можно на примере, напрмиер, для ... mega8 Для неё как раз нельзя, т.к: Код #define UBRRL _SFR_IO8(0x09) #define UBRRH _SFR_IO8(0x20) а вообще так: Код UBRR = 0xXXXX;
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
May 18 2010, 17:36
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Метценгерштейн @ May 18 2010, 21:20)  это понятно, имел ввиду указатель на адрес. Тут не ясно как это применять. Я же говорю, что с UBRR для mega8 это невозможно в принципе. А так: Код #define BYTE_AT(mem_addr) (*(volatile uint8_t *)(mem_addr)) #define WORD_AT(mem_addr) (*(volatile uint16_t *)(mem_addr))
#define MY_REG_L BYTE_AT(0x50) #define MY_REG_H BYTE_AT(0x51)
#define MY_REG WORD_AT(0x50) Цитата вот так, например. Не понял вопроса...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|