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


von Ralph (Gast)


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?

von Frank Linde (Gast)


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

von Ralph (Gast)


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.?

von Frank Linde (Gast)


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

von Ralph (Gast)


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??

von Frank Linde (Gast)


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

von Ralph (Gast)


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

von Frank Linde (Gast)


Lesenswert?

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

Gruß, Frank

von Frank Linde (Gast)


Lesenswert?

Nun lüfte mal das Geheimnis. Was soll denn das werden?

Gruß, Frank

von Ralph (Gast)


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

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.