geht das denn überhaupt??

Gast #55727
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?
Gast #55728
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
Gast #55729
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.?
Gast #55730
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
Gast #55731
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??
Gast #55732
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
Gast #55736
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

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