Страница 1 из 1

Timer 0 atmega644

Добавлено: Чт мар 14, 2013 16:14:36
Сериг
Всем привет.
Вообщем запускаю таймер,с перед делителем тактовой частоты(7,372800 гц) 1024,итого таймер тактируется от 7200 Герц. Максимум до которого может досчитать таймер-это 255,подскажите как мне сделать что бы таймер менял состояние вывода на противоположенный раз в секунду,замучался уже... Сейчас у меня он у меня меняет состояние очень часто т.к. 7372800/1024=7200,7200/256=28,125.
Пишу в CVAVR
Спасибо за помощь!

Re: Timer 0 atmega644

Добавлено: Чт мар 14, 2013 17:17:51
oleg110592
Сделайте програмный делитель на 28

Код: Выделить всё

unsigned char counter=0;
unsigned char second=0;
//-----------------------------------------
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
  if(++counter==28)
  {
     counter=0;
     second++;
     PORTB=~PORTB;
  }
}

Re: Timer 0 atmega644

Добавлено: Чт мар 14, 2013 17:24:08
Аlex
Настроить предделитель таймера так, чтобы он переполнялся с целой частотой (без десятых, сотых и т.д...), добавить счётчик (переменную) и декрементировать её, переустанавливая при нулевом значении.

ЗЫ: Опередили :)

Re: Timer 0 atmega644

Добавлено: Чт мар 14, 2013 19:48:23
Сериг
Спасибо огромное!буду пробовать,о результатах отпишусь! :)

Re: Timer 0 atmega644

Добавлено: Чт мар 14, 2013 21:19:32
ILYAUL
Интересно , зачем ему секунда? Если для часов так она там не нужна. Кстати 8-битный таймер в AVR может делить на 512

Re: Timer 0 atmega644

Добавлено: Чт мар 14, 2013 21:38:54
Сериг
Протестил,светодиод даже не планирует моргать :(
Хотя порт выставлен как выход. Еще компилятор ругается что переменная counter не используется...

Re: Timer 0 atmega644

Добавлено: Чт мар 14, 2013 21:52:42
Аlex
Сериг, эмоции иногда нужно кодом подкреплять :)

Re: Timer 0 atmega644

Добавлено: Чт мар 14, 2013 23:37:36
Сериг
прошу прощения! :)

Код: Выделить всё

#include <mega644a.h>

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{ unsigned char counter = 0, second = 0;
// Place your code here
if (++counter == 28) {
        counter = 0;
        second++;
        PORTB.3=~PORTB.3;
};

}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

PORTB=0x00;
DDRB=0x08;


// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 7,200 kHz
// Mode: Normal top=0xFF
// OC0A output: Toggle on compare match
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x01;


ACSR=0x80;
ADCSRB=0x00;
DIDR1=0x00;


// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here

      }
}

Re: Timer 0 atmega644

Добавлено: Пт мар 15, 2013 00:48:03
Аlex
Еще компилятор ругается что переменная counter не используется...
Дык, конечно же будет ругаться. Он считает, что она бесполезна. При заходе в функцию Вы её обнуляете, потом инкремент с проверкой на 28, естественно, она никогда не будет равна 28. Она даже больше 1 никогда не будет :) По этому компиль и материться...
Сделайте её глобальной, либо static.

Re: Timer 0 atmega644

Добавлено: Пт мар 15, 2013 01:12:32
Сериг
спасибо большое!мыргает! :)) Можно попросить пояснить пару строк? static int-то есть,эти переменные будут иметь глобальное время жизни?как понять глобальное время жизни?
и еще: что означает эта строка ++counter,это все равно что counter++?
Спасибо большое,очень приятно что помогли! :)

Re: Timer 0 atmega644

Добавлено: Пт мар 15, 2013 05:50:29
ds1307
++counter==28 Означает, что сначала прибавили, а потом сравнили. Основы однако Си.
Про переменные на форуме хороший цикл был.
У меня другой вопрос возник: А, что с вашим кодом произойдет, когда "second" переполнится?
Пока код маленький, вы этого не замечаете... А вот когда он станет большой и периодически будет почему-то сбиваться...

Re: Timer 0 atmega644

Добавлено: Пт мар 15, 2013 07:31:31
oleg110592
ds1307 писал(а):+ А, что с вашим кодом произойдет, когда "second" переполнится?
Пока код маленький, вы этого не замечаете... А вот когда он станет большой и периодически будет почему-то сбиваться...
А ничего не произойдет - после того как second станет = 255, в следующем прерывании, после second++, second будет равна нулю и т.д.
Везде использую в коде second - очень удобно, например в такой конструкции:

Код: Выделить всё

second=0;
while( rx_data !=0x0D )
{
  if( second > 2) return -1;
}
да и еще удобно выводить значение second на индикатор при тестировании новой разработки.

Re: Timer 0 atmega644

Добавлено: Пт мар 15, 2013 10:20:48
Сериг
ds1307 писал(а):++counter==28 Означает, что сначала прибавили, а потом сравнили. Основы однако Си.
Про переменные на форуме хороший цикл был.
У меня другой вопрос возник: А, что с вашим кодом произойдет, когда "second" переполнится?
Пока код маленький, вы этого не замечаете... А вот когда он станет большой и периодически будет почему-то сбиваться...
Именно,что sekond будет за полнятся по кругу. Вообще эту переменную я убрал,она не выполняет ни каких функций в данном коде.
Спасибо за помощь,всем кто откликнулся! Я думаю вопросы еще будут.