www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie handelt man 16 bit zum PC per Serielle Schnittstelle


Autor: noname (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo


ich steh wieder mal vor einem Problem. Wie kann man ein Wort (16
Bit->ist ein Messwert von einem AD_Wandler) zu einem PC senden. Und wie
erkennt der PC welcher HighByte und welcher LowByte ist?

DANKE

Autor: formtapez (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Denk Dir doch einfach ein Protokoll aus, was Sender und Empfänger
verstehen.

z.B.: STX LO HI ETX

MfG
formtapez

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternativ Ascii-Übertragung mit Trennzeichen.
Wert: 32768
gesendet wird: 0x33, 0x32,0x37,0x36,0x38,0x0d,0x0a

Autor: noname (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hab ich schon mir so gedacht, nur wie greife ich im Mikrocontroller
auf das High und Lowbyte einzeln in C zu?

Autor: Maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lowbyte = (WORD&0xFF);
hibyte = ((WORD&0xFF00)>>8);

Gruß,
Maddin

Autor: noname (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
manchmal sieht man den Wald vor Bäumen nicht ;)

DANKE

mir ist noch was eingefallen. Kann ich nicht einfach ein Wortzeiger der
auf die Adresse von der Variable zeigt und dann einfach das Highbyte
auslesen, dann die Adresse um 8 (ein Byte) erhöhen und dann nochmal
lesen? Währe das in einem Mikrocontroller ineffektiv?

Autor: Joern Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder einfach 2 serielle Leitungen nehmen... ;-))

Nee, meistens liegen die Bytes ja bereits einzeln vor, dann ist es
natürlich am schnellsten sie genauso nacheinander abzusenden, also z.B.
beim AD-Converter des AVR liegen die 10bit ja im Register ADC, auf die
High- und Low-Bytes kann man jedoch auch direkt zugreifen mit ADCH und
ADCL. Dabei das Datenblatt beachten, welche Reihenfolge evtl.
erforderlich ist, damit nicht das 2.Byte vom Controller geändert wird,
während man noch das erste ausliest.

Würde also beim AVR (mit winavr) so aussehen:

loop_until_bit_is_set(UCSRA, UDRE);  //wait if UART is still busy
UDR = ADCL;          //send char
loop_until_bit_is_set(UCSRA, UDRE);  //wait if UART is still busy
UDR = ADCH;          //send char

cu joern

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.