PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC Umwandlung



derfixej
08.03.2006, 14:19
hallo,

ich will mit dem atmega8 2 analoge signale kontinuierlich umwandeln und
das ergebnis im sram für weitere verarbeitung zur verfügung stellen.
mache sowas zum ersten mal und scheitere schon an der initialisierung.
mit einem eingang ist es klar.

mit ADPS vorteiler einstellen
mit ADEN generell einschalten
in ADMUX kanal wählen
mit ADFR free run wählen
mit ADSC umwandlung starten

aber wie soll ich das machen wenn ich zwei eingänge kontinuierlich
abfragen will?

gruß jens

askazo
08.03.2006, 14:51
Beide Eingänge gleichzeitig abfragen ist nicht möglich.
Du musst den ersten Eingang einlesen, den Multiplexer umschalten und dann den zweiten Wert einlesen.

Die Initialisierung ist ja schon so weit ok.
In Deiner ADC-Einlese-Funktion musst Du dann
- Auf ADIF warten
- Ergebnis aus ADCL/ADCH in eine Variable schreiben
- Im ADMUX-Register den Kanal wechseln
- Wieder auf ADIF warten
- Ergebnis in eine zweite Variable schreiben
- Wieder auf den Ursprungs-Kanal schalten.

Gruß,
askazo

Superhirn
08.03.2006, 15:01
nimm den interrupt und schalte da immer um.

nabla
08.03.2006, 15:05
Benötigst Du wirklich sehr kontinuierliche Signale? Sonst mach die einen Interrupt der jede 1 Sekunde aufgerufen wird und lese in der einen Sekunden den ersten Kanal und in der zweiten Sekunde den 2 . Kanal und so weiter... Dann benutzt Du in diesen Interrupt jeweils eine Single Conversion...

derfixej
09.03.2006, 07:23
letzteres hört sich auch interessant an. ein abfrage jede sekunde sollte eigentlich reichen. ich hatte allerdings gehofft ohne interrupt auszukommen. kann mir da jemand mal ein beispiel tippen, wie so ein interrupt aussehen könnte, der jede sekunde aufgerufen wird? hab das noch nicht so geschnallt mit den interrupts. ](*,)

danke
gruß jens

nabla
09.03.2006, 13:10
Du stellst den Prescaler auf einen bestimmten Wert. Beispiel: 8MHz/256 = 31,25kHz --> Periodendauer= 32 mikrosec.

1Sekunde / 32 Mikrosec = 31250

Also musst Du ins Compareregister 31250 einstellen und den Prescaler auf 256.

Weiß jetzt leider vom MEGA8 nicht die Register auswendig. Aber ich schau mal nach...

derfixej
09.03.2006, 13:55
habe es jetzt einfach mit einer schleife versucht zu lösen.
kann man das so machen? geht das so einfach die werte danach ins sram zu speichern?



; Start, Power ON, Reset
main: ldi r16, lo8(RAMEND)
out SPL, r16
ldi r16, hi8(RAMEND)
out SPH, r16

;Initialisierung ADC
ldi r17, 0b10000... ;ADC enable, vorteiler
out ADCSRA, r17


;---------------------------------------------------------------------------
mainloop: wdr
rjmp loop

rjmp mainloop
;---------------------------------------------------------------------------
;.equ wert1L, 0x0060
;.equ wert1H, 0x0061
;.equ wert2L, 0x0063
;.equ wert2H, 0x0064

;ersten eingang umwandeln und sichern
loop: ldi r16, 0 ;auswahl chanel 0
out ADMUX, r16
sbi ADCSRA, ADSC ;wandlung starten
warte1: sbis ADCSRA, ADIF ;abfrage ob umwandlung schon beendet ist ADIF=1
rjmp warte1
in r18, ADCL ;die unteren 8bits in r18 speichern
in r19, ADCH ;die oberen 2bits in r19 speichern
sts wert1L, r18 ;wert in sram schreiben
sts wert1H, r19

;zweiten eingang umwandeln und sichern
ldi r16, 1 ;auswahl chanel 1
out ADMUX, r16
sbi ADCSRA, ADSC ;wandlung starten
warte2: sbis ADCSRA, ADIF ;abfrage ob umwandlung schon beendet ist ADIF=1
in r20, ADCL ;die unteren 8bits in r20 speichern
in r21, ADCH ;die oberen 2bits in r21 speichern
sts wert2L, r20 ;wert in sram schreiben
sts wert2H, r21
ret




gruß jens

nabla
09.03.2006, 14:09
Sorry, ich programmiere nur in C, deshalb kann ich Dir jetzt so auf Anhieb nicht sagen ob das korrekt ist... Vielleicht hilft ja noch ein anderer...

Superhirn
09.03.2006, 14:19
simuliers mal in avr-studio. dann schaust ob die bits richtig gesetzt werden usw und dann rauf auf den uC damit und weiter gehts. ich kann ja auch nur c.

derfixej
10.03.2006, 08:22
habe leider kein avr studio zum simulieren, wo bekomme ich denn sowas her, dass ich simulieren kann?

Superhirn
10.03.2006, 08:34
lad dir avr-studio auf www.atmel.com runter. dann öffnest damit die hexfile und drückst dann immer F10 um einen schritt weiterzukommen. dann siehst eh auf der rechten seite, ob die bits wohl richtig gesetzt werden. dann proggs mal in den avr.
oder lade dir vmlab herunter. ich weiß aer nicht wiest es bedienst.

derfixej
10.03.2006, 08:48
danke nochmal, werd ich machen und ausprobieren.

gruß jens

nabla
15.03.2006, 07:40
Und hat es funktioniert?