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?
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
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.?
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
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??
>> 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
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
... ich hab's nochmal mit Mathematica durchgerechnet, es sind wohl doch eher 32 * 1 Byte. Meine Großmutter konnte noch Kopfrechnen... ;-) Gruß, Frank
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.