Forum: Mikrocontroller und Digitale Elektronik Preamble+Messwert über UART versenden in asm


von Moschder (Gast)


Lesenswert?

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

von tastendrücker (Gast)


Lesenswert?

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

von Moschder (Gast)


Lesenswert?

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

von tastendrücker (Gast)


Lesenswert?

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.

von Moschder (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Spess53 (Gast)


Lesenswert?

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

von Moschder (Gast)


Lesenswert?

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?

von Spess53 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.