Guten Abend, ich versuche mich gerade durch das Mikrocontroller Tutorial hier zu arbeiten. Bis her komme ich auch gut vorran :) Bin gerade beim ADC angelangt (http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC) Und hier komme ich irgendwie nicht mehr weiter. Habe ein 10k Poti wie in der Testschaltung an PC0 angeschlossen. Weder mit dem Testprogramm, noch mit einem selbstgeschriebenem Programm bekomme ich einen Wert. Der Wert der mir über RS232 ausgegeben wird, schwankt start zwischen 60-200 und ändert sich nicht in Abhängigkeit des Potis. Den Atmega 8 programmiere ich mit dem Evaluationboard V2.01 von Pollin. Wollte mal fragen, ob bereits jemand ein ähnliches Problem hatte oder ob jemand eine Idee hat, was ich falsch gemacht haben könnte. Wenn es helfen würde, kann ich gerne mein Programm hier posten, aber ich dachte, da das Beispielbrogramm auch nicht läuft, dass das nicht daran liegt. Das hier ist meine Initialisierung des ADC ldi r16, (1<<REFS0) | (1<<ADLAR) out ADMUX, r16 ldi r16, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) out ADCSRA, r16 ; 16 MHz / 128 = 125kHz) Meinem Messgerät nach liegen übrigends am Pin PC0 je nach Potistellung zwischen 0 und 5 V an ... Vielen Dank
Kannst du ggf. doch mal deinen gesamten Code hochladen? Und messe mal wie sauber die Spannung an Pin20 AVCC ist. Den 100nF an ARef kannste auch mal überprüfen.
Klar, gerne :)
Also die Spannung am Pin Aref = Avcc = Vcc = 5.02 V ... ohne
Schwankungen oder sowas ...
Und hier der Quellcode
.include "m8def.inc"
.equ F_CPU = 16000000 ; Systemtakt in Hz
.equ BAUD = 9600 ; Baudrate
; Berechnungen
.equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever runden
.equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; max. +/-10 Promille
Fehler
.error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit
zu hoch!"
.endif
init:
; Stackpointer initialisieren
ldi r16, HIGH(RAMEND)
out SPH, r16
ldi r16, LOW(RAMEND)
out SPL, r16
; Baudrate einstellen und Senden aktivieren
ldi r16, LOW(UBRR_VAL)
out UBRRL, r16
ldi r16, HIGH(UBRR_VAL)
out UBRRH, r16
ldi r16, (1<<URSEL)|(3<<UCSZ0) ; Frame-Format: 8 Bit
out UCSRC, r16
sbi UCSRB, TXEN
; ADC initialisieren
ldi r16, (1<<REFS0) | (1<<ADLAR)
out ADMUX, r16
; ADC0 (Kanal 0), interne Referenzspannung Vcc (5V), linksbündig
ldi r16, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
out ADCSRA, r16
; Vorteiler 128 (damit Samplefrequenz zwischen 50kHz und 200 kHz ... 16
MHz / 128 = 125kHz)
not_pressed:
sbis PIND, 2 ; skip if bit set (PD2)
rjmp not_pressed
rcall sample_adc ; Wert in r16 laden
rcall serout_r16 ; ausgeben
pressed:
sbic PIND, 2 ; skip if bit cleared (PD2)
rjmp pressed
rjmp not_pressed
;-------------------------------------------------------------
sample_adc:
sbi ADCSRA, ADSC ; ADC starten
wait_adc:
sbic ADCSRA, ADSC ; warten bis ADC fertig
rjmp wait_adc
; ADC einlesen
in r16, ADCL ; zuerst LOW Byte lesen
in r16, ADCH ; dann gesperrte High Byte
ret
serout_r16:
push r16
rcall bcd
mov r16, r19
rcall serout
mov r16, r18
rcall serout
mov r16, r17
rcall serout
ldi r16, 13
rcall serout
rcall sync
pop r16
ret
serout:
sbis UCSRA, UDRE ; Warten bis UDR bereit
rjmp serout
out UDR, r16
ret
;-----------------------------------------------
; Dec TO Ascii
; input: R16
; output: (R19:R18:R17)
;-----------------------------------------------
bcd:
mov r17, r16
ldi r19, -1 + '0'
_bcd1:
inc r19
subi r17, 100
brcc _bcd1
ldi r18, 10 + '0'
_bcd2:
dec r18
subi r17, -10
brcs _bcd2
sbci r17, -'0'
ret
; kleine Pause zum Synchronisieren des Empfängers, falls
zwischenzeitlich das Kabel getrennt wurde
sync:
ldi r16, 0
sync_1:
ldi r17, 0
sync_loop:
dec r17
brne sync_loop
dec r16
brne sync_1
ret
Achso ... und den 100 nF Kondensator habe ich auch zwischen ARef und GND angeschlossen ... weder mit, noch ohne bekomme ich richtige Messwerte. Ich habe mein Programm auch so gehabt, dass 256 Messwerte wie im Beispiel gemittelt werden ... brachte aber auch keine Änderung. Ich bekomme übrigends genau die gleichen Messwerte, wenn ich das Poti ganz weglasse ... und das finde ich sehr komisch ...
devil13 schrieb: > Also die Spannung am Pin Aref = Avcc = Vcc = 5.02 V ... Seit wann wird Aref an VCC angeschlossen. Da gehört nur ein Kondensator ran (-> Datenblatt: "The voltage reference may be externally decoupled at the AREF pin by a capacitor for better noise performance.")
Das habe ich zuerst auch gedacht ... ist aber an PC0 angeschlossen ... habe gerade mal mit meinem Messgerät direkt an das Beinchen des Atmega durchgeklingelt ... scheinbar besteht keine Verbindung ... habe ebenfalls von Pollin den Streifen-/Punktrasterplatienenadapter und sonst eigentlich keine zusätzlichen Sachen verschaltet. Mir ist bereits schonmal aufgefallen, dass ich zum Programmieren immer das Verbindungskabel abziehen muss (habe das Kabel aus einem alten Computer ... war dort nen IDE Kabel) ... kann es damit zusammen hängen?
µC Bastler schrieb: > Seit wann wird Aref an VCC angeschlossen. Da gehört nur ein Kondensator > ran (-> Datenblatt: "The voltage reference > may be externally decoupled at the AREF pin by a capacitor for better > noise performance.") Habe ich nicht ... dort liegen aber die gleichen Spannungen an ... sorry, wenn das missverständlich war
devil13 schrieb: > habe gerade mal mit meinem Messgerät direkt an das Beinchen des Atmega > durchgeklingelt ... scheinbar besteht keine Verbindung Also Fehler gefunden ...
Michael D. schrieb: > Also Fehler gefunden ... Jan, aber was für ein Quatsch ... Auf dem Streifen-/Punktrasterplatienenadapter von Pollin steht PC0 ... entspricht aber nicht der gleichen Leitung wie auf den Evaluation Board ... voll dumm und ich glaube das wäre dann auch einer der Sachen, die ich ausgeschlossen hätte, weil ich davon ausgehen würde, dass die sowas Fehlerfrei verkaufen ... naja ... für die, die irgendwann das gleiche Problem haben, PC0 geht übrigends an den mit PA0 beschrifteten Pin. Das Programm funktioniert jetzt wunderbar :) Eine Frage habe ich dennoch: Warum kann muss ich jedes mal zum Programmieren das IDE Kabel abziehen ... es ist übrigends auch egal, ob das Kabel nur so dran hängt oder etwas an das Kabel angeschlossen ist ... versteh das irgendwie nicht, weil der Kabelanschluss ja eigentlich in der Luft hängt und es somit doch egal sein müsste, ob es dran hängt oder nicht?!? Vielen Dank, für eure Hilfe!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.