-
ADC Umwandlung
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
-
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
-
nimm den interrupt und schalte da immer um.
-
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...
-
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
-
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...
-
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?
Code:
; 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
-
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...
-
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.
-
habe leider kein avr studio zum simulieren, wo bekomme ich denn sowas her, dass ich simulieren kann?