Ich habe mal Zeit gefunden und ein kleines Programm erstellt, daß ca. 0.5s den Pin ADC2 abfrägt und die anliegende Spannung in einen digitalen Wert wandelt. Ich kann aber in AVR-Studio den betreffenden Pin auf 1 setzen so viel ich will. Das Ergebnis in ADCH und ADCL ist grundsätzlich 0.
Habe ich da irgendwas übersehen? Denn der Interrupt für die AD-Wandlung wird korrekt aufgerufen. Um das Anzuzeigen blinkt eine LED jedesmal mit sobald der ADC-Eingang abgefragt wird.
Momentan werden die Werte aus ADCH und ADCL noch nicht ausgelesen! Aber in AVR sieht man schon, daß der Wert immer 0 ist.
Code:.include "TN15def.inc" ; Prozessor ATtiny15 .def TMP1 = R16 ; Allgemeine Variable .def LEDStat = R17 ; LED-Register .def Prescaler = R18 ; Timer0 Startwert .def ADHigh = R19 ; High-Byte Analogwandler .def ADLow = R20 ; Low-Byte Analogwandler .org 0x0000 ; Programm Startadresse $0000 rjmp Init ; Einsprung ins Hauptprogramm .org 0x0005 ; Interrupt Timer0 rjmp Led ; Led im Sekundentakt blinken .org 0x0008 ; Interrupt AD-Wandler rjmp ADFertig ; Ergebnis von AD holen .org 0x0009 ; Programmstart bei $0009 Init: ldi TMP1,0x01 ; Pin5 auf Ausgabe out DDRB,TMP1 ; schalten. rol TMP1 out TIMSK,TMP1 ; Timer0 Interrupt freigeben ror TMP1 mov LEDStat,TMP1 ; LED-Status speichern. out PORTB,TMP1 ; LED ausschalten ldi TMP1,0x02 ; Teilerfaktor 8 out TCCR0,TMP1 ; für Timer0 einstellen. ldi TMP1,0x0A ; Timer0 mit Startwert out TCNT0,TMP1 ; vorladen und Startwert mov Prescaler,TMP1 ; speichern. ldi TMP1,0x82 ; Interne Referenzspannung out ADMUX,TMP1 ; einschalten und Pin3 Analogeingang ldi TMP1,0x88 ; AD-Wandler einschalten und out ADCSR,TMP1 ; Interrupt für AD freigeben. sei ; Interrupts freigeben Start: ; Hier kann ein Hauptprogramm stehen! rjmp start ; Hauptprogrammende ; **************************************** ; * Interrupt LED An/Aus Timer0 * ; **************************************** Led: out TCNT0,Prescaler ; Timer mit Startwert laden sbic PORTB,PORTB0 ; Led an? rjmp LedAn ; Nein, dann einschalten sbi PORTB,PORTB0 ; Ansonsten ausschalten sbi ADCSR,ADSC ; AD-Wandlung starten reti ; Interrupt verlassen LedAn: cbi PORTB,PORTB0 ; Led einschalten und sbi ADCSR,ADSC ; AD-Wandlung starten. reti ; Rücksprung zum Hauptprogramm ; **************************************** ; * Interrupt AD-Wandler * ; **************************************** ADFertig: reti







Zitieren


Lesezeichen