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.