Hallo zusammen,
ich nutze einen Atmega8 zur AD-Wandlung. Dieser soll konstant alle 20ms
einen digitalisierten Messwert über die USATR versenden.
Wie aus dem Anhang (Code) ersichtlich: Taktrate=7372800Hz; Vorteiler
1024; Timer0= 256 Takte/Overflow; Timerwert=112 (gesetzt) => 50
Overflows/sec.
Der Eingang PinB0 liegt die ganze Zeit auf low.
Warum kann ich nicht alle 20ms einen Wert am UART, empfangen???
DAs Oszilloskop zeigt nicht kontinuierlich, immer mit Aussetzern, die
Werte.
Hilfe, bin schon den ganzen tag auf fehler suche!
Danke
Adrian
- Sichere in den ISRs das SREG (!!!)
- Lass in der Timer ISR die interrupts aus und
- Benutz den ADC-Interrupt für das Senden des ADC-Werts, oder
- setz in der Timer-ISR ein Flag (Register oder SRAM), dass von der
Main-Loop abgefragt wird und die macht dann die Messung
- du solltest wahrscheinlich nicht einfach so das ADMUX-Register ändern
(hier: in der Receive-ISR)
hth. Jörg
Jörg X. wrote:
> - Sichere in den ISRs das SREG (!!!)> - Lass in der Timer ISR die interrupts aus und> - Benutz den ADC-Interrupt für das Senden des ADC-Werts, oder> - setz in der Timer-ISR ein Flag (Register oder SRAM), dass von der> Main-Loop abgefragt wird und die macht dann die Messung> - du solltest wahrscheinlich nicht einfach so das ADMUX-Register ändern> (hier: in der Receive-ISR)>> hth. Jörg
Wenn du nur ein Bit setzt in der ISR brauchst du kein SREG zu sichern
:-))
EDIT: Grrrr. Moment: Galt das nur für SBI/CBI und nicht für SBR/CBR? Ich
ziehe meine Aussage erstmal zurück ;)
EDIT2: Jap, SBR ist ja nur ein ORI -> SREG sichern.
hallo,
die fuses-bits sind richtig gesetzt (habe ihc dem Datenblatt entnommen).
Werde das Prog.umschreiben, kann es erst wieder am Mo. am System
ausprobieren, aber schon mal vielen Dank!!!
Wenn es nicht funk.sollte dann melde ich mich am Mo. wieder.
Aber die Vorschläge klingen gut!
Wenn noch jemanden was auffällt, immer raus mit der Sprache!
Noch mal Danke und schönes We.
Adrian
Hallo Leute, spez.Jörg X.,
habe grade das Prog. umgeschrieben.
Mir ist aber nicht klar, was mit:
> - du solltest wahrscheinlich nicht einfach so das ADMUX-Register ändern> (hier: in der Receive-ISR)
gemeint ist. Wie soll ich denn die ADU Eingänge sonst umschalten???
Aktuelles Prog. im Anhang.
gruß
adrian
Ich habe mal versucht meine ASM-Kenntnisse auszupacken (programmiere
lieber in C). Ergebnis siehe Anhang (der Anhang geht nur ohne Vorschau,
btw.).
Mein Programm nutzt ein Flag-Register 'flags' und ein Byte im SRAM für
den nächsten ADC-Kanal. Sowohl bei der Messung, als auch beim Senden des
Messwerts gibt's Busy-Wait, was sicher unpraktisch für
größere/kompliziertere Anwendungen ist.
hth. Jörg (der das aus Spass an der Freud' gemacht hat)
ps.: die Kanalauswahl könnte man mit (UDR - 'A') stark vereinfachen ;)
pps.: das Programm ist nur im Simulator getestet, scheint(!) aber zu
funktionieren, was die Interrupts angeht