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!
>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...
STK500-Besitzer schrieb: > Wenn ich mir dein Programm so anschaue, solltest du es noch mal > überarbeiten... Ja. Zeile 42 stimmt nicht.
Tom schrieb:
> ... übergebe dieses in meine Vari ...
das bedeutet was genau?
Etwas konkreter Quelltext wäre förderlich.
Naja, auch ohne Quältext und Prog-Sprache zu kennen, denke ich mal, dass es einen unterschied zwischen "schieben" (lsl) und "rotieren" (rol) gibt. ...
Tom schrieb:
> ... übergebe dieses in meine Vari und schiebe alles um ein Bit ...
Dieses 'Übergeben' muss eine Oder-Verknüpfung sein, keine Zuweisung.
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!
Tom schrieb:
> X = X <<= SSIBit;
undefined behaviour
Enteweder
X = X << SSIBit;
oder
X <<= SSIBit;
aber nicht beides.
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
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 |
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.
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.
>(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.
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;)!
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 |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.