ATmega 8 ADC daten an RS232

Gast #839341
Lesenswert?
• ▲
▼
Das angehängte Programm soll folgende Funktion ausführen:

jede ms soll eine AD Wandlung durchgeführt werden und diese via USART an 
ein Funkmodul geschickt werden. zwischen jedem AD Wert soll zusätzlich 
noch ein '$' gesendet werden damit ich die Werte an der Empfängerseite 
dann sicher wieder auseinanderklauben kann.

Der Verwendete Controller ist übrigens ein Atmega8 mit einem externen 
12MHz Quarz.

laut Adam Riese sollte ich jetzt eigendlich in 10 sekunden ungefähr 
30.000 Zeichen über die USART geschickt bekommen. (wurde zur kontrolle 
an den PC gehängt und das ergebnis einfach mit word durchgezählt). Real 
bekomm ich aber nur ca. 15.000 Zeichen in 10 Sekunden geschickt.

Könnte es vllt daran liegen, dass der ganze Wandel-&-Senden ablauf (laut 
meinen berechnungen) bis zu 275µs dauern kann und das für die ISR zu 
lange ist? bzw. wie lang sollte ein ISR höchstens sein? und wenn ja, wie 
kann ich dies besser realisieren?

wäre für hilfe sehr dankbar, da von der funktion dieses programms meine 
matura abhängt und ich in punkto controller-programmieren ziemliche 
anfängerin bin!

mfg und danke im vorraus
tina
Gast #839351
Lesenswert?
• ▲
▼
ich aktivier den ADC alle ms und schick diesen 8bit wert an die uart, 
danach noch ein einzelnes zeichen. das sind pro ms 3 zeichen -> alle s 
3000 zeichen -> alle 10 sek. 30.000 zeichen... so wars zumindest 
gedacht, oder hab ich da ein grundlegendes verständnisproblem?

lg
tina
#839391
Lesenswert?
• ▲
▼
Läßt sich der Quellcode compilieren?
In der ISR TIMER0_OVF_vect wird eine Variable "s" verwendet:
>uart_puts( itoa( result, s, 16 ) );//HEX-Zahlen in Ascii umwandeln
Soweit ich erkennen kann, ist "s" in diesem Block aber gar nicht 
bekannt, oder habe ich etwas übersehen?

Ein Vorschlag f.d. Design:
Starten des ADC im Timerinterrupt (1000 Samples/Sek). Im ADC-Interrupt 
wird das Zeichen direkt an die UART gesendet, falls diese frei ist. 
Falls nicht, wird das Zeichen in einen zu definierenden FIFO 
geschrieben. Die UART-Tx-ISR müßte dann den FIFO kontrollieren und 
wartende Zeichen senden. So kann alles ohne aktives warten erledigt 
werden und die CPU-Last dürfte sich im Promillebereich bewegen.
Gast #839519
Lesenswert?
• ▲
▼
ok ich hab das jetzt dank einem bekannten von mir so gelöst, dass ich 
mit nem timer alle 2ms den ADC auslöse (reicht auch und passt in die 
19200 baud) und der ADC löst mir dann nen interrupt aus wenn er fertig 
is der das ADC Register mitm wert ausliest und im mainprogramm wird 
einfach ständig überprüft ob "da was zum senden da ist".... von ner 
anfängerin beschrieben und dementsprechend unverständlich, aber es 
funktioniert :)

danke für die schnelle hilfe!
lg
tina

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren