roboforum.ru

Технический форум по робототехнике.

работа с таймером

работа с таймером

EasyTech » 14 фев 2012, 16:04

Добрый день!
Подскажите пожалуста как заставить таймер тикать 1 секунду и делать какое то действие после этого. Интересует формула расчета.

Re: работа с таймером

HarryStar » 14 фев 2012, 16:36

Ну например.
16Мгц частота кварца
16-ти битный таймер.

Максимальный делитель в авр, если я правильно помню - 1024.
Т.о. самое медленное таймер может тикать 16000000/1024 = 15625 Гц - вот с такой частотой.

Что бы отсчитать 1 секунду нужно отсчитать соотв 15625 тиков. Т.о. если у нас прерывание по переполнению, то ставим начальное значение таймера в 65535-15625 = 49910 = 0xC2F6 в шестнадцатеричном представлении.

Re: работа с таймером

EasyTech » 14 фев 2012, 17:58

Что то слишком легко, но я попробую.
А от режима таймера не зависит формула расчета времени?
ПРосто все пишут по своему этот расчет :(

Re: работа с таймером

mikkey finn » 14 фев 2012, 19:30

как удобнее так и пишут, можно на совпадение повесить, будет другая формула. Главное - принцип расчета от частоты кварца и предделителя таймера. Можно часовой кварц повесить, если сильно захотеть, тогда другая арифметика будет.

Re: работа с таймером

EasyTech » 21 фев 2012, 07:44

Привет друзья!
Я тут собираю кодовый замок и у меня возник вопрос, который я что то не могу решить.
Я ввожу данные в массив и когда он равен 4 символам я начинаю его проверять. Как вложить символы я понял, а вот как и прочитать не могу понять.
я тут просто накидал пример, тут все понятно с ним, я его для наглядности написал:
Когда буффер = 4 символам начинаю его читать, я знаю что его нужно читать в цикле типа for, а вот как не знаю, помогите пожалуйста!
Код: Выделить всёРазвернуть
ISR(USART_RXC_vect) {
unsigned char symbol = UDR;
unsigned char buffer[4];
uint8_t i = 0;
if (symbol=='q') {buffer[i]=symbol; i++;}
else if (symbol == 'w') {buffer[i]=symbol; i++;}
else if (symbol == 'e') {buffer[i]=symbol; i++;}
else if (symbol == 'r') {buffer[i]=symbol; i++;}
else if (i==4) {ReadBuffer();}
}

Re: работа с таймером

Romikgy » 21 фев 2012, 11:28

имхо
лучше читать в глобальный буфер ... а в основном цикле проверять правильность данных.... плюс в вашем коде i увеличится только в случае UDR == 'q' в других случаях будет всегда 0....

Re: работа с таймером

EasyTech » 24 фев 2012, 19:44

Привет всем !
Я пытаюсь запустить таймер0 на меге8 с частотой 8МГц, что то не получается. пересмотрел все, вроде всё верно... подскажите пожалуйста где ошибка. ПО идее когда проходит 32мс загорается светодиод... а он не хочет гореть:(
Код: Выделить всёРазвернуть
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define CS00 0
#define CS02 2
#define TOIE0 0
#define TOV0 0
// Так как таймер0 тикает до значения 255, то >255 выставить нельзя
// Я выставляю значение 0xFA  равное 32мс.
// При подсчете до 0xFA вызывается прерывание и загорается светодиод
ISR(TIM0_OVF_vect) {
TCNT0=0xFA;
PORTD=0xff;
}
void init_timer0() {
TCCR0|=(1<<CS02)|(1<<CS00);
TIMSK|=(1<<TOIE0);
TIFR|=(1<<TOV0);
SREG|=(1<<7);
TCNT0=0xFA;
}

int main (void) {
init_timer0();
DDRD=0xff;
PORTD=0x00;
sei();
while(1) {}
}


Rambler\'s Top100 Mail.ru counter