mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik geht das denn überhaupt??


Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi!

habe ein problem. versuche gerade die uart zu verstehen und
programmiere. da gibt es ein tutorial.
unter "das uart" ist ein beispiel programm das test ausgeben soll.
ich habe es im avrstudio laufen lassen.
jedoch springt das programm beim ablauf, wenn es s ausgeben soll in die
endlosschleife am schluss.

woran liegt das? stimmt das programm nicht oder mach ich etwas falsch?

Autor: Frank Linde (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du meinst, nach dem
        ...
        ldi temp, 's'
        rcall serout

springt er nicht nach

serout:

sondern nach

        rjmp loop

?
Dann ist etwas faul. Welchen Controllertyp und welche Version des
AVRStudio benutzt Du?

Gruß, Frank

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein, also ich benutze einen atmega8!
und habe avrstudio version 4.08.

loop:   ldi temp, 'T'
        rcall serout                      ; Unterprogramm aufrufen
        ldi temp, 'E'
        rcall serout                      ; Unterprogramm aufrufen
  ldi temp, 'S'
        rcall serout                      ; ...
        ldi temp, 'T'
        rcall serout
        ldi temp, 10
        rcall serout
        ldi temp, 13
        rcall serout
    rjmp loop

serout:
        sbis UCSRA,UDRE

  rjmp serout

  out UDR, temp
        ret

läd das "s" noch in temp und springt dann auch in serout. aber da
springt er nicht mehr zurück. bleibt da immer drin in der schleife. bei
dem "T" und "E" macht er es richtig.
irgendwie wird der befehl:sbis UCSRA,UDRE wohl nicht erfüllt. versteh
aber nicht wieso und was er damit genau macht.?

Autor: Frank Linde (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, dann hat das Ganze eine logische Erklärung:

Schau Dir im ATmega8-Datenblatt auf Seite 130 mal das Diagramm an. Dort
sind zwei Sende-Register (UDR und TRANSMIT SHIFT REGISTER)
eingezeichnet. Bei Programmstart sind beide Register leer. Das Programm
schreibt jetzt das Byte für "T" nach UDR. UDR reicht es automatisch
weiter an das TRANSMIT SHIFT REGISTER und ist jetzt wieder leer. Das
Programm schreibt jetzt das Byte für "E" in UDR. Dammit sind beide
Register voll und es geht nicht mehr weiter, weil Du ja nur simulierst
und an der anderen Seite kein Empfänger sitzt, der die Daten abruft.

Diesen "Sendepuffer ist voll"-Zustand zeigt Dir das Bit 5 in UCSRA
an. Wenn Du dieses Bit manuell setzt, läuft das Programm auch
vernünftig weiter. Alles klar?

Gruß, Frank

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kriege ich irgendwie noch nicht auf die reihe!!!

das heisst dann dass ich die ausgangspuffer löschen muss????

aber wie mache ich das dann?
geht das denn nicht anderst???

ich muss folgendes problem mit dem ding lösen:
ich bekomme ein startsiganl und muss wenn das startsignal an dem
eingang anliegt ein datenstrom von 255 bits senden. und das
nacheinander, also seriell übertragen. das ist immer das gleiche
bitmuster, das bei so einem startsiganl gesendet werden soll. wobei 1
bit 100microsec lang sein soll. geht das denn dann überhaupt mit dem
baustein??

Autor: Frank Linde (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> das heisst dann dass ich die ausgangspuffer löschen muss????

Nein, nur im Simulator. Im Realbetrieb wird das TRANSMIT SHIFT REGISTER
die Daten ja an einen Empfänger los und setzt das Bit selbst.

>> ein datenstrom von 255 bits senden.

Wirklich 255 am Stück ohne Start- und Stopbit? Oder 8 x 1 Byte samt
Start- und Stopbit?

>> wobei 1 bit 100microsec lang sein soll. geht das denn dann
>> überhaupt mit dem baustein??

Ja, der ATmega8 kann das.

Gruß, Frank

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja gut, das sind dann immer pakete!!!

also starbit und dann 8 bit. dann 4 bit pause und dann wieder 1 start
und 8 datenbit... usw

Autor: Frank Linde (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... ich hab's nochmal mit Mathematica durchgerechnet, es sind wohl doch
eher 32 * 1 Byte. Meine Großmutter konnte noch Kopfrechnen...  ;-)

Gruß, Frank

Autor: Frank Linde (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun lüfte mal das Geheimnis. Was soll denn das werden?

Gruß, Frank

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
meinst du das von mir???

ich muss eine steuerung simulieren.

also an der rs232 ein bestimmtes signal liefern wenn danach gefragt
wird. normalerweise kommt das von einer pumpensteuerung. aber die wir
nicht eingebaut und damit keine fehler kommen wird dem rechner das
signal simuliert.

wenn ich es denn hin bekomme

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.