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
jaja und beim forumsbeitragschreiben bin ich genauso anfänger anscheinend... hier die datei, von der oben gesprochen wird^^
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.
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
Ja, denn mit 19200 Baud kannst du nur max 1920 Zeichen/s übertragen.
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??
baudrate sin Bit/sek, nicht Byte/sek :) Pro zeichen übertragst du 10 Bit: 1 Start, 8 Daten- und ein Stopbit
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.