Re: Цифровой одометр на Atmega8
Добавлено: Вс ноя 20, 2011 16:28:14
А вот в спидометре лучше замерять интервалы между импульсами (используем внешн. прерывания). Если мерять к-во импульсов за период будет большая погрешность.
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Timer/Counter1 это TIMER1? блин я в этих названия уже запутался полностьюAntifritz писал(а):Итак:
Timer/Counter0 может тактироваться только от ножки T0(от Т1 уже не может) и от тактовой МК+ предделитель
Timer/Counter1 может тактироваться только от ножки T1(от Т0 уже не может) и тактовой МК+ предделитель?
Timer/Counter1 может тактироваться только от тактовой МК либо от внешнего кварца на ногах TOSC, при условии что сам МК тактируется внутренним RC генератором.
Можно узнать для чего какой таймер планируется использовать?
Кварц типа сам появляется если выбрано тактирование от внешнего кварца, никаких генераторов и кварцов в протеусе цеплять не нужно все частоты указываются в свойствах МК(тактовая и TOSC)
то есть использовать захват?Antifritz писал(а):А вот в спидометре лучше замерять интервалы между импульсами (используем внешн. прерывания). Если мерять к-во импульсов за период будет большая погрешность.
я поначалу как раз и хотел использовать таймер 2 как таймер на 1 секунду а вот таймер0 как обычный счетчик, а таймер1 режим захвата.Antifritz писал(а):Названия из даташита. Если будет часовой кварц на TOSCах, то думаю можно запустить МК от внутр. RC генератора на 8МГц и использовать таймер2 для отсчета всяких там интервалов или он для SPI нужен? Ну а таймером1 или 0 считать импульсы для тахометра. Для спидометра таймер выделять не нужно: получили прерывание(ноги INT0/INT1)-посмотрели "время" получили еще одно- опять посмотрели и высчитали разницу.
нее без спи не удобно будет считай на скоко быстрее можно работать с дисплеямиAntifritz писал(а):Таймеры-это типа вообще отдельные устройства, работают сами по себе, единственное что они не могут работать с частотой, которая выше тактовой(например если такую подать на Т0/Т1/ТОSC), но я думаю - это пока не актуально. Насчет СПИ - без понятия, а может выкинуть его вообще? Перечитал еще раз- не понял, а что со СПИ не так?
Код: Выделить всё
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0xFE;
rp++;
}
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1 = 0;
speed=0;
}
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
//2 000 000 Гц / 8 (TCCR1B=0x02;//clk/8) = 250 000 - чтобы досчитать до 1 сек
TCNT1 = 0;
brp=ICR1; //считываем значение регистра
if(brp!=0){
speed=250000/brp; //подготавливаем среднее значение
}
}
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
rpw++;
if(rpw==61){
TCCR2=0x00;
rpw=0;
rps=rp*30;
rp=0;
TCCR2=0x06;
}
}
void main(void)
{
PORTB=0;
DDRB=0x2C; //Настраиваем порт для SPI
PORTC=0x01;
DDRC=0x00;
PORTC=0x00;
DDRC=0x00;
TCCR0=0x06;
TCNT0=0xFE;
TCCR1A=0x00;
TCCR1B=0x02;
GICR|=0x80;
MCUCR=0x08;
GIFR=0x80;
ASSR=0x00;
TCCR2=0x06;
TCNT2=0x00;
OCR2=0x00;
TIMSK=0x65;
ACSR=0x80; //Отключаем компаратор
//Включаем SPI
//Биты будем отправлять LSB-MSB, т.е. от младших к старшим
SPCR=0x7C;
SPSR=0x00;
-1Гц допустим 1500 1500 1500 ... 1470 1500 1500 1470Antifritz писал(а):ДВС не такой уже и супер-пупер прибор, там и так частота гуляет тем более в большинстве случаев будет не целое число, а например 70,3Гц. Погрешность 1Гц появляется из-за того, что имульсы приходят не синхронно с работой таймера. А там именно и+1Гц и -1Гц (относительно правильной частоты) или только в одну сторону плывет? Когда-то делал частотомер, так там погрешность возникала еще и из-за того, что электронике нужно некоторое время чтобы включить таймер и считать/сбросить значение, решилось путем деления полученного значения на некоторую константу. Но одно дело измерять частоту кварца на 16Мгц, а другое дело ДВС, у которого частота на оооочень много меньшая. На стрелочных тахометрах цена деления 100об/мин, и то стрелка дергается, а вам +/-30 много. Вы же множите частоту на 60, так что цена деления не может быть меньше 60, так что скрывайте две последних цифры, пишите х100 и не парьтесь.
а как получить значение таймера? использовать доп переменную?Antifritz писал(а): Для спидометра таймер выделять не нужно: получили прерывание(ноги INT0/INT1)-посмотрели "время" получили еще одно- опять посмотрели и высчитали разницу.
Типа того, сохранять значение таймера во время первого прерывания и сравнивать с тем, что во время следующего. Не забываем учитывать переполнения таймера.yur4ik писал(а):а как получить значение таймера? использовать доп переменную?Antifritz писал(а): Для спидометра таймер выделять не нужно: получили прерывание(ноги INT0/INT1)-посмотрели "время" получили еще одно- опять посмотрели и высчитали разницу.
не не не... я похоже не совсем точно поставил вопросAntifritz писал(а):Типа того, сохранять значение таймера во время первого прерывания и сравнивать с тем, что во время следующего. Не забываем учитывать переполнения таймера.yur4ik писал(а): а как получить значение таймера? использовать доп переменную?
Код: Выделить всё
interrupt [EXT_INT0] void ext_int0_isr(void)
{
rp++;
if (rp==1){rp1=TCNT0;TCNT0=0;}
if (rp==2){rp2=TCNT0;TCNT0=0;}
if (rp==3){
rp3=rp1-rp2;
rps=1953/rp3;
rp=0;
}
}
Код: Выделить всё
interrupt [EXT_INT0] void ext_int0_isr(void)
{
rp++;
}
.........
#asm("sei")
while(1){
if (rp==1){rp1=TCNT0;TCNT0=0;}
if (rp==2){rp2=TCNT0;TCNT0=0;}
if (rp==3){
rp3=rp1-rp2;
rps=1953/rp3;
rp=0;
}
show_dig();
}
Код: Выделить всё
PORTB=0;
DDRB=0x2C; //Настраиваем порт для SPI
PORTC=0x01;
DDRC=0x00;
PORTC=0x00;
DDRC=0x00;
TCCR0=0x05;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x02;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
GICR|=0x40;
MCUCR=0x02;
GIFR=0x40;
TIMSK=0x25;
ACSR=0x80; //Отключаем компаратор
//Включаем SPI
//Биты будем отправлять LSB-MSB, т.е. от младших к старшим
SPCR=0x7C;
SPSR=0x00; А вот зацените-ка моё творение, делал сыну на велек: http://vk.com/album19027586_159160096Le_Fleurs писал(а):Ребята ну что как успехи запустить смогли? А схемку в lay не подкинете? И фото готового устройства?
ну посоветуй тогда как надоvitalik_1984 писал(а):Нифига себе бортовой компьютер, я вот тоже думал с дисплеем 16х2 сделать только сомневался, что большеват будет.
Тема так то вообще супер.Ухохотался над кодом.Как чувак код в протеусе гоняет, когда у него прерывание в майне оформлено.Как только вообще компиляция прошла?
Ржал над тем, что 1000 импульсов в секунду *60 это 1000оборотов в минуту для одноцилиндрового двигателя. Похоже еще и двухтактного