Страница 8 из 9

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

Добавлено: Вс ноя 20, 2011 16:28:14
Antifritz
А вот в спидометре лучше замерять интервалы между импульсами (используем внешн. прерывания). Если мерять к-во импульсов за период будет большая погрешность.

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

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

Кварц типа сам появляется если выбрано тактирование от внешнего кварца, никаких генераторов и кварцов в протеусе цеплять не нужно все частоты указываются в свойствах МК(тактовая и TOSC)
Timer/Counter1 это TIMER1? блин я в этих названия уже запутался полностью :roll: если да то хотел чтобы считал до 1 секнды и потом выводил на экран скорость и частоту

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

Добавлено: Вс ноя 20, 2011 16:39:39
yur4ik
Antifritz писал(а):А вот в спидометре лучше замерять интервалы между импульсами (используем внешн. прерывания). Если мерять к-во импульсов за период будет большая погрешность.
то есть использовать захват?

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

Добавлено: Вс ноя 20, 2011 16:41:23
yur4ik
Antifritz, вы уж не обижайтесь на меня пожалуйста, прост и так новичек с мк, а еще уже не работал с мк уже с год наверно. че знал забыл уже :(

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

Добавлено: Вс ноя 20, 2011 16:45:38
Antifritz
Названия из даташита. Если будет часовой кварц на TOSCах, то думаю можно запустить МК от внутр. RC генератора на 8МГц и использовать таймер2 для отсчета всяких там интервалов или он для SPI нужен? Ну а таймером1 или 0 считать импульсы для тахометра. Для спидометра таймер выделять не нужно: получили прерывание(ноги INT0/INT1)-посмотрели "время" получили еще одно- опять посмотрели и высчитали разницу.

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

Добавлено: Вс ноя 20, 2011 16:49:43
yur4ik
Antifritz писал(а):Названия из даташита. Если будет часовой кварц на TOSCах, то думаю можно запустить МК от внутр. RC генератора на 8МГц и использовать таймер2 для отсчета всяких там интервалов или он для SPI нужен? Ну а таймером1 или 0 считать импульсы для тахометра. Для спидометра таймер выделять не нужно: получили прерывание(ноги INT0/INT1)-посмотрели "время" получили еще одно- опять посмотрели и высчитали разницу.
я поначалу как раз и хотел использовать таймер 2 как таймер на 1 секунду а вот таймер0 как обычный счетчик, а таймер1 режим захвата.
а вот смотри основной цикл и таймеры они отдельно друг от друга работают или совместно?
похожу когда я инцилизирую таймер2 то он работает как от часового кварца потому что когда отрубаю его спи то работает

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

Добавлено: Вс ноя 20, 2011 16:54:55
Antifritz
Таймеры-это типа вообще отдельные устройства, работают сами по себе, единственное что они не могут работать с частотой, которая выше тактовой(например если такую подать на Т0/Т1/ТОSC), но я думаю - это пока не актуально. Насчет СПИ - без понятия, а может выкинуть его вообще? Перечитал еще раз- не понял, а что со СПИ не так?

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

Добавлено: Вс ноя 20, 2011 17:10:33
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; 

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

Добавлено: Пн ноя 21, 2011 13:17:43
yur4ik
как можно улучшить алгоритм чтобы не не было +-1Гц=(целых аж 30об/мин) режим захвата же норм работает(спидометр) может ну этот алгоритм временных ворот? может лучше запустить таймер и пришел сигнал взял значение таймера следующий импульс опять значение таймера отнял и вот он период. или тоже самое будет?

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

Добавлено: Ср ноя 23, 2011 15:34:20
Antifritz
ДВС не такой уже и супер-пупер прибор, там и так частота гуляет тем более в большинстве случаев будет не целое число, а например 70,3Гц. Погрешность 1Гц появляется из-за того, что имульсы приходят не синхронно с работой таймера. А там именно и+1Гц и -1Гц (относительно правильной частоты) или только в одну сторону плывет? Когда-то делал частотомер, так там погрешность возникала еще и из-за того, что электронике нужно некоторое время чтобы включить таймер и считать/сбросить значение, решилось путем деления полученного значения на некоторую константу. Но одно дело измерять частоту кварца на 16Мгц, а другое дело ДВС, у которого частота на оооочень много меньшая. На стрелочных тахометрах цена деления 100об/мин, и то стрелка дергается, а вам +/-30 много. Вы же множите частоту на 60, так что цена деления не может быть меньше 60, так что скрывайте две последних цифры, пишите х100 и не парьтесь.

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

Добавлено: Ср ноя 23, 2011 17:25:13
yur4ik
Antifritz писал(а):ДВС не такой уже и супер-пупер прибор, там и так частота гуляет тем более в большинстве случаев будет не целое число, а например 70,3Гц. Погрешность 1Гц появляется из-за того, что имульсы приходят не синхронно с работой таймера. А там именно и+1Гц и -1Гц (относительно правильной частоты) или только в одну сторону плывет? Когда-то делал частотомер, так там погрешность возникала еще и из-за того, что электронике нужно некоторое время чтобы включить таймер и считать/сбросить значение, решилось путем деления полученного значения на некоторую константу. Но одно дело измерять частоту кварца на 16Мгц, а другое дело ДВС, у которого частота на оооочень много меньшая. На стрелочных тахометрах цена деления 100об/мин, и то стрелка дергается, а вам +/-30 много. Вы же множите частоту на 60, так что цена деления не может быть меньше 60, так что скрывайте две последних цифры, пишите х100 и не парьтесь.
-1Гц допустим 1500 1500 1500 ... 1470 1500 1500 1470
скрывать 2 последние цифры не очень хочется. собираюсь скрыть 1 младший разряд чтобы ночью не мешал. но вот в спидометре использую режим захвата но там все четко работает а тут не очень. щас вот есть свободное время буду пробовать сделать так сигнал поступил считал значение таймера, пришел второй сигнал считал значение таймера и потом уже частоту находить. также работает режим захвата?

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

Добавлено: Пн янв 02, 2012 21:27:02
yur4ik
Antifritz писал(а): Для спидометра таймер выделять не нужно: получили прерывание(ноги INT0/INT1)-посмотрели "время" получили еще одно- опять посмотрели и высчитали разницу.
а как получить значение таймера? использовать доп переменную?

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

Добавлено: Пн янв 02, 2012 23:08:27
Antifritz
yur4ik писал(а):
Antifritz писал(а): Для спидометра таймер выделять не нужно: получили прерывание(ноги INT0/INT1)-посмотрели "время" получили еще одно- опять посмотрели и высчитали разницу.
а как получить значение таймера? использовать доп переменную?
Типа того, сохранять значение таймера во время первого прерывания и сравнивать с тем, что во время следующего. Не забываем учитывать переполнения таймера.

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

Добавлено: Вт янв 03, 2012 15:02:26
yur4ik
Antifritz писал(а):
yur4ik писал(а): а как получить значение таймера? использовать доп переменную?
Типа того, сохранять значение таймера во время первого прерывания и сравнивать с тем, что во время следующего. Не забываем учитывать переполнения таймера.
не не не... я похоже не совсем точно поставил вопрос :) возможно ли не заводя новую переменную узнать значение таймера? или значение таймера хранится в TCNTх? и вообще правильно ли я понимаю алгоритм того что нужно организовать. заводим переменную допустим tim и в таймере увеличиваем ее значение на 1 как пришел сигнал допустим на INT0 считываем значение переменной tim и обнуляем tim и второй раз так же и находим разницу. так ли это?

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

Добавлено: Ср янв 04, 2012 15:08:21
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 и т.п. подавая разную частоту на вход числа уже другие . ЧТО ЭТО МОЖЕТ БЫТЬ И КАК ЭТО РЕШИТЬ?

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

Добавлено: Ср янв 04, 2012 20:42:46
yur4ik
ааа вроде понял свой касяк зав попробую исправить :)

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

Добавлено: Вс авг 12, 2012 23:37:20
Le_Fleurs
Ребята ну что как успехи запустить смогли? А схемку в lay не подкинете? И фото готового устройства?

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

Добавлено: Пн авг 13, 2012 00:10:20
CyberVad
Le_Fleurs писал(а):Ребята ну что как успехи запустить смогли? А схемку в lay не подкинете? И фото готового устройства?
А вот зацените-ка моё творение, делал сыну на велек: http://vk.com/album19027586_159160096

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

Добавлено: Пн авг 13, 2012 01:43:51
vitalik_1984
Нифига себе бортовой компьютер, я вот тоже думал с дисплеем 16х2 сделать только сомневался, что большеват будет.


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

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

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


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