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

 
 
> Не получается сконфигурировать таймер ATMega8515
Sirko
сообщение May 15 2011, 20:35
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Не могу даже понять, откуда проблема.
Необходимо запустить первый таймер в режиме - CTC по сравнению с регистром ICR1.

Вот исходник:
Код
void InitializationTimer1(void){
    TCCR1B |= _BV(CS11);                                //    Тактирование таймера clk/8 = 1843200 Гц
    TCCR1B | _BV(WGM13) | _BV(WGM12);                //    Режим работы - "Сброс при совпадении ICR1"
    ICR1 = (F_CPU/8)/100;                            //    Переполнение - через 10 mSec
    TIMSK |= _BV(TOIE1);                                //    Разрешить прерывание по переполнению
}

ISR (TIMER1_OVF_vect) {
    static u16 q = 0;
    if(q == 0){
        PORTA ^= _BV(PA3);
        q = 100;
    }else
        --q;
}

Теоретически, прерывание должно возникать 100 раз в секунду, соответственно, дерганье ногой, в моем случае, должно происходить каждую секунду. Но в железе видно, что это происходит раз за почти четыре секунды. Значит, почему-то в регистре ICR1 не мое значение, а 0xFFFF.
Решил глянуть в симуляторе студии. Оказывается, проблема в следующем:
строка TCCR1B |= _BV(CS11) отрабатывается корректно, а
строка TCCR1B | _BV(WGM13) | _BV(WGM12) не выставляет никакие биты, соответственно, таймер работает в режиме normal.
Когда я объединил эти строки в одну TCCR1B |= _BV(CS11) | _BV(WGM13) | _BV(WGM12), в симуляторе начали выставляться все положенные биты, но в железе нога больше не дергается.

Понимаю, что чего-то я не знаю. Вот собственно и вопрос - ЧЕГО?

Компилятор с WinAVR-20100110, makefile - студийный, оптимизация Os
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
XVR
сообщение May 16 2011, 09:21
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
Решил глянуть в симуляторе студии. Оказывается, проблема в следующем:
строка TCCR1B |= _BV(CS11) отрабатывается корректно, а
строка TCCR1B | _BV(WGM13) | _BV(WGM12) не выставляет никакие биты, соответственно, таймер работает в режиме normal.
Вопрос на засыпку - найдите хоть один знак присваивания во 2й строке. Когда не найдете - задайте себе вопрос, а с чего собственно TCCR1B должен был измениться?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Sirko   Не получается сконфигурировать таймер ATMega8515   May 15 2011, 20:35
- - demiurg_spb   Обычно делают так: Кодcli(); TCCRxB = 0; /...   May 16 2011, 04:23
- - Sirko   ЦитатаТ.е. прямо пишут байты в регистры таймера В ...   May 16 2011, 06:14
|- - demiurg_spb   Цитата(Sirko @ May 16 2011, 10:14) В этой...   May 16 2011, 06:38
- - Sirko   Цитатаа с чего собственно TCCR1B должен был измени...   May 16 2011, 10:23
- - Sirko   Чет невыходит ниче. Инициализирую вот так: TCCR1B...   May 16 2011, 18:36
|- - demiurg_spb   Цитата(Sirko @ May 16 2011, 22:36) Че ему...   May 17 2011, 04:12
- - ILYAUL   Очень интересно, ждём прерывание по совпадению , а...   May 16 2011, 19:18
- - Sirko   ЦитатаОчень интересно, ждём прерывание по совпаден...   May 16 2011, 19:58
|- - ILYAUL   Цитата(Sirko @ May 16 2011, 23:58) Прости...   May 16 2011, 20:35
- - alexeyv   В вашем случае проще использовать режим таймера №4...   May 17 2011, 04:22
- - Sirko   ЦитатаЭто же Ваше Мое. Только я считал, что при ср...   May 17 2011, 19:20
- - ILYAUL   Цитата(Sirko @ May 17 2011, 23:20) Мое. Т...   May 17 2011, 20:13


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

 


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


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