Цифровой одометр на Atmega8

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Аватара пользователя
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Сообщение Antifritz »

А вот в спидометре лучше замерять интервалы между импульсами (используем внешн. прерывания). Если мерять к-во импульсов за период будет большая погрешность.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай

Сообщение yur4ik »

Antifritz писал(а):Итак:
Timer/Counter0 может тактироваться только от ножки T0(от Т1 уже не может) и от тактовой МК+ предделитель
Timer/Counter1 может тактироваться только от ножки T1(от Т0 уже не может) и тактовой МК+ предделитель?
Timer/Counter1 может тактироваться только от тактовой МК либо от внешнего кварца на ногах TOSC, при условии что сам МК тактируется внутренним RC генератором.
Можно узнать для чего какой таймер планируется использовать?

Кварц типа сам появляется если выбрано тактирование от внешнего кварца, никаких генераторов и кварцов в протеусе цеплять не нужно все частоты указываются в свойствах МК(тактовая и TOSC)
Timer/Counter1 это TIMER1? блин я в этих названия уже запутался полностью :roll: если да то хотел чтобы считал до 1 секнды и потом выводил на экран скорость и частоту
Нельзя всё знать, достаточно понимать.
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай

Сообщение yur4ik »

Antifritz писал(а):А вот в спидометре лучше замерять интервалы между импульсами (используем внешн. прерывания). Если мерять к-во импульсов за период будет большая погрешность.
то есть использовать захват?
Нельзя всё знать, достаточно понимать.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай

Сообщение yur4ik »

Antifritz, вы уж не обижайтесь на меня пожалуйста, прост и так новичек с мк, а еще уже не работал с мк уже с год наверно. че знал забыл уже :(
Нельзя всё знать, достаточно понимать.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Аватара пользователя
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Сообщение Antifritz »

Названия из даташита. Если будет часовой кварц на TOSCах, то думаю можно запустить МК от внутр. RC генератора на 8МГц и использовать таймер2 для отсчета всяких там интервалов или он для SPI нужен? Ну а таймером1 или 0 считать импульсы для тахометра. Для спидометра таймер выделять не нужно: получили прерывание(ноги INT0/INT1)-посмотрели "время" получили еще одно- опять посмотрели и высчитали разницу.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай

Сообщение yur4ik »

Antifritz писал(а):Названия из даташита. Если будет часовой кварц на TOSCах, то думаю можно запустить МК от внутр. RC генератора на 8МГц и использовать таймер2 для отсчета всяких там интервалов или он для SPI нужен? Ну а таймером1 или 0 считать импульсы для тахометра. Для спидометра таймер выделять не нужно: получили прерывание(ноги INT0/INT1)-посмотрели "время" получили еще одно- опять посмотрели и высчитали разницу.
я поначалу как раз и хотел использовать таймер 2 как таймер на 1 секунду а вот таймер0 как обычный счетчик, а таймер1 режим захвата.
а вот смотри основной цикл и таймеры они отдельно друг от друга работают или совместно?
похожу когда я инцилизирую таймер2 то он работает как от часового кварца потому что когда отрубаю его спи то работает
Нельзя всё знать, достаточно понимать.
Контактная информация:
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Сообщение Antifritz »

Таймеры-это типа вообще отдельные устройства, работают сами по себе, единственное что они не могут работать с частотой, которая выше тактовой(например если такую подать на Т0/Т1/ТОSC), но я думаю - это пока не актуально. Насчет СПИ - без понятия, а может выкинуть его вообще? Перечитал еще раз- не понял, а что со СПИ не так?
Вымогатель припоя
Аватара пользователя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай

Сообщение yur4ik »

Antifritz писал(а):Таймеры-это типа вообще отдельные устройства, работают сами по себе, единственное что они не могут работать с частотой, которая выше тактовой(например если такую подать на Т0/Т1/ТОSC), но я думаю - это пока не актуально. Насчет СПИ - без понятия, а может выкинуть его вообще? Перечитал еще раз- не понял, а что со СПИ не так?
нее без спи не удобно будет считай на скоко быстрее можно работать с дисплеями :) я ща вот запустил таймер1 в режиме захвата а таймер0 в режиме счетчика захват норм работает а счетчик не очень
все вроде добил частота не скачет бывает на -1Гц а потом норм и то редкий раз
хотя не норм погрешность в 30 об/мин над как то убавить :) хоть я и не буду выводить на 7 сегментик последнюю цифру чтобы ночью не отвлекало, но могут быть и прыжки с 166(1660 об/мин) на 171(1710 об/мин) к примеру

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

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; 
Нельзя всё знать, достаточно понимать.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай

Сообщение yur4ik »

как можно улучшить алгоритм чтобы не не было +-1Гц=(целых аж 30об/мин) режим захвата же норм работает(спидометр) может ну этот алгоритм временных ворот? может лучше запустить таймер и пришел сигнал взял значение таймера следующий импульс опять значение таймера отнял и вот он период. или тоже самое будет?
Нельзя всё знать, достаточно понимать.
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Сообщение Antifritz »

ДВС не такой уже и супер-пупер прибор, там и так частота гуляет тем более в большинстве случаев будет не целое число, а например 70,3Гц. Погрешность 1Гц появляется из-за того, что имульсы приходят не синхронно с работой таймера. А там именно и+1Гц и -1Гц (относительно правильной частоты) или только в одну сторону плывет? Когда-то делал частотомер, так там погрешность возникала еще и из-за того, что электронике нужно некоторое время чтобы включить таймер и считать/сбросить значение, решилось путем деления полученного значения на некоторую константу. Но одно дело измерять частоту кварца на 16Мгц, а другое дело ДВС, у которого частота на оооочень много меньшая. На стрелочных тахометрах цена деления 100об/мин, и то стрелка дергается, а вам +/-30 много. Вы же множите частоту на 60, так что цена деления не может быть меньше 60, так что скрывайте две последних цифры, пишите х100 и не парьтесь.
Вымогатель припоя
Аватара пользователя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай

Сообщение yur4ik »

Antifritz писал(а):ДВС не такой уже и супер-пупер прибор, там и так частота гуляет тем более в большинстве случаев будет не целое число, а например 70,3Гц. Погрешность 1Гц появляется из-за того, что имульсы приходят не синхронно с работой таймера. А там именно и+1Гц и -1Гц (относительно правильной частоты) или только в одну сторону плывет? Когда-то делал частотомер, так там погрешность возникала еще и из-за того, что электронике нужно некоторое время чтобы включить таймер и считать/сбросить значение, решилось путем деления полученного значения на некоторую константу. Но одно дело измерять частоту кварца на 16Мгц, а другое дело ДВС, у которого частота на оооочень много меньшая. На стрелочных тахометрах цена деления 100об/мин, и то стрелка дергается, а вам +/-30 много. Вы же множите частоту на 60, так что цена деления не может быть меньше 60, так что скрывайте две последних цифры, пишите х100 и не парьтесь.
-1Гц допустим 1500 1500 1500 ... 1470 1500 1500 1470
скрывать 2 последние цифры не очень хочется. собираюсь скрыть 1 младший разряд чтобы ночью не мешал. но вот в спидометре использую режим захвата но там все четко работает а тут не очень. щас вот есть свободное время буду пробовать сделать так сигнал поступил считал значение таймера, пришел второй сигнал считал значение таймера и потом уже частоту находить. также работает режим захвата?
Нельзя всё знать, достаточно понимать.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай

Сообщение yur4ik »

Antifritz писал(а): Для спидометра таймер выделять не нужно: получили прерывание(ноги INT0/INT1)-посмотрели "время" получили еще одно- опять посмотрели и высчитали разницу.
а как получить значение таймера? использовать доп переменную?
Нельзя всё знать, достаточно понимать.
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Сообщение Antifritz »

yur4ik писал(а):
Antifritz писал(а): Для спидометра таймер выделять не нужно: получили прерывание(ноги INT0/INT1)-посмотрели "время" получили еще одно- опять посмотрели и высчитали разницу.
а как получить значение таймера? использовать доп переменную?
Типа того, сохранять значение таймера во время первого прерывания и сравнивать с тем, что во время следующего. Не забываем учитывать переполнения таймера.
Вымогатель припоя
Аватара пользователя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай

Сообщение yur4ik »

Antifritz писал(а):
yur4ik писал(а): а как получить значение таймера? использовать доп переменную?
Типа того, сохранять значение таймера во время первого прерывания и сравнивать с тем, что во время следующего. Не забываем учитывать переполнения таймера.
не не не... я похоже не совсем точно поставил вопрос :) возможно ли не заводя новую переменную узнать значение таймера? или значение таймера хранится в TCNTх? и вообще правильно ли я понимаю алгоритм того что нужно организовать. заводим переменную допустим tim и в таймере увеличиваем ее значение на 1 как пришел сигнал допустим на INT0 считываем значение переменной tim и обнуляем tim и второй раз так же и находим разницу. так ли это?
Нельзя всё знать, достаточно понимать.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай

Сообщение yur4ik »

аааа я ща повешусь :kill:, сделал так:

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

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;
}
}
работает, но если подать частоту свыше 200Гц то врет на 25-40Гц но это скорее всего из-за того что не учитываю переполнение, но в таком виде начинает шалить режим захвата timer1, например подавая сигнал частотою 269 Гц он показывает 279 или 289 Гц
если все это выкинуть из EXT_INT0 и засунуть в основной бесконечный цикл

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

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; 
тогда вот захват timer1 работает нормально, а мой так скажем режим захвата показывает какую то белеберду что то типа 5499, 8888,20,1020 и т.п. подавая разную частоту на вход числа уже другие . ЧТО ЭТО МОЖЕТ БЫТЬ И КАК ЭТО РЕШИТЬ?
Нельзя всё знать, достаточно понимать.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай

Сообщение yur4ik »

ааа вроде понял свой касяк зав попробую исправить :)
Нельзя всё знать, достаточно понимать.
Контактная информация:
Встал на лапы
Сообщения: 101
Зарегистрирован: Ср май 09, 2012 23:32:22
Откуда: Культурная столица

Сообщение Le_Fleurs »

Ребята ну что как успехи запустить смогли? А схемку в lay не подкинете? И фото готового устройства?
Встал на лапы
Аватара пользователя
Сообщения: 142
Зарегистрирован: Сб дек 24, 2011 12:39:03

Сообщение CyberVad »

Le_Fleurs писал(а):Ребята ну что как успехи запустить смогли? А схемку в lay не подкинете? И фото готового устройства?
А вот зацените-ка моё творение, делал сыну на велек: http://vk.com/album19027586_159160096
Вышел из себя.
Пришел в себя.
Ушел в себя.
И решил больше сегодня никуда не ходить
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Нифига себе бортовой компьютер, я вот тоже думал с дисплеем 16х2 сделать только сомневался, что большеват будет.


Тема так то вообще супер.Ухохотался над кодом.Как чувак код в протеусе гоняет, когда у него прерывание в майне оформлено.Как только вообще компиляция прошла?
Ржал над тем, что 1000 импульсов в секунду *60 это 1000оборотов в минуту для одноцилиндрового двигателя. Похоже еще и двухтактного :)))
В поисках истины человек развивается.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай

Сообщение yur4ik »

vitalik_1984 писал(а):Нифига себе бортовой компьютер, я вот тоже думал с дисплеем 16х2 сделать только сомневался, что большеват будет.


Тема так то вообще супер.Ухохотался над кодом.Как чувак код в протеусе гоняет, когда у него прерывание в майне оформлено.Как только вообще компиляция прошла?
Ржал над тем, что 1000 импульсов в секунду *60 это 1000оборотов в минуту для одноцилиндрового двигателя. Похоже еще и двухтактного :)))
ну посоветуй тогда как надо :)
Нельзя всё знать, достаточно понимать.
Контактная информация:
Ответить

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