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
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.
Sorry, vergess meine letzte Bemerkung mit dem Takt, ist wohl in Transmit schon drin ;-)
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
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.
du hast in deiner ersten version "&&" verwendet => Wahrhetisabfrage dur solltest "&" UND verwenden
@ T. Schütz werd ich gleich nachher testen danke. Tobi
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.