Problem bei serieller datenübertragund / datenvorbereitung

Gast #140248
Lesenswert?

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 #140249
Lesenswert?

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 #140251
Lesenswert?

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 #140256
Lesenswert?

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 #140257
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren