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


von Tom (Gast)


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!

von STK500-Besitzer (Gast)


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...

von MarioT (Gast)


Lesenswert?

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

Ja. Zeile 42 stimmt nicht.

von Klaus W. (mfgkw)


Lesenswert?

Tom schrieb:
> ... übergebe dieses in meine Vari ...

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

von Hannes L. (hannes)


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.

...

von HildeK (Gast)


Lesenswert?

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

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

von Tom (Gast)


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!

von Karl H. (kbuchegg)


Lesenswert?

Tom schrieb:

> X = X <<= SSIBit;

undefined behaviour

Enteweder

  X = X << SSIBit;

oder

  X <<= SSIBit;

aber nicht beides.

von Martin V. (oldmax)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Lothar Miller schrieb:
> So vielleicht:
>
1
> SSIBit++;
2
> if(SSIBit>=12) {
3
>    SSIBit=0;
4
>    Ausgabe=Y&0xFFF;                         // Ausmaskieren statt
5
> löschen
6
> }
7
> Y<<=1;                                      // um eins weiterschieben
8
> if( GpioDataRegs.GPADAT.bit.GPIOA8 ) Y=Y|1; // wenn nötig: 1
9
> dazuverodern
10
>

Vorsicht. Das dreht die Bitreihenfolge um.

von Udo R. S. (Gast)


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.

von Udo R. S. (Gast)


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.

von Tom (Gast)


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;)!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Lothar Miller schrieb:

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

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 :-)

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.