Timer 0 atmega644

Обсуждаем контроллеры компании Atmel.
Ответить
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

Всем привет.
Вообщем запускаю таймер,с перед делителем тактовой частоты(7,372800 гц) 1024,итого таймер тактируется от 7200 Герц. Максимум до которого может досчитать таймер-это 255,подскажите как мне сделать что бы таймер менял состояние вывода на противоположенный раз в секунду,замучался уже... Сейчас у меня он у меня меняет состояние очень часто т.к. 7372800/1024=7200,7200/256=28,125.
Пишу в CVAVR
Спасибо за помощь!
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение 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;
  }
}
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Настроить предделитель таймера так, чтобы он переполнялся с целой частотой (без десятых, сотых и т.д...), добавить счётчик (переменную) и декрементировать её, переустанавливая при нулевом значении.

ЗЫ: Опередили :)
Последний раз редактировалось Аlex Чт мар 14, 2013 17:25:53, всего редактировалось 1 раз.
Причина: -
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

Спасибо огромное!буду пробовать,о результатах отпишусь! :)
Реклама
Эиком - электронные компоненты и радиодетали
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Интересно , зачем ему секунда? Если для часов так она там не нужна. Кстати 8-битный таймер в AVR может делить на 512
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

Протестил,светодиод даже не планирует моргать :(
Хотя порт выставлен как выход. Еще компилятор ругается что переменная counter не используется...
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Сериг, эмоции иногда нужно кодом подкреплять :)
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

прошу прощения! :)

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

#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

      }
}
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Еще компилятор ругается что переменная counter не используется...
Дык, конечно же будет ругаться. Он считает, что она бесполезна. При заходе в функцию Вы её обнуляете, потом инкремент с проверкой на 28, естественно, она никогда не будет равна 28. Она даже больше 1 никогда не будет :) По этому компиль и материться...
Сделайте её глобальной, либо static.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

спасибо большое!мыргает! :)) Можно попросить пояснить пару строк? static int-то есть,эти переменные будут иметь глобальное время жизни?как понять глобальное время жизни?
и еще: что означает эта строка ++counter,это все равно что counter++?
Спасибо большое,очень приятно что помогли! :)
Грызет канифоль
Аватара пользователя
Сообщения: 260
Зарегистрирован: Чт янв 13, 2011 18:54:29
Откуда: Минск

Сообщение ds1307 »

++counter==28 Означает, что сначала прибавили, а потом сравнили. Основы однако Си.
Про переменные на форуме хороший цикл был.
У меня другой вопрос возник: А, что с вашим кодом произойдет, когда "second" переполнится?
Пока код маленький, вы этого не замечаете... А вот когда он станет большой и периодически будет почему-то сбиваться...
Учиться, учиться, ...
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

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

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

second=0;
while( rx_data !=0x0D )
{
  if( second > 2) return -1;
}
да и еще удобно выводить значение second на индикатор при тестировании новой разработки.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

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

Вернуться в «AVR»