roboforum.ru

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

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

Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать.
Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил.
Робот своими руками. Самодельный робот.

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

Сообщение EasyTech » 14 фев 2012, 16:04

Добрый день!
Подскажите пожалуста как заставить таймер тикать 1 секунду и делать какое то действие после этого. Интересует формула расчета.
EasyTech
 
Сообщения: 239
Зарегистрирован: 15 май 2011, 19:19
Откуда: Ростов-на-Дону
Skype: levanchik322
прог. языки: WinAVR C, C#, HTML+СSS.
ФИО: Лёва

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

Сообщение HarryStar » 14 фев 2012, 16:36

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

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

Что бы отсчитать 1 секунду нужно отсчитать соотв 15625 тиков. Т.о. если у нас прерывание по переполнению, то ставим начальное значение таймера в 65535-15625 = 49910 = 0xC2F6 в шестнадцатеричном представлении.
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

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

Сообщение EasyTech » 14 фев 2012, 17:58

Что то слишком легко, но я попробую.
А от режима таймера не зависит формула расчета времени?
ПРосто все пишут по своему этот расчет :(
EasyTech
 
Сообщения: 239
Зарегистрирован: 15 май 2011, 19:19
Откуда: Ростов-на-Дону
Skype: levanchik322
прог. языки: WinAVR C, C#, HTML+СSS.
ФИО: Лёва

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

Сообщение mikkey finn » 14 фев 2012, 19:30

как удобнее так и пишут, можно на совпадение повесить, будет другая формула. Главное - принцип расчета от частоты кварца и предделителя таймера. Можно часовой кварц повесить, если сильно захотеть, тогда другая арифметика будет.
mikkey finn
 
Сообщения: 104
Зарегистрирован: 09 авг 2011, 17:15
Откуда: Волжский

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();}
}
EasyTech
 
Сообщения: 239
Зарегистрирован: 15 май 2011, 19:19
Откуда: Ростов-на-Дону
Skype: levanchik322
прог. языки: WinAVR C, C#, HTML+СSS.
ФИО: Лёва

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

Сообщение Romikgy » 21 фев 2012, 11:28

имхо
лучше читать в глобальный буфер ... а в основном цикле проверять правильность данных.... плюс в вашем коде i увеличится только в случае UDR == 'q' в других случаях будет всегда 0....
die Wahrheit ist irgendwo da draußen
Аватара пользователя
Romikgy
 
Сообщения: 750
Зарегистрирован: 15 ноя 2009, 13:37
Откуда: Porto Franco "Odessa"

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) {}
}
EasyTech
 
Сообщения: 239
Зарегистрирован: 15 май 2011, 19:19
Откуда: Ростов-на-Дону
Skype: levanchik322
прог. языки: WinAVR C, C#, HTML+СSS.
ФИО: Лёва


Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11