Mega88 ADC0 will nicht

Gast #1254844
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
#1254856
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
Gast #1255072
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
Gast #1255261
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
Gast #1255275
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren