mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mega88 ADC0 will nicht


Autor: MichaelMüller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte den ADC0 meines Mega88 abfragen.
Leider bekomme ich nur Nullen zurück.
Daraus schließe ich, dass der ADC erst gar nicht losrennt.
Auf meinem Mega 8 habe ich dasgleiche Programm und es funktioniert.
(Abgesehen davon, dass sich ja beim Mega88 die I/O-Register in ihrer 
Position leicht verändert haben und deshalb anders ausgelesen bzw. 
beschrieben werden müssen.
ADC0_Init:
    ldi     temp, (1<<REFS0)        ; Kanal 0, interne Referenzspannung 5V
    sts     ADMUX, temp
    ldi     temp, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
    sts     ADCSRA, temp

 ; Pullup aktivieren für ADCPort PC0
  in   temp, DDRC      ; als Eingang definieren  
  andi temp, 0b11111110  ; ohne übrige Ports zu verändern
  out  DDRC, temp

  in   temp, PORTC  ; Pullup aktivieren, notwendig!
  ori  temp, (1<<PC0)  ; ohne übrige Ports zu verändern    
  out  PORTC,temp
ret

hat jemand einen Tip für mich?

 GetSampleADC:
    sbi     ADCSRA, ADSC        ; den ADC starten

  wait_adc01:
    sbic    ADCSRA, ADSC        ; wenn der ADC fertig ist, wird dieses Bit gelöscht
    rjmp    wait_adc01

; ADC mit 10 Bit einlesen:
    in      ADClow,  ADCL        ; immer zuerst LOW Byte lesen
    in      ADChigh, ADCH        ; danach das mittlerweile gesperrte High Byte
 ret

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

einfach die Fehler beheben, die der Assembler bemeckert????

z.B.
error: Operand 2 out of range: 0x79
bei   sbi     ADCSRA, ADSC        ; den ADC starten

entweder die Register beim Mega88 sind mit I/O-Zugriffen erreichbar oder 
eben nicht, wie Du ja selbst schon erkannt hast...

Gruß aus Berlin
Michael

Autor: MichaelMüller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, ich habe versehentlich das Programm vom Mega8 hochgeladen
hier jetzt das für den Mega88
 
GetSampleADC:
ldi  temp, (1<<ADSC) 
 sts    ADCSRA, temp          ; den ADC starten

 wait_adc01:
lds  temp, ADCSRA
sbrc    temp, ADSC            ; wenn der ADC fertig ist, wird dieses Bit gelöscht
    rjmp    wait_adc01

; ADC mit 10 Bit einlesen:
 lds      ADClow,  ADCL        ; immer zuerst LOW Byte lesen
 lds      ADChigh, ADCH        ; danach das mittlerweile gesperrte High Byte
 ret

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ldi  temp, (1<<ADSC)
 sts    ADCSRA, temp          ; den ADC starten

Damit löschst du das AD Wandler Enable Bit und die Prescaler 
einstellungen

Autor: MichaelMüller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Hinweis, das hätte ich eigentlich sehen müssen. Ich habe 
das korrigiert.
Trotzdem brauche ich aber nochmal Hilfe.
Mir ist beim Debuggen mit dem Dragon aufgefallen, dass das ADCSRA-Byte 
mit 0xC7 beschrieben werden müsste, zumindest befindet sich dieser Wert 
in meinem Tempregister. Nach dem Befehl:
   sts     ADCSRA, temp          ; den ADC starten
steht aber 0x97 drin, sprich es wurde nicht das ADSC-bit gesetzt, 
sondern das ADIF-Bit. So kann das natürlich nicht gehen.

Irgendwie scheine ich in letzter Zeit so ziemlich jeden Fehler 
mitzunehmen :-(
;------------------------------------------------------------------------
;   Unterprogramm Mega88; liefert ein Sample vom ADC
;------------------------------------------------------------------------
#if defined(Mega88) && defined(_GetSampleADC)
 GetSampleADC:
  lds  temp, ADCSRA
  ori  temp, (1<<ADSC) 
  sts   ADCSRA, temp          ; den ADC starten
  
 wait_adc01:
  lds  temp, ADCSRA
  sbrc  temp, ADSC            ; wenn der ADC fertig ist, wird dieses Bit gelöscht
    rjmp    wait_adc01

; ADC mit 10 Bit einlesen:
    lds      ADClow,  ADCL        ; immer zuerst LOW Byte lesen
    lds      ADChigh, ADCH        ; danach das mittlerweile gesperrte High Byte
 ret
#endif

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das müsste schon so passen, wenn du beim debuggen einen schritt weiter 
gehst, ist der adc schon lange fertig. dabei wird das ADIF Flag gesetzt 
und das ADSC gelöscht. Ich würde nicht darauf warten, ob das ADSC 
gelöscht wird sondern das ADIF Flag pollen. Ist meiner Meinung nach 
schöner.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.