Vizitator Tyirean Postat Noiembrie 29, 2011 Partajează Postat Noiembrie 29, 2011 Salut. Am de facut un proiect pe un CEREBOT 2 cu un senszor laser de distanta. Vreau sa fac un mic radar(afisare viteza pe 3 afisoare cu 7 segmente in metrii/secunda).Am atasat schema bloc pentru o intelegere mai buna. Doresc ca odata la 50 ms sa fac o citire din ADC,apoi sa operez cu ultimele 2 valori citite(fac diferenta celor 2,valoarea o inmultesc cu 20 pt a avea o valoare in metrii pe secunda). Vreau sa fac cu o rutina de intrerupere a timerului 0.Am reusit sa fac programul,dar la simularea acestuia in proteus pe portul D am intotdeauna 0,desi portul A functioneaza,se schimba comanda afisoarelor 7 segmente!!! Sunt incepator si nu imi pot da seama care este problema! Va rog ajutati-ma. /* * AVRGCC3.c * * Created: 11/29/2011 12:07:17 PM * Author: Tyirean */ #include #include #include float r,can_val; float citire_adc(void); void programare_timer0(); void main(void) { float new, dif; int s,z,u,val; float old=0; programare_timer0(); while(1) { new=r; if(new>=old) dif=new-old; else dif=old-new; old=new; val=dif*20; //valoarea in metrii/secunda if(val>99.9) val=99.9; val=val*100; val=val % 10; while(val>100) { val=val-100; s=s+1; // calculul zecilor de m/s } while(val>=10) { val=val-10; z=z+1;// calculul unitati de m/s } u=val; //zecimi de m/s DDRA=0XFF; //setare port a-port intrare PORTA=0X00; //sterge port A DDRD=0XFF; //setare port d-port intrare PORTD=0X00; //sterge port D DDRA=0XFF; //setare port a-port intrare PORTA=0X01; //selecteaza primul afisaj 7segmente DDRD=0XFF; //setare port d-port intrare PORTD=u; //pune in portul D valoarea zecimilor DDRA=0XFF; //setare port a-port intrare PORTA=0X00; //sterge port A DDRA=0XFF; //setare port a-port intrare PORTA=0X02; //selecteaza al doilea afisaj 7 segmente DDRD=0XFF; //setare port d-port intrare PORTD=0X00; //sterge port D DDRD=0XFF; //setare port d-port intrare PORTD=z; //pune in pord D valoarea unitatilor DDRA=0XFF; //setare port a-port intrare PORTA=0x00; //sterge port A DDRA=0XFF; //setare port a-port intrare PORTA=0x04; //selecteaza al treilea afisaj 7 segmente DDRD=0XFF; //setare port d-port intrare PORTD=0X00; //sterge port D DDRD=0XFF; //setare port d-port intrare PORTD=s; //pune in port D valoarea zecilor DDRA=0XFF; //setare port a-port intrare PORTA=0x00; //sterge port A } } void programare_timer0(void) { TCCR0=0X0F; //setare mod ctc cu factor divizre 1024 OCR0=0XC2; //incarcare 190 (50ms) TIMSK=TIMSK | 0X02; //setare intrerupere de comparare } float citire_adc(void) { //start conversie ADMUX=0X40; //setare canal 0 ADCSRA=0X26; ADCSRB=0x00; ADCSRA=ADCSRA | 0X80; //MASCA ENABLE ADCSRA=ADCSRA | 0X40; //MASCA START CONVERSIE can_val=ADC * 0.9765; return(can_val); } ISR(TIMER0_COMP_vect) { r=citire_adc(); } Madalina:modificare nume subiect Link spre comentariu
altli Postat Noiembrie 30, 2011 Partajează Postat Noiembrie 30, 2011 Ce ai vrut sa faci aici?val=val*100;val=val % 10; Se pare ca rezultatul va fi mereu 0. Link spre comentariu
Vizitator Tyirean Postat Noiembrie 30, 2011 Partajează Postat Noiembrie 30, 2011 Ce ai vrut sa faci aici?val=val*100;val=val % 10; Se pare ca rezultatul va fi mereu 0. Am facut o prostie. Am vrut sa scot doar rezultatul intreg.Dar mi-am dat seama ca mod da restul unei impartiri nu catul. dar si fara asta nu merge. ?? nu stiu care este problema :)si numarul acela este flotant. pot sa pun pe port asa ceva? Link spre comentariu
altli Postat Decembrie 1, 2011 Partajează Postat Decembrie 1, 2011 Mai bine cauti un exemplu asemanator. Ceva de genu http://extremeelectronics.co.in/avr-tut ... nsor-lm35/ Nu cred ca este cazul sa te complici cu float pentru o zecimala. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum