Страница 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 будет за полнятся по кругу. Вообще эту переменную я убрал,она не выполняет ни каких функций в данном коде.
Спасибо за помощь,всем кто откликнулся! Я думаю вопросы еще будут.