Bunch
25.11.2005, 07:59
Hallo alle miteineander,
Ich habe einen ATmega32 und programmiere mit AVR-Studio4.11.
Ich will die Spannung am PA4 messen und bei unterschreiten eines Schwellwertes eine Störungs-LED schalten.
Im Idealfall liegen 5V an PA4 an, und dies würde ja einen dezimalen Wert von 1024 machen. Wobei dann das Highbyte ( ADCH ) 3 sein muß und Lowbyte (ADCL) 255.
Wenn das Programm nun an den fett markierten Zeilen das ADCH und ADCL in Register übernehmen soll, wird das nicht richtig gemacht.
Es fehlen Bits im HighByte so als ob der Wert nach linksgeschoben worden wäre. D.h. wenn der Wert im ADCH ursprünglich 3 war ist er nachher nur noch 2, was sich doch ganz erheblich auf das Endergebniss auswirken kann.
Dies passiert jedoch nicht immer, wie ich bei debuggen feststellen konnte.
Hier mal der Teil-Code:
ldi temp,4;Spannungsmessung an PA4 !!!!!!!!!!!
out ADMUX, temp
ldi temp, ((1<<ADEN)|(1<<ADSC)|(1<<ADFR)) + 7 ;
out ADCSRA, temp
sbi ADCSRA, ADIF ;logisch "1" löscht ADIF flag !
;ADC einlesen:
in lowByte, ADCL ;immer zuerst low byte lesen
in highByte, ADCH ;danach high byte
ldi temp, high(900)
cpi lowByte,low (900)
cpc highByte,temp
brlo Storung
ldi temp,0b00010000
out PORTB,temp
Wieso wird der Wert nicht immer richtig übernommen?
Als Anmerkung sei gesagt, daß dies nur ein Ausschnitt aus dem Code ist.
Bin für alle Tips dankbar,
mit den besten Grüssen........
Ich habe einen ATmega32 und programmiere mit AVR-Studio4.11.
Ich will die Spannung am PA4 messen und bei unterschreiten eines Schwellwertes eine Störungs-LED schalten.
Im Idealfall liegen 5V an PA4 an, und dies würde ja einen dezimalen Wert von 1024 machen. Wobei dann das Highbyte ( ADCH ) 3 sein muß und Lowbyte (ADCL) 255.
Wenn das Programm nun an den fett markierten Zeilen das ADCH und ADCL in Register übernehmen soll, wird das nicht richtig gemacht.
Es fehlen Bits im HighByte so als ob der Wert nach linksgeschoben worden wäre. D.h. wenn der Wert im ADCH ursprünglich 3 war ist er nachher nur noch 2, was sich doch ganz erheblich auf das Endergebniss auswirken kann.
Dies passiert jedoch nicht immer, wie ich bei debuggen feststellen konnte.
Hier mal der Teil-Code:
ldi temp,4;Spannungsmessung an PA4 !!!!!!!!!!!
out ADMUX, temp
ldi temp, ((1<<ADEN)|(1<<ADSC)|(1<<ADFR)) + 7 ;
out ADCSRA, temp
sbi ADCSRA, ADIF ;logisch "1" löscht ADIF flag !
;ADC einlesen:
in lowByte, ADCL ;immer zuerst low byte lesen
in highByte, ADCH ;danach high byte
ldi temp, high(900)
cpi lowByte,low (900)
cpc highByte,temp
brlo Storung
ldi temp,0b00010000
out PORTB,temp
Wieso wird der Wert nicht immer richtig übernommen?
Als Anmerkung sei gesagt, daß dies nur ein Ausschnitt aus dem Code ist.
Bin für alle Tips dankbar,
mit den besten Grüssen........