Problem bei serieller datenübertragund / datenvorbereitung

Gast #140248
Hi

irgendwie stehe ich hier grade auf dem Schlauch.
Ich habe einen 8 bit-wert in einer Char-Variablen abgelegt
und will den jetzt seriell übertragen.
Wenn ich zum beispiel 0xAA habe ist das ja binär
1010 1010.
Wie bringe ich denn meinen AVR dazu aus dem Char so was zu
machen?
Überlegung war

wert=0xAA;
if(wert && 0x01)
{
transmit(1);
}
else
{
transmit(0);
}
danach das ganze mit 0x02, 0x04, 0x08... usw.

wenn ich das allerdings probiere klappt das nicht.
Warum?
Wie gesagt stehe grad irgendwie TIERISCH auf dem Schlauch.

Gruss
  Tobi
Gast
Hallo Tobias,

was hälst du davon, das Byte immer stückweise nach rechts durch den
Carry zu schieben, das Carry abzufragen, Falls Carry gesetzt -> 1
senden, falls Carry clear -> 0 senden, Carry löschen, wieder einen
schritt nach rechts und nochmal von vorne?

Ich kenne die entsprechenden Befehle in Basic (Bascom?) leider nicht,
aber in AVR Assembler ungefähr so:

ldi TMPY,8
ldi TMPX,0b10101010
loop:
    clc  ; Carry löschen
    ror TMPX
    brcs sende_1
    cbi OUTPORT,OUTPIN
    rjmp loopende
sende_1:
    sbi OUTPORT,OUTPIN
loopende:
    dec TMPY
    brne loop
ende:

Hmmm, vielleicht musst du einfach nur einen Takt einbauen, ansonsten
geht die Übertragung zu schnell!? und du siehst nur das letzte Bit.

Gruss, Harry.
Gast
Hmm
kling gut. Nur wie in C machen?

Es muss irgendwie so gehen wie da oben.
Ich hab so was irgendwann schonmal gemacht (ewig her)
daher weiss ich das es irgendwie geht.
Fragt sich halt nur wie.
Gruss und Danke
  Tobi
Gast
Ooops, das war C (Schande über mein Haupt) ;-)

bitweises Verschieben eines INTEGERS ">>"
geht, jedoch den Überlauf zu entdecken weiss ich nicht wie.

Muss ein C Mensch beantworten, sorry.
Gast
UART ist ein gutes Stichwort- doch glaube ich, er will oder kann keine
benutzen, sonst würde er ja nicht fragen. :D

Das Prinzip ist oben ja schon angeklungen und über das Carry muss man
keineswegs gehen, sondern einfach das niedrigste BIT durch Ver-UND-ung
des aktuellen Bytes mit 0x01 extrahieren und direkt senden.
Logischerweise muss dann 8x rotiert werden. Zu beachten ist, ob das LSB
zuerst gesendet wird, oder das MSB. Im letzteren Falle muss mit 0xff
maskiert und auf zero/nonzero geprüft werden. In meiner 8-Bit-Zeit habe
ich es z.T: auch so gemacht, daß ich ein küstliches Hi-Byte benutzt
habe, daß per Addition mit 0 geladen wurde ("ADC"). Kam es dann im
LoByte (dem eigentlich rotierenden Arbeitsbyte) zu einem overflow, so
hatte man im Hi-Byte direkt das zu sendende Ergebnis stehen.

Was oben noch nicht steht: Zu einer ordentlichen seriellen Übertragung
gehören auch noch START, STOP und PARITY-Bits.
Gast
Hi

danke für all die Hinweise. Mittlerweile gehts.
Es ist eine Art von SPI, deshalb fällt UART raus.
Wenn ich den gebraucht hätte, hätte der Mega64 ja
gleich 2 gehabt. Trotzdem danke für den Hinweis.

Gruss an alle
  Tobi

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.