[avr-gcc] ADC i m32 problem

Dec 15, 2007 5 Replies

Witm,



Mam problem z powtórn± inicjacj± konwersji ,po resecie przy pierwszym przerwaniu od ADC wszystko jest dobrze ale za kolejnym ju¿ nic siê nie zmienia mimo ¿e zmieniam na wej¶ciu napiêcie (potencjometr miêdzy vcc<->gnd).



<code>

SFIOR &= ~(1<<ADTS2 | 1<<ADTS1 | 1<<ADTS0); ADCSRA = 1<<ADEN | 1<<ADPS0 | 1<<ADIE;



sei(); lcd_cls(); for (;;) { lcd_setPos(1,0); lcd_str_P((prog_char*)PSTR(">"));



ADMUX = 0x01; // ADC1 , Vref=AREF , AREF i AVCC pod³±czone do Vcc ADCSRA |= 1<<ADSC | 1<<ADEN; // ADC_ON & ADC_START



while(ADCSRA & (1<<ADSC)) ;



lcd_setPos(1,9); lcd_hex_byte(ADCSRA); // 0x89 => ADEN=1, ADSC=0, ADATE=0, ADIF=0, ADIE=1, ADPS2=ADPS1=0, ADPS0=1 (div=2) lcd_str_P((prog_char*)PSTR(" ")); lcd_hex_byte(ADMUX); // 0x01 => Vref z AREF_PIN, pomiar ADC1 lcd_str_P((prog_char*)PSTR(" ")); lcd_hex_byte(SFIOR); // 0x00 lcd_str_P((prog_char*)PSTR(" ")); lcd_hex_byte(SREG); // 0x82 => I=1



lcd_setPos(2,0); lcd_dec(tmp16);



lcd_setPos(1,2); lcd_hex_byte(ADCH); lcd_hex_byte(ADCL);



lcd_setPos(1,0); lcd_str_P((prog_char*)PSTR("x")); delay1ms(1000); } }



SIGNAL (SIG_ADC) { PORT(D) = ~PORT(D); tmp16 = (ADCH<<8) | ADCL; ADCH = ADCL = 0; }



</code>

W komentarzu przy wy¶wietlaniu rejestrów napisa³em warto¶ci jakie mam. Dioda pod³±czona do portu D mryga co ~1s czyli przerwanie siê wykonuje ale jak pokrêcê potencjometrem to nie zmienia siê tmp16 :| ale jak zresetuje uP to mam zmienione ju¿. Czemu mi nie dzia³a to? Mo¿e zapomian czego¶ zrobiæ albo robiê za du¿o?



U¿ytkownik "Saper/nolin11" <nolin11_USUN snipped-for-privacy@interia.pl napisa³ w wiadomo¶ci news:fk1a63$q0e$ snipped-for-privacy@news.dialog.net.pl...

...

Powinienes najpierw odczytywac ADCL a potem ADCH i chyba tu tkwi blad. pozdrawiam

Niestety :| wci±¿ zamarza mi warto¶æ I pomiaru... Mimo krêcenia PRkiem nic siê nie zmienia :( do resetu.

Użytkownik Robert Zemła napisał:

A nie prościej napisać

tmp16 = ADC;

Pozdrawiam Grzegorz

Saper/nolin11 denied rebel lies:

A tmp16 jest zadeklarowane jako volatile?

nie jest, ale to nie daje mi ¿adnego efektu... Pierwszy odczyt jest ok, a drugiego ju¿ nie ma....

Uhhhh... problem rozwi±zany :|, nie ustawia³em bitu ADATE znany z atmega8 jako ADFR i dzia³a.

No w³a¶nie opis mówi o auto-triggering i odnosi go do SFIOR- bitów: ADTS0-2 i tutaj jest free running mode czyli konwersja biegnie ca³y czas - przynajmniej ja to tak rozumim :|

No ale ju¿ wiem gdzie jest "be" wiêc EOT. Przepraszam za k³opot.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required