Hallo zusammen, arbeite mit einem ATMEGA8 mit AVR Studio und programmiere in Assembler. In einem Register habe ich einen 1 Byte großen Messwert stehen, diesen möchte ich mit einer Premable versehen und über das UART versenden. Nun möchte ich wissen wie ich das angehen muß, es soll ein String versendet werden bestehend aus Preamble und Messwert. Muß ich die Bytes für den String im RAM einzeln zusammebasteln? Falls ja, wie sage ich dem UART wo im RAM er sich die Daten holen muß? Kann mir da jemad helfen? danke schonmal Moschder
Ich weiss ja nicht, wie es beim ATMEGA8 ist (bin ein PICer), aber eigentlich ist es so, dass der UART immer nur ein Byte sendet und zwar dass, das im Senderegister (TXREG) steht. Wenn du 2 (oder mehr) Bytes senden willst, musst du die nacheinander ins TXREG schreiben. Dabei darfst du das nächste Byte immer erst ins TXREG schreiben, wenn das vorige komplett gesendet wurde. Das kannst du interruptgesteuert machen oder das "byte-ist-fertig-gesendet-und TXREG-wieder-frei" Flag abfragen. Wenn du immer eine unterschiedliche Anzahl Bytes senden willst, solltest du das über einen Ringpuffer machen (einfach mal suchen).
danke für Deine Antwort, wie Du sagst sendet der ATMEGA8 auch immer nur ein Byte. Das zu sendende Byte wird in UDR geschrieben. Nun brauche ich aber eine Routine die mir erstmal die Preamble sendet (damit ein Funkempfänger einschwingt) und direkt daruf meinen Messwert. Nun weiß ich nicht wie ich das in Assembler umsetzen soll. Gruß Moschder
Dazu solltest du vielleicht erst einmal zeigen, was du schon hast. Dann wird dir sicher schnell jemand weiterhelfen. Da ich - wie gesagt - aus der PIC -Ecke komme, kann ich selbst nur bedingt helfen.
hier mal der Code mit dem ich versuche einen String über UART zu versenden. Das UART wurde erfolgreich initialisiert. Auf der Empängerseite hängt mein PC mit dem Hyperterminal, die Preamble lässt sich fortlaufend empfangen. Der nachfolgende Messwert bleibt jedoch aus. Das Programm hängt sich also nach dem senden der Preamble auf und sendet diese fortlaufend aus.
Hi So wie das geschrieben ist läuft dein Programm nach dem Unterprogrammaufruf wieder in das Unterprogramm. Da sollte beispielsweise ein: aaaa: rjmp aaaa stehen. Da hält das Programm dann an. Was passiert wenn dein Messwert 0 ist? Hier wäre ein Bytezähler angebracht. Mit String hat das Ganze auch nicht viel zu tun. Strings bestehen aus ASCII-Zeichen. Also Hex $20-$7F. MfG Spess
danke spess, daß mein Programm nie aus dem Unterprogramm rausgekommen ist war ein Problem, das ist nun mit einem zusätzlichen ret behoben. Nach diesem neuen ret soll es nun im eigentlichen Hauptprogramm weitergehen. Leider bleibt das ganze noch immer hängen komme also nie ins eigentlíche Hauptprogramm zurück. Auch der Tipp mit Messwet 0 ist viel Wert, das werde ich auch noch berücksichtigen. Jetzt zu testen ist es nicht von Belagen da ich als Messwert erstmal nur Werte >0 habe. Wäre Frame der treffendere Begriff?
Hi Wie du das nennst ist eigentlich egal. Der AVR kennt eh keine Strings. Übrigens: >and temp1,temp1 ; Frame zu ende (0x00)? lässt sich durch 'tst rxy' ersetzen. Noch eine persönliche Meinung: Was soll dieses 'temp'-Geraffel? Ich finde ein 'r16' aussagekräftiger und ich brauche weniger zu tippen. MfG Spes
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.