помогите с тахометром at2313 в cvavr
Вообщем выкладываю прогу тахометра на 2313 -может кто увидит -что не так.
Спаял, прошил, фьюзы cksel0, cksel1, sut1 поставил галочки.
С фьюзами кстати еще не разобрался до конца.
Подключил генератор на 561 лн2, примерно 1 гц. Индикация есть,
но примерно раз в две секунды значение меняется как бы по произвольному закону и естественно оно неверное. должно "замереть" со значением примерно 60. В протеусе тоже самое. Если гену отключить то покажет нули, здесь хоть работает)
Сигнал подаю на pind6
МК "ждет" импульсы, на спаде первого засекается время, на спаде второго вычисление промежутка времени и частоты. Время высчитывается подсчетом количества тактовых колебаний. Вспомогательные битовые переменные -чтоб не спутать- где первый импульс а где второй.
#include <tiny2313.h> // Declare your global variables here bit n1=0, n2=0, n3=0;//вспомогательные переменные unsigned int k=0, s=0, x=0; //0...65535 unsigned long int t=0, c[4]; // s- счетчик количества прерываний // k- счетчик при некотором значении которого выводится информация на светодиоды interrupt [TIM0_OVF] void timer0_ovf_isr(void) { s++; TIFR |= 1<<1; if(s>15625) {s=15625; }} void main(void) { // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif PORTB=0b00101000; DDRB=0xFF; PORTD=0b0000000; DDRD=0b0001111; TCCR0A=0x00; TCCR0B=0b00000001;//___4МГц TIMSK=0b00000010; //прерывания по переполнению таймера возможны #asm("sei")// вкл глобально прерывания while (1){ k++; // вычисление промежутка времени будет осуществляться между двумя спадами сигнала на PD6 if ((PIND.6==1)&&(n2==0)) {n1=1; } if ((PIND.6==0)&&(n1==1)) { t=TCNT0; //"засек" время s=0; n2=1; n1=0; } if ((PIND.6==1)&&(n2==1)) { n3=1; n2=0; n1=0; } if ((PIND.6==0)&&(n3==1)) { n1=0; n2=0; n3=0; //"засек" время еще раз(перезаписал переменную) t=TCNT0+(256*s)-t; //вычисление промежутка времени одного изменения сигнала t=24000000/t; if(t>9999){t=9999;} c[3]=t/1000; c[2]=(t-(c[3]*1000))/100; c[1]=(t-((c[3]*1000)+(c[2]*100)))/10; c[0]=(t-((t/10)*10)); s=0; t=0;} //процедура вывода результата if(k>300){//DEGF,CBA k=0; PORTD.0=0; PORTD.1=0; PORTD.2=0; PORTD.3=0; if(c[x]==0) {PORTB=0b00101000;} if(c[x]==1) {PORTB=0b11111001;} if(c[x]==2) {PORTB=0b00011100;} if(c[x]==3) {PORTB=0b01011000;} if(c[x]==4) {PORTB=0b11001001;} if(c[x]==5) {PORTB=0b01001010;} if(c[x]==6) {PORTB=0b00001010;} if(c[x]==7) {PORTB=0b11111000;} if(c[x]==8) {PORTB=0b00001000;} if(c[x]==9) {PORTB=0b01001000;} PORTD |= 1<<x; x++; if(x==4){x=0;} } }//end while(1) }//end main
получается видимо что
получается видимо что программа проверяет условие if ((PIND.6==0)&&(n1==1)) несколько раз в цикле пока (1)и каждый раз записывает в переменную t разные значения TCNT0. Видимо надо менять подход в построении алгоритма и переписывать прогу. пошел думать дальше)
Попробуй расписать полностью
Попробуй расписать полностью пошагово алгоритм работы устройства.
Если сложно давай выкладывай помогу скорректировать и подскажу.
Просто пошагово, что делается с переменными и что происходит на портах МК.
Доброго времени
Доброго времени суток.программу кстати подкорректировал.
Встроенный генератор- это который на 4МГц.
Внешний соответственно сигал.
Фактически эта конструкция частотомер, только показания умножаю на 60(чтоб получился тахометр)
Вот формулы, на которые я опирался(переменные не соответствуют тем, что в проге).
f=1/T1 f -искомая частота(потом умножу на 60), T1-период искомого колебания
T1=t (искомый период равен некоторому отрезку времени)
t=n*T2 (который можно найти умножив количество колебаний встроенного генератора n на период колебания встроенного генератора T2 )
здесь n соответсвует переменной t
проблема где-то как раз с переменной t- принимает разные значения, иногда больше 9999, а по логике не должно.
Для тахометра хватит одного
Для тахометра хватит одного цикла в котором будет считать таймер до 60 сек, после этого будет срабатывать прерывание которое будет выполнять подсчет нажатий или срабатывания датчика. Так же срабатывание датчика нужно вешать на внешнее прерывание. Итого логика такая: запуск программы, запускается таймер, срабатывает датчик добавляется к переменной 1-ка, дальше опять несколько раз срабатывает прерывание переменная получает значение например 10, срабатывает прерывание таймера (60сек) на экран выводится 10.
А значение TNT0 оно вообще
А значение TNT0 оно вообще 8-ми битное? А то может же выйти что ты в порт пишешь значение больше 8 бит и лезет всякая херня.
вроде 8 бит, посмотрел еще
вроде 8 бит, посмотрел еще раз. Как тут сообщения люди пишут- код не видно .
Админу за картинки огромное спасибо. Похоже это последнее сообщение которое я тут смог написать. Попытки с 20-й
Картинку поставил проще,
Картинку поставил проще, попробуй в таком случаи подключить еще и модуль UART, пиши значение счетчика в переменную и выводи её на UART. Будешь видеть что там за число.
Спасибо за картинки, а
Спасибо за картинки, а счетчик прыгал из-за паузы.
Пауза паузой, а счетчик в это время считал, разобрался.
Вот теперь новая непонятка, правда уже в протеусе.
пишу:
PORTD=0b0000000;
DDRD=0b0001111;
Codevision ошибок не выдает, а протеус ругается.
Сделал вот так и перебором нашел на какой пин:
DDRD.0=1;
DDRD.1=1;
DDRD.2=1; //Протеус не работает из-за этой строки
DDRD.3=1;
Никто не сталкивался- почему?
Могу писанину всю и проект прикрепить, только малость стыдно)) коряво там все.
Всем спасибо)) надо было
Всем спасибо)) надо было резисторы на ноги повесить(только порт Б )все заработало
Выходит срабатывала защита
Выходит срабатывала защита порта? Ну видимо ток превышал допустимый и порт закрывался автоматически.
рано обрадовался. обновил
рано обрадовался. обновил прогу, мож кто увидит где ошибка
1. Проверь совпадает ли МК на
1. Проверь совпадает ли МК на котором ты делаешь и МК котоырй указан в проетусе.
2. Проверь не задействованы ли еще где-то ножки МК на которые ругается Протеус.
3. Попробуй не задействовать этот порт если он глючит.
разобрался- резисторы на порт
разобрался- резисторы на порт Д - а вообще наверное нужно подумать о буфере
тут картинку нельзя
тут картинку нельзя прикрепить, да?
Можно, закидывай куда-то типа
Можно, закидывай куда-то типа радикала и давай ссылку в сообщении.
вот схемка. мк attiny2313,
вот схемка.
мк attiny2313, ха!! оторвал ножку PD2 в протеусе- все зашевелилось!
а как же без нее то)