реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> TIMER1 в mega8, не могу заставить работать в СТС
Метценгерштейн
сообщение May 7 2010, 22:10
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 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
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 8 2010, 04:54
Сообщение #2


Гуру
******

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



Цитата(Метценгерштейн @ May 8 2010, 02:10) *
Вроде как ничего в коде не упустил?
Порядок записи байт в двухбайтный регистр
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 8 2010, 05:36
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 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
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 8 2010, 06:39
Сообщение #4


Гуру
******

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



Цитата(Метценгерштейн @ May 8 2010, 09:36) *
это принципиально разве?
В данном случае, может быть, и - не принципиально. Но порядок - должен быть. А то у Вас: таймер запускается до его окончательной настройки, да ещё и прерывания разрешаются; запись в двубайтный регистр - строго наоборот. DS невнимательно читаете. Надеюсь, прерывания разрешены в SREG? По какому вектору прерывания ловите?
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 8 2010, 06:45
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 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
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 8 2010, 06:58
Сообщение #6


Гуру
******

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



Цитата(Метценгерштейн @ May 8 2010, 10:45) *
TIMSK = (1<<TOIE0)|(1<<OCIE1A); //for counter 0 and counter 1 (1<<TICIE1)|
#pragma vector = TIMER1_OVF_vect
может по другому вектору надо ловить? по вектору сравнения какому- то?
Конечно, переполнение наступит при значении счетчика = MAX, а не при OCR1A (см.таблицу 39).

Цитата(Метценгерштейн @ May 8 2010, 10:45) *
даташиту уже зачитал до дыр наверное )))
что за TCCR1A= (1<<COM1A0);
что этот рег. делает?

Это - для выхода ОС1А
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 8 2010, 07:20
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



в этой таблице говорится, что если я хочу режим СТС, с вершиной OCR1, мне надо включить бит WGM12.

итого, вектор прерывания должен быть другой?
Код
#pragma vector = TIMER1_OVF_vect


скажете какой? пока читаю даташиты

так а этот надо включать?
Код
что за TCCR1A= (1<<COM1A0);


Сообщение отредактировал rezident - May 8 2010, 23:55
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 8 2010, 09:57
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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А сигнал таймера нужен? Если - нет, не трогайте настройки, относящиеся к этому сигналу
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 8 2010, 17:22
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



"TOV1 Flag Set on"
одного не пойму, в таблице написано что это МАХ, а ТОР это OCR1A
тогда при чем здесь МАХ?

думаю мне надо прерывание
Код
#pragma vector = TIMER1_ COMPA_vect


но вот беда, ИАР ругается на такое объявление (((

Сообщение отредактировал rezident - May 8 2010, 23:56
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 8 2010, 19:30
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



заработало все- почему- то копирование из даташита TIMER1_ COMPA_vect
вызывало ругань. скопировал из io.h
Go to the top of the page
 
+Quote Post
sigmaN
сообщение May 9 2010, 16:57
Сообщение #11


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



При использовании Си, чтобы не париться с порядком записи байтов в двухбайтовый регистр - можно просто объявить этот регистр как двухбайтовую переменную(указатель на адрес регистра) и присваивать туда сразу 16бит за один раз.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 18 2010, 14:25
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



можно на примере, напрмиер, для

UBRRL = ((OSC / 16 / RS232_BAUDRATE - 1) >> 0) & 0xFF; //for mega8
UBRRH
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 18 2010, 17:14
Сообщение #13


неотягощённый злом
******

Группа: Свой
Сообщений: 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;


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 18 2010, 17:20
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



это понятно, имел ввиду указатель на адрес. Тут не ясно как это применять.

UBRR = 0xXXXX; А что если я не хочу одним числом туда все писать? А хочу как у меня

TCCR1B= (0<<CS02)|(0<<CS01) |(1<<CS00)|(1<<WGM12); //CTC mode, no prescaled
TCCR1A= (1<<COM1A0);

вот так, например.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 18 2010, 17:36
Сообщение #15


неотягощённый злом
******

Группа: Свой
Сообщений: 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)


Цитата
вот так, например.
Не понял вопроса...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.0152 секунд с 7
ELECTRONIX ©2004-2016