Forum: Mikrocontroller und Digitale Elektronik ATmega 8 ADC daten an RS232


von Tina (Gast)


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

von Tina (Gast)


Angehängte Dateien:

Lesenswert?

jaja und beim forumsbeitragschreiben bin ich genauso anfänger 
anscheinend... hier die datei, von der oben gesprochen wird^^

von Stefan E. (sternst)


Lesenswert?

Tina wrote:
> laut Adam Riese sollte ich jetzt eigendlich in 10 sekunden ungefähr
> 30.000 Zeichen über die USART geschickt bekommen.

Wie kommst du darauf? Ich sehe im Sourcecode eine Baudrate von 19200.

von Tina (Gast)


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

von Stefan E. (sternst)


Lesenswert?

Ja, denn mit 19200 Baud kannst du nur max 1920 Zeichen/s übertragen.

von Tina (Gast)


Lesenswert?

ok, nun hast du mich verwirrt... ich dachte die Baud-Rate WÄRE 
Zeichen/sek... warum plötzlich der teilungsfaktor 10 auf 1920 
zeichen/sek??

von GastABC (Gast)


Lesenswert?

baudrate sin Bit/sek, nicht Byte/sek :) Pro zeichen übertragst du 10 
Bit: 1 Start, 8 Daten- und ein Stopbit

von Stefan E. (sternst)


Lesenswert?

Nein, bei einer normalen seriellen Schnittstelle sind Baud gleich Bit/s. 
Und du hast 1 Startbit, 8 Datenbits und 1 Stopbit, also 10 Bit/Zeichen.

von Martin L. (melvin_the_moose)


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.

von Stefan E. (sternst)


Lesenswert?

Es gibt eine globale Variable s:
char s[2];

@ Tina:
Das Array ist aber zu klein, es müssen 3 Zeichen rein passen.
2 Zeichen für den Hex-Wert und zusätzlich noch die Null-Terminierung.

von Tina (Gast)


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

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.