Vizitator fantomass Postat Mai 26, 2010 Partajează Postat Mai 26, 2010 Buna ziua. Am o problema am un atmega88 si multi senzori si vreau sa citesc toti senzorii, pe rand si sa ii trimit la mine pe calculator pt a face diferite prelucrari de date cu ei. Am atasat un cod pe care l-am facut pt a citi senzorii(AVRStudio). #define AdcAllOff ADMUX |= 0x00; #define Adc0On ADMUX |= (1<<MUX0); #define Adc1On ADMUX |= (1<<REFS0)|(1<<MUX0); #define Adc2On ADMUX |= (1<<REFS0)|(1<<MUX1); #define Adc3On ADMUX |= (1<<REFS0)|(1<<MUX0)|(1<<MUX1); #define Adc4On ADMUX |= (1<<REFS0)|(1<<MUX2); #define Adc5On ADMUX |= (1<<REFS0)|(1<<MUX0)|(1<<MUX2); #define Adc6On ADMUX |= (1<<REFS0)|(1<<MUX1)|(1<<MUX2); #define Adc7On ADMUX |= (1<<REFS0)|(1<<MUX0)|(1<<MUX1)|(1<<MUX2); uint16_t read_adc(uint8_t adc_input);uint16_t read_adc(uint8_t adc_input){ AdcAllOff; switch(adc_input) { case 0:Adc0On; break; case 1:Adc1On; break; case 2:Adc2On; break; case 3:Adc3On; break; case 4:Adc4On; break; case 5:Adc5On; break; case 6:Adc6On; break; case 7:Adc7On; break; } ADCSRA |= (1<<ADEN)|(1<<ADSC)|(1<<ADATE); while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADC;}void main(){//aici este o bucata de cod din main, nu l-am pus pe tot pt ca este f mareif(Temp=='2') { Temperatura = (read_adc(2)*50000)/1024; itoa(Temperatura, aaa, 10);//aaa este un char aaa[10]; USART_Transmit('*'); USART_TrStr(aaa,6); Vib = '1'; Temp='1'; } if(Vib=='2') { Vibratii = (read_adc(1)*50000)/1024; itoa(Vibratii, aaa, 10); USART_Transmit('&'); USART_TrStr(aaa,6); Temp='1'; Vib='1'; }}Problema nu esete ca nu pot citi de pe ei, iar cand cand citesc prima data o tensiune analogica totul merge bine, iar daca comut de ex pe vibratii tensiune incepe sa scada pana ajunge f mica. Daca ma poate ajuta cineva as fi foarte recunoscator. Eu as vrea sa citesc de pe tot portul analogic. Link spre comentariu
nana Postat Mai 26, 2010 Partajează Postat Mai 26, 2010 UITE AICI O SECventa de cod pentru citirea adc. eu folosesc in exemplu un atmega128 dar cred ca registri sunt aceasi in mare si pentru controlerul tau. codu e cam aiurea facut da merge. #define ADC_VREF_TYPE 0x00void adc_init(void){ ADMUX=ADC_VREF_TYPE;//0x40 ADMUX = 0b01000000; ADCSRA = 0x87; //aden si setarea prescalerului}int readadchan(char n){//read ch n of internal 10 bit a/d //ADMUX = n; //ADMUX = 0x40; ADMUX=ADC_VREF_TYPE|n; ADCSRA |= 0x40; while((ADCSRA & 0x10) ==0){}; //wait for conv complete ADCSRA|=0x10; return ADC;} Link spre comentariu
Vizitator fantomass Postat Mai 26, 2010 Partajează Postat Mai 26, 2010 Mersi.. dar am gasit greseala. Aici era #define AdcAllOff ADMUX |= 0x00; 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