mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Serielles Signal bitweise einer Variable übergeben


Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen liebe µC-Gemeinde,

irgendwie scheint mir mein morgentlicher Kaffee nicht bekommen zu sein, 
denn ich steh bei einer simplen Angelegenheit total auf dem Schlauch!

Ich habe am Eingang meines µCs ein 12bit langes Signal und möchte dieses 
nun in einer Vari. ablegen.

Hierzu lesen ich das 1. Bit (MSB ist 0 oder 1^^) aus (funktioniert auch 
:)), übergebe dieses in meine Vari und schiebe alles um ein Bit nach 
links. Dann wiederhole ich das Ganze, bis ich meine 12 Bit abgearbeitet 
habe.

Wenn ich mir jetzt die Vari anschaue, verändert sich jedoch nur das Bit1 
(0 oder 1) und der Rest bleibt 0!

Danke für eure hoffentlich bald folgende Hilfe!

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn ich mir jetzt die Vari anschaue, verändert sich jedoch nur das Bit1
>(0 oder 1) und der Rest bleibt 0!

Wenn ich mir dein Programm so anschaue, solltest du es noch mal 
überarbeiten...

Autor: MarioT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
STK500-Besitzer schrieb:
> Wenn ich mir dein Programm so anschaue, solltest du es noch mal
> überarbeiten...

Ja. Zeile 42 stimmt nicht.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom schrieb:
> ... übergebe dieses in meine Vari ...

das bedeutet was genau?
Etwas konkreter Quelltext wäre förderlich.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, auch ohne Quältext und Prog-Sprache zu kennen, denke ich mal, dass 
es einen unterschied zwischen "schieben" (lsl) und "rotieren" (rol) 
gibt.

...

Autor: HildeK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom schrieb:
> ... übergebe dieses in meine Vari und schiebe alles um ein Bit ...

Dieses 'Übergeben' muss eine Oder-Verknüpfung sein, keine Zuweisung.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So Jungs und Mädels, hier ein kleiner Auszug meines "Quältextes"! X und 
Y diesen als Zwischenspeicher und Ausgabe als Ausgabe^^!

SSIBit++;
if(SSIBit>=12)
{
   SSIBit=0;
   Ausgabe=Y;
   Y=0;
}
X = GpioDataRegs.GPADAT.bit.GPIOA8;
X = X <<= SSIBit;
Y = Y | X;

Der Mist ähm ich meine der Code läuft jetzt und bringt mir das 
gewünschte Ergebnis! Jedoch bin ich für Tipps und Ideen gern offen!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom schrieb:

> X = X <<= SSIBit;

undefined behaviour

Enteweder

  X = X << SSIBit;

oder

  X <<= SSIBit;

aber nicht beides.

Autor: Martin Vogel (oldmax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
> irgendwie scheint mir mein morgentlicher Kaffee nicht bekommen zu sein,
> denn ich steh bei einer simplen Angelegenheit total auf dem Schlauch!
Das sehe ich auch so. Selbst bei der Beschreibung deines Problems bin 
ich etwas ins Grübeln gekommen....
> Ich habe am Eingang meines µCs ein 12bit langes Signal
Oh man, da hab ich doch glatt ein paar Monate meiner Ausbildung 
verschlafen...... bisher bin ich bei "Signal" davon ausgegangen, das da 
höchstens ein Bit oder irgendeine Spannung dahintersteckt, aber 12 Bit 
lang ? Kopfkratz...
Nun ja, was du brauchst, ist ein Doppelregister. Highbyte und LowByte
Dann kannst du schieben und ein beliebiges Bit auswerten, entweder im 
High- oder Low-Bereich, einfach dur abfragen des Bits. Die 16Bit 
Schiebebefehle hab ich jetzt nicht im Kopf, aber schau mal nach Carrybit 
(Schieben mit Übertrag)
Kann aj sein, ich hab das falsch verstanden, und du hast eine 
Signalfolge von 12 Bit an einem Eingangspin seriell. Dann brauchst du 
dazu einen Takt, um den seriellen Datenstrom auf ein  oder 2 Bytes 
hineinzuschieben.
Dazu dient das Schieben und eine Or-Verknüpfung mit dem empfangenen Bit 
zum Bspl. auf Bit0 deines Empfangsregisters.
in Assembler denk ich mir das so..
LDS Reg_1, InByte
AndI Reg_1,0b00010000 ; Empfangenes Bit ausmaskieren
SHR Reg_1
SHR Reg_1
SHR Reg_1
SHR Reg_1             ; Schieben bis Bit 0 erreicht
Or XL, Reg_1          ; Or Verknüpfung auf Lowbyte von Doppelregister X
SHL X                 ; XRegister 1 stelle nach links

Aber bitte, der Code ist mit Sicherheit nicht korrekt, da ich hier 
keinen Assembler habe, um mir den Syntax anzusehen, der Pseudo-Code soll 
nur eine Möglichkeit aufzeigen.
Gruß oldmax

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So vielleicht:
SSIBit++;
if(SSIBit>=12) {
   SSIBit=0;
   Ausgabe=Y&0xFFF;                         // Ausmaskieren statt löschen
}
Y<<=1;                                      // um eins weiterschieben
if( GpioDataRegs.GPADAT.bit.GPIOA8 ) Y=Y|1; // wenn nötig: 1 dazuverodern

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> So vielleicht:
>
> SSIBit++;
> if(SSIBit>=12) {
>    SSIBit=0;
>    Ausgabe=Y&0xFFF;                         // Ausmaskieren statt
> löschen
> }
> Y<<=1;                                      // um eins weiterschieben
> if( GpioDataRegs.GPADAT.bit.GPIOA8 ) Y=Y|1; // wenn nötig: 1
> dazuverodern
> 

Vorsicht. Das dreht die Bitreihenfolge um.

Autor: Udo R. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom schrieb:
> SSIBit++;
> if(SSIBit>=12)
> {
>    SSIBit=0;

Wie ist denn beim ersten Durchlauf die Variable SSIBit initialisiert? 
Wenn sie mit 0 initialisiert ist, dann werden beim ersten Durchlauf der 
(nicht sichtbaren Schleife) nur 11 Bit eingelesen, da Dein increment vor 
der Verarbeitung erfolgt.

Autor: Udo R. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>(MSB ist 0 oder 1^^)
Was willst Du damit sagen?

>Vorsicht. Das dreht die Bitreihenfolge um.
Kommt darauf an. Wenn das MSB zuerst kommt stimmts.

> X = X <<= SSIBit;
Hoppla hatte ich noch gar nicht gesehen, ist natürlich ziemlich Quatsch.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, jetzt habe ich den 2. Kaffee intus und langsam lichtet sich der 
Nebel. Danke für eure Hilfe.

Ich habe da wirklich ziemlichen Quatsch fabriziert, aber der Quatsch hat 
ja funktioniert;)!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Vorsicht. Das dreht die Bitreihenfolge um.
Sch....lags kaputt, dann eben so:
SSIBit++;
if(SSIBit>=12) {
   SSIBit=0;
   Ausgabe=Y&0xFFF;                             // Ausmaskieren statt löschen
}
Y>>=1;                                          // um eins weiterschieben
if( GpioDataRegs.GPADAT.bit.GPIOA8 ) Y=Y|0x800; // wenn nötig: 1 dazuverodern

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:

> Sch....lags kaputt, dann eben so:
>
> SSIBit++;
> if(SSIBit>=12) {
>    SSIBit=0;
>    Ausgabe=Y&0xFFF;                             // Ausmaskieren statt
> löschen
> }
> Y>>=1;                                          // um eins
> weiterschieben
> if( GpioDataRegs.GPADAT.bit.GPIOA8 ) Y=Y|0x800; // wenn nötig: 1
> dazuverodern
> 

Yup.

Ich würds wohl so machen, das ich mir neben dem SSIBit noch eine Maske 
zurecht legen, die jeweils um 1 nach links verschoben wird und bei 
Bedarf dazugeodert wird. Es spricht auch nichts dagegen dass SSIBit 
diese Maske ist.

(Ich hab schon gespannt, dass du den Shift mit variabler Länge 
wegkriegen willst :-)

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.