Witam,
wiem ze temat był przerabiany wielokrotnie ale po przeczytaniu postów dalej nie mogę znaleźć błędu u siebie.
Pod pin 8 portu A mam podpięty czujnik temperatury LM35. Napięcie jakie mierze na samym pinie jest poprawne np. ok 230mV czyli mniej więcej 23C.
Chciałam napisać programik wyświetlający wartość binarną z wejścia analogowego. Ponieważ mam ok. 5.06V zasilanie AVCC to przy 230mV powinnam mieć wynik ok .46 (230/5060*1024) i to powinno pokazać się na diodach (również portA). Tak na początek.
Niestety nie pokazuje sie.. pojawia mi sie raz (?!) wartość 99 (01100011) lub czasem 96 (01100000). Nie wiem skąd sie biorą. Już nawet testowałam sobie diody czy zwarcia gdzieś nie mam ale wszystko wydaje się ok. Nie ma ustawianych nowych wartości w ADCL i ADCH..
Wertowałam datasheet i wydaje się że wszystke bity mam ustawione tak jak powinny.. Nie mam dodanego kondensatora na aref ale to jest tylko dla eliminacji szumów tak?
A jak przedstawiana jest liczba w ADCL i ADCH z przecinkiem? bo tego nie umiem znaleźć? jest zaokrąglana czy odcinana?
jesli ktoś by miał chwilę, byłabym wdzięczna za rzucenie okiem na mój kod. Może tam jest jakiś błąd?
byłabym wdzięczna za sugestie, pozdrawiam
wiem ze temat był przerabiany wielokrotnie ale po przeczytaniu postów dalej nie mogę znaleźć błędu u siebie.
Pod pin 8 portu A mam podpięty czujnik temperatury LM35. Napięcie jakie mierze na samym pinie jest poprawne np. ok 230mV czyli mniej więcej 23C.
Chciałam napisać programik wyświetlający wartość binarną z wejścia analogowego. Ponieważ mam ok. 5.06V zasilanie AVCC to przy 230mV powinnam mieć wynik ok .46 (230/5060*1024) i to powinno pokazać się na diodach (również portA). Tak na początek.
Niestety nie pokazuje sie.. pojawia mi sie raz (?!) wartość 99 (01100011) lub czasem 96 (01100000). Nie wiem skąd sie biorą. Już nawet testowałam sobie diody czy zwarcia gdzieś nie mam ale wszystko wydaje się ok. Nie ma ustawianych nowych wartości w ADCL i ADCH..
Wertowałam datasheet i wydaje się że wszystke bity mam ustawione tak jak powinny.. Nie mam dodanego kondensatora na aref ale to jest tylko dla eliminacji szumów tak?
A jak przedstawiana jest liczba w ADCL i ADCH z przecinkiem? bo tego nie umiem znaleźć? jest zaokrąglana czy odcinana?
jesli ktoś by miał chwilę, byłabym wdzięczna za rzucenie okiem na mój kod. Może tam jest jakiś błąd?
unsigned char adcresultH=0;
unsigned char adcresultL=0;
ISR(ADC_vect) //ADC converter Interrupt
{
adcresultL=ADCL;
adcresultH=ADCH;
return;
}
int main (void)
{
DDRA=0b01111111; //outputy '1' diodki swiecace + input '0' z czujnika na wejsciu analog A7 (ADC7);
SFIOR=0;
SFIOR|=(1<<PUD); //ADTS2:0 =0 na free running mode; dodatkowo wyl. podciąganie pull-up PUD
ADMUX|= (1<<REFS0)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0); // //REFS1=0 & REFS0=1 AVCC with external capacitor at AREF pin | MUX (ADC7 single ended) ok
SREG|=(1<<SREG_I);
ADCSRA|=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE);
//ADCSRA
//Bit 7 ADEN in ADC Enable bit podnieść na 1;
//Bit 6 ADCS Start Conversion bit - podnieść na wysoki 1, aby zacząć konwersję, samo opada po wykonaniu
//Bit 5 ADATE = 1 auto trigger;
//Bit 4 ADIF is set after writing ADCH&L
//Bit 3 ADC Interrupt Enable & I-bit in SREG =ADC Conversion Complete Interrupt
//Bit 2 ADPS2:0: ADC Prescaler Select Bits 0
PORTA=0b10000000; // diody zaswiecaja sie dla zaznaczenia poczatku
_delay_ms(30);
PORTA=0xff; //gasna
while (1)
{
ADCSRA |= (1<<ADSC) | (1<<ADIF); nastepny cykl
while ((1<<ADIF)!=(ADCSRA&(1<<ADIF))); // czekaj na koniec konwersji
PORTA=~adcresultL; // zaswiecic diody odpowiadajace bitom w ADCL
_delay_ms (50);
PORTA=~adcresultH;
_delay_ms (50);
PORTA=0b10000000;
adcresultH=adcresultL=0;
}
}
byłabym wdzięczna za sugestie, pozdrawiam