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