mikrocontroller.net

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


Autor: Tobias A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Harry XS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Harry XS (Gast)
Datum:

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

Autor: Tobias A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Harry XS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: T.Stütz (Gast)
Datum:

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

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UART!!!
MW

Autor: Tobias A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ T. Schütz

werd ich gleich nachher testen danke.

Tobi

Autor: Jürgen Schuhmacher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tobias A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.