Forum: Mikrocontroller und Digitale Elektronik Mega88 ADC0 will nicht


von MichaelMüller (Gast)


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.
1
ADC0_Init:
2
    ldi     temp, (1<<REFS0)        ; Kanal 0, interne Referenzspannung 5V
3
    sts     ADMUX, temp
4
    ldi     temp, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
5
    sts     ADCSRA, temp
6
7
 ; Pullup aktivieren für ADCPort PC0
8
  in   temp, DDRC      ; als Eingang definieren  
9
  andi temp, 0b11111110  ; ohne übrige Ports zu verändern
10
  out  DDRC, temp
11
12
  in   temp, PORTC  ; Pullup aktivieren, notwendig!
13
  ori  temp, (1<<PC0)  ; ohne übrige Ports zu verändern    
14
  out  PORTC,temp
15
ret

hat jemand einen Tip für mich?

1
 GetSampleADC:
2
    sbi     ADCSRA, ADSC        ; den ADC starten
3
4
  wait_adc01:
5
    sbic    ADCSRA, ADSC        ; wenn der ADC fertig ist, wird dieses Bit gelöscht
6
    rjmp    wait_adc01
7
8
; ADC mit 10 Bit einlesen:
9
    in      ADClow,  ADCL        ; immer zuerst LOW Byte lesen
10
    in      ADChigh, ADCH        ; danach das mittlerweile gesperrte High Byte
11
 ret

von Michael U. (amiga)


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

von MichaelMüller (Gast)


Lesenswert?

sorry, ich habe versehentlich das Programm vom Mega8 hochgeladen
hier jetzt das für den Mega88
1
 
2
GetSampleADC:
3
ldi  temp, (1<<ADSC) 
4
 sts    ADCSRA, temp          ; den ADC starten
5
6
 wait_adc01:
7
lds  temp, ADCSRA
8
sbrc    temp, ADSC            ; wenn der ADC fertig ist, wird dieses Bit gelöscht
9
    rjmp    wait_adc01
10
11
; ADC mit 10 Bit einlesen:
12
 lds      ADClow,  ADCL        ; immer zuerst LOW Byte lesen
13
 lds      ADChigh, ADCH        ; danach das mittlerweile gesperrte High Byte
14
 ret

von Martin (Gast)


Lesenswert?

ldi  temp, (1<<ADSC)
 sts    ADCSRA, temp          ; den ADC starten

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

von MichaelMüller (Gast)


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 :-(
1
;------------------------------------------------------------------------
2
;   Unterprogramm Mega88; liefert ein Sample vom ADC
3
;------------------------------------------------------------------------
4
#if defined(Mega88) && defined(_GetSampleADC)
5
 GetSampleADC:
6
  lds  temp, ADCSRA
7
  ori  temp, (1<<ADSC) 
8
  sts   ADCSRA, temp          ; den ADC starten
9
  
10
 wait_adc01:
11
  lds  temp, ADCSRA
12
  sbrc  temp, ADSC            ; wenn der ADC fertig ist, wird dieses Bit gelöscht
13
    rjmp    wait_adc01
14
15
; ADC mit 10 Bit einlesen:
16
    lds      ADClow,  ADCL        ; immer zuerst LOW Byte lesen
17
    lds      ADChigh, ADCH        ; danach das mittlerweile gesperrte High Byte
18
 ret
19
#endif

von Martin (Gast)


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.

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
Noch kein Account? Hier anmelden.