Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Timer1 в ATmega128 режим сравнения
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Ph. Anatoliy
Написал следующий код. При пошаговом прохождении в AVR studia 4 значения загружаются совершенно не в те регистры.

Пдскажите пожалуйста, может у кого есть кусочек кода как на 128 меге настроить таймер 1 на срабатывание прерываения COMPA и COMPB при этом при срабатывании COMPB сбрасывать таймер счетчик в 0.

Код
#include <avr/io.h>
#include <avr/interrupt.h>

ISR(TIMER3_COMPA_vect)
{
  
    PORTF = 0x01;
}

ISR(TIMER3_COMPB_vect)
{
  
    PORTF = 0x03;
}


int main (void)
{
    unsigned char sreg;

    DDRF = 0xff;
    PORTF = 0x00;

    OCR3AH=0x05;
    OCR3AL=0x03;
    
    TCCR3A=0xA0;
    TCCR3B=0x02;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x18;
    ETIMSK=0x00;

    sei();
    
    while (1)
    {
    }

    return 0;
}
chief_olimp
вы противоречите сами себе хотите настроить таймер 1 а запускаете таймер 3, почему TIMSK = 0x18 а ETIMSK = 0x00. Что бы работало должно быть наоборот. Ну и что в процедуре обработчика мешает всунуть TCNT3=0
defunct
Цитата(chief_olimp @ Nov 7 2009, 18:41) *
Ну и что в процедуре обработчика мешает всунуть TCNT3=0

Вот этого делать не надо. Интервал таймера будет "дрожжать", jitter появится когда будет несколько прерываний.


Цитата(Ph. Anatoliy @ Nov 7 2009, 17:52) *
кусочек кода как на 128 меге настроить таймер 1 на срабатывание прерываения COMPA и COMPB при этом при срабатывании COMPB сбрасывать таймер счетчик в 0.

Если вас устроит сброс счетчика таймера в 0 при достижении COMPA вместо COMPB смотрите пример ниже:

Код
#include <avr/io.h>
#include <avr/interrupt.h>

SIGNAL (SIG_OUTPUT_COMPARE1A)
{
    static char x = 0;
    PORTA = x++;
}

SIGNAL (SIG_OUTPUT_COMPARE1B)
{
    static char x = 0;
    PORTB = x++;
}


static void Timer1Init(void)
{
    OCR1A =  500;
    OCR1B =  200;

    TIMSK |= (1 << OCIE1A) | (1 << OCIE1B);
    TCCR1B = (1 << CS10) | (1 << WGM12); // no prescaler + CTC1
}


void main(void)
{
    Timer1Init();
    sei();
    for(;;);
}
chief_olimp
SIGNAL уже давно устарел, хотя и работает. И говоря про режим сравнения по А или В я использую строку вида
Код
ISR(TIMER3_COMPB_vect)
{
  TCCR3В += 0xA0;
}
И не нужно сам таймер обнулять. Он просто будет считать дальше.
defunct
Цитата(chief_olimp @ Nov 8 2009, 10:18) *
TCCR3В += 0xA0;

И что бы это значило?
Насилуете ICNC и пишете "1" в reserved bit?

• Bit 5 – Reserved Bit
This bit is reserved for future use. For ensuring compatibility with future devices, this bit
must be written to zero when TCCRnB is written.


Цитата
И не нужно сам таймер обнулять. Он просто будет считать дальше.

Если не видите разницы в частоте между счетом до 500 и счетом до 65535... то лучше ничего не советуйте.
Ph. Anatoliy
Прошу прощения за путаницу. В коде действительно таймер 3 (просто первоначально делал на 1ом, а когда встретил глюк, попробовал сделать тоже самое на 3ем). Хотел отладить на АВР студии и нашел прикол с адресацией регистров (см. картинки выше). Пожалуйста, если у кого-нибудь стоит АВР студия 4 создайте подобный проект на 128 мегу и посмотрите на адреса регистров.

Может в 16 битных таймерах идет заполнение регистров через буфер ?

defunct - спасибо за код, сейчас попробую.
chief_olimp
Цитата(defunct @ Nov 8 2009, 21:09) *
И что бы это значило?

Ну погарячился чего уж там laughing.gif , бывает wacko.gif . А вы не подумали и не исправили smile3009.gif . Я имел ввиду строку вида
Код
OCR3B += 0xA0;
т.е. при каждом обращении будет увеличиваться регистр сравнения. А счетчик будет считать по кругу. Таким образом довольно легко можно использовать все три прерывания сравнения. yeah.gif
defunct
Цитата(chief_olimp @ Nov 8 2009, 21:48) *
А вы не подумали и не исправили smile3009.gif . Я имел ввиду строку вида
Код
OCR3B += 0xA0;

Точно smile.gif
Cложновато было представить, что TCCRxB там в результате опечатки появился.

Цитата
т.е. при каждом обращении будет увеличиваться регистр сравнения.

Да, это тоже вариант
V_G
Ph. Anatoliy
У вас какая-то левая студия. На вкладке About никогда не встречал ссылку ни на какой Tenison.
На моей рабочей AvrStudio 4.17 build 666 адреса TCCR1B = 0x2E TCNT1H = 0x2D OCR1AL = 0x2A OCR1BH=0x29
chief_olimp
Цитата(V_G @ Nov 9 2009, 04:19) *
Ph. Anatoliy
У вас какая-то левая студия. На вкладке About никогда не встречал ссылку ни на какой Tenison.
На моей рабочей AvrStudio 4.17 build 666 адреса TCCR1B = 0x2E TCNT1H = 0x2D OCR1AL = 0x2A OCR1BH=0x29

Ужас у меня тоже левая. Я ее качал на каком то www.atmel.com. наверное правильная на рапиде лежит wacko.gif . Извените bb-offtopic.gif
V_G
Значит, давно не обновлялись!Нажмите для просмотра прикрепленного файла
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.