hallo ich hab bei meinem mega16 mal den adc testweise in betrieb genommen. nur leider ist das ergebniss immer 1023, egal ob 0,01V oder 4,99V anliegt(an PORTA, 7). Die konfiguration muüsste eigentlich richtig sein. ich habe als messspannungsquelle einfach nen 1KOHM poti hergenommen, schleifer auf ADC7 und der rest auf gnd und +5V . Unten ist mal der wichtigste teil des quelltextes: wichtig, der untere teil ist nicht documentiert, da wird dann bloß noch geschaut welcher wert in "balken" steht, damit die entsprechende routine zur ausgabe aufgerufen werden kann. ================================================== ldi temp, 0b01111111 ;Port A = Ausgang/eingang out DDRA, temp ldi temp1, 0b11100000 out DDRD, temp1 ;Port D = Ausgang, Eingang cli ; Interrupts sperren ; _ADC_ einrichten ldi temp, 0b00000111 ; Vorteiler einstellen (128) out ADCSRA, temp ; und nach ADCSRA ausgeben cbi ADCSRA, ADIE ; ADC Int ausschalten cbi ADMUX, REFS1 ; AREF ext hernehmen cbi ADMUX, REFS0 sbi ADMUX, 0 ; Kanal 7 hernehmen sbi ADMUX, 1 sbi ADMUX, 2 cbi ADMUX, 3 cbi ADMUX, 4 sbi ADCSRA, ADEN ; ADC generell einschalten rcall lcd_init ; Display hochfahren rcall lcd_clear loop: rcall auslesen ; ADWandlung aufrufen rcall ausgabe rcall warteschleife rjmp loop auslesen: sbi ADCSRA, ADSC ; ADWandlung starten ADC_busy: sbis ADCSRA, ADIF ; ADC noch busy? rjmp ADC_busy in SL, ADCL ; Daten auslesen in SH, ADCH ror SH ; auf 256 werte verkleinern ror SL ror SH ror SL mov WERT, SL ; ab das eigentliche Register ret ausgabe: clr balken ; balken loeschen ausgabe1: subi WERT, 32 ; von WERT 32 abziehen brmi count ; wenn negativ, dann Ende inc balken ; balken hochzählen rjmp ausgabe1 ; und nochmal count: ldi temp, 0x01 cp temp, WERT breq balken1a ldi temp, 0b00000010 cp temp, WERT breq balken2a ldi temp, 0b00000011 cp temp, WERT breq balken3a ldi temp, 0b00000100 cp temp, WERT breq balken4a ldi temp, 0b00000101 cp temp, WERT breq balken5a ldi temp, 0b00000110 cp temp, WERT breq balken6a ldi temp, 0b00000111 cp temp, WERT breq balken7a ldi temp, 0b00001000 cp temp, WERT breq balken8a
hi, programmiere normalerweise nicht in asm, aber probier mal nach jedem "kanalwechsel" eine probemessung zu machen, bei der du das ergebnis verwirfst. erst dann die eigentlcihe messung machen. hat bei mir wunder geholfen
Bei ausgabe sehe ich kein ret. Außerdem kannste Dir die Rotiererei sparen, wenn Du das ADLAR-Bit in ADMUX setzt und nur das High-Byte ausliest...
Ach ja, die Marke 'warteschleife' sehe ich auch nirgends. Oder haste das Programm unten einfach abgeschnitten?
also: ja warteschleife ist weiter unten, ich hab ja gesagt, es ist nur der wichtigste teil des codes. dann, kanalwechsel ? wieso, ich mess nur auf ADC7, die restlichen kanäle sind io's. das ret bei ausgabe wird nicht gebraucht. er springt, sobalt er fertig ist mit dem runterzählen, zu "count" da gibt er dann das ergebniss aus und dann, kommt irgendwann mal ret. dass is nimmer da oben drauf!
Wenn der Pull-Up an ist, misst Du alles Mögliche, nur nicht den Wert, der mit dem Poti eingestellt wird...
ja ok das hab ich schon gemacht. und ddra is auch 0b00111111 also liegts daran nicht, oder? luxx
"Dein Poti ist i.O.?" <<< ?? in ordnung? ja ist er ich hab ja schon diverse messungen durchgeführt. hätt ja sein können dass es keinen kontakt gibt oder AREF(is auf +5V) kein Referenzstrom kriegt.
hallo aslso der adc funzt jetzt soweit, der fehler war im code. aber was anderes: wenn ich den poti "aufdrehe", also mehr V in den ADC reinlass, geht soweit alles gut, aber genau bei der hälfte(ca.2,5V) baut der adc plötzlich mist, er liefert als wert nur noch "0" ... "-1" (ich hab die ausgabe erweitert). woran kann das liegen? luxx
die interne Referenz ist ca 2,5V. Hast du also wirklich deine externe Referenz in den ADC-Steuerregistern eeingestellt?
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.