Forum: Mikrocontroller und Digitale Elektronik Problem bei serieller datenübertragund / datenvorbereitung


von Tobias A. (Gast)


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

von Harry XS (Gast)


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.

von Harry XS (Gast)


Lesenswert?

Sorry, vergess meine letzte Bemerkung mit dem Takt, ist wohl in Transmit
schon drin ;-)

von Tobias A. (Gast)


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

von Harry XS (Gast)


Lesenswert?

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.

von T.Stütz (Gast)


Lesenswert?

du hast in deiner ersten version "&&" verwendet => Wahrhetisabfrage
dur solltest "&" UND verwenden

von Michael Wilhelm (Gast)


Lesenswert?

UART!!!
MW

von Tobias A. (Gast)


Lesenswert?

@ T. Schütz

werd ich gleich nachher testen danke.

Tobi

von Jürgen Schuhmacher (Gast)


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.

von Tobias A. (Gast)


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

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.