Forum: Mikrocontroller und Digitale Elektronik Mega88 adc Memory Mapped


von DerGast (Gast)


Lesenswert?

Hallo,

habe gerade einen Mega88 auf dem STK500 und bin am probieren den ADC in 
Betrieb zu nehmen.
Ein 22k Poti ist mit dem Schleifer am adc0 angeschlossen, die beiden 
aüsseren Pins des Poti sind an +5V und an GND angeschlossen.
Der Analogwert soll an PortD ausgegeben werden.
PortD ist mit den 8 LEDs auf dem STK verbunden.

Mein Code (Basierend auf 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC) läuft soweit, 
jedoch habe ich Änderungen vorgenommen damit ich auf die jetzt (Mega88) 
Memory Mapped ADC-Register zugreifen kann.
1
.include "m88def.inc"
2
.def temp1     = r16         ; allgemeines temp Register, zur kurzfristigen Verwendung
3
.def temp2     = r17         ; Register für 24 Bit Addition, Lowest Byte
4
.def temp3     = r18         ; Register für 24 Bit Addition, Middle Byte
5
.def temp4     = r19         ; Register für 24 Bit Addition, Highest Byte
6
7
8
 
9
    ldi     temp1, LOW(RAMEND)                  ; Stackpointer initialisieren
10
    out     SPL, temp1
11
    ldi     temp1, HIGH(RAMEND)
12
    out     SPH, temp1
13
     ldi        temp1,0xff
14
    out        ddrd,temp1
15
;    clr        temp1
16
    out        portd,temp1
17
18
 
19
; ADC initialisieren: ADC0, Vcc als Referenz, Single Conversion, Vorteiler 128
20
 
21
    ldi     temp1, (1<<REFS0) |(1<<ADLAR)          ; Kanal 0, interne Referenzspannung 5V, Analogwerte Linksbündig
22
    sts     ADMUX, temp1
23
    ldi     temp1, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
24
    sts     ADCSRA, temp1
25
26
27
28
sample_adc:
29
     ldi        temp1,1<<adsc|1<<aden
30
    sts     ADCSRA,temp1        ; den ADC starten
31
 
32
wait_adc:
33
34
    lds        temp1,adcsra
35
    andi    temp1,adsc
36
    brne    wait_adc
37
38
;    sbic    ADCSRA, ADSC        ; wenn der ADC fertig ist, wird dieses Bit gelöscht
39
;   rjmp    wait_adc
40
41
    lds      temp1, ADCL         ; immer zuerst LOW Byte lesen
42
    lds      temp1, ADCH        ; danach das mittlerweile gesperrte High Byte
43
    out        portd,temp1
44
    rjmp    sample_adc

Frage: Geht das auch eleganter, oder muss ich statt out immer mit LDS - 
STS arbeiten ?

Grüsse

von Uwe .. (uwegw)


Lesenswert?

Das Datenblatt ist da doch recht eindeutig:
> For the Extended I/O space from 0x60 - 0xFF in SRAM,
> only the ST/STS/STD and LD/LDS/LDD
> instructions can be used

von DerGast (Gast)


Lesenswert?

Danke dir, habs gefunden.
;-) Das Kleingedruckte muss man natürlich auch lesen.

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.