Forum: Mikrocontroller und Digitale Elektronik Problem mit ADC bei AtMega2560 (assembler)


von Christian (Gast)


Lesenswert?

Hallo Leute :)
Ich hab vor mir einen Atmega2560. Ich möchte an ADC0 analog die Spannung 
messen, und sie binär auf Port L ausgeben. An Port L sind LED's 
angeschlossen damit ich was sehen kann.
Relevant sind nur die 8 hochwertigsten bits.

Damit es kein Durcheinander gibt soll man ja die Register ADCL und ADCH 
erst auslesen wenn der ADC mit dem Messen Rechnen etc. fertig ist.
Mit einem AtMega 8 hab ich das schon oft gemacht und da sind auch keine 
Probleme aber bei dem 2560' tauchen immer wieder neue Befehle auf wie 
STS und LDS und alte Codes und Schleifen funktionieren nicht mehr.

Ich hab da mal was gebastelt und es sieht aus als würde es 
funktionieren, aber kann da mal einer drüber sehen und mir sagen ob der 
auch wirklich in der Schleife ADC_wait wartet bis die Register ADCL und 
ADCH updatet sind ?

Mfg Christian

1
/*
2
 * ADC_übung.asm
3
 *
4
 *  Created: 19.12.2012 09:59:55
5
 *   Author: *************
6
 */ 
7
8
9
         ldi r16, HIGH(RAMEND)            ; HIGH-Byte der obersten RAM-Adresse
10
         out SPH,r16
11
         ldi r16, LOW(RAMEND)             ; LOW-Byte der obersten RAM-Adresse
12
         out SPL,r16
13
14
     ldi r16,255                          ; PORT L als ausgang
15
     STS DDRL,r16
16
17
     ldi r16, (0<<REFS1) | (1<<REFS0) | (1<<ADLAR) | (0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0)
18
     STS ADMUX,r16           ;REFEREZNSPANNUNG 5V (VCC) / Ausgabe linksbündig / Kanal0
19
20
     ldi r16, (0<<ACME) | (0<<MUX5) |(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0)
21
     STS ADCSRB,r16
22
23
     ldi r16, (1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
24
     sts ADCSRA,r16              ;ENABLE /  Vorteiler 128
25
26
27
loop:
28
29
          ldi r16, (1<<ADEN) | (1<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
30
         sts ADCSRA,r16          
31
32
         wait_adc:
33
         LDS r16,ADCSRA
34
         andi r16,0b01000000
35
36
         cpi r16,0b01000000
37
         breq wait_adc
38
39
40
         LDS r16,ADCL
41
         lds r17,ADCH
42
43
         STS portl,r17
44
45
rjmp loop

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

LDS r16,ADCSRA
 andi r16,0b01000000
 cpi r16,0b01000000
 breq wait_adc

funktioniert soweit.

 LDS r16,ADCSRA
 sbrc r16, ADSC
 rjmp wait_adc

ist kürzer.

Wenn Du linksbündig wandelst, kannst Du auch das Auslesen von ADCL 
sparen.

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.