mikrocontroller.net

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


Autor: Tina (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tina (Gast)
Datum:
Angehängte Dateien:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tina (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Tina (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: GastABC (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin L. (melvin_the_moose)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tina (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.