hi leute ich möchte ein schieberegister einlesen und hab mir das dabei ausgedacht. leider geht es nicht richtig prinzibiell kann man aber ports so einlesen (at89C4051) mfg zahl = 0; schieberegister = 0; for (i= 0; i<16; i++) { zahl++; schieberegister = schieberegister << 1;//so gehts in visuall basic if (P1_0 == 1) { schieberegister = schieberegister + 1; } schieberegister = schieberegister << 1; switch (zahl) { case 4: schieberegister = 0; break; case 8: zahl1 = schieberegister; schieberegister = 0; break; case 12: zahl2 = schieberegister; schieberegister = 0; break; case 16: zahl3 = schieberegister; schieberegister = (zahl1*100+zahl2*10+zahl3); break; } } }
Mal vom switch abgesehen würde ich es so machen:
1 | for (i= 0; i<16; i++){ |
2 | if(P1_0) |
3 | schieberegister |= 1; |
4 | |
5 | schieberegister <<= 1; |
6 | |
7 | }
|
Mehr brauch man eigentlich nicht machen. Musst nur noch dein Switch einbauen.
was mir net klar ist wieso muss bei visual basic das "schieberegister = schieberegister << 1;" vor der if anweisung stehen for(i = 0; i < 4; i++) { schieberegister = schieberegister << 1; if(Bit) schieberegister |= 1; } muss dann die "schieberegister = schieberegister << 1;" anweisung beim mycrocontroller nach der if anweisung kommen ?
Kann eigentlich nicht. for(i = 0; i < 4; i++) { if(Bit) schieberegister |= 1; schieberegister = schieberegister << 1; } sollte in vb irgentwie so aussehen: For i = 0 to 3 if bit == 1 then schieberegister = schieberegister | 1; 'geht das überhaupt so in vb? schieberegister = schieberegister << 1; Next i
Habe ich gerade ein Déjà vu? Es soll ja der enstprechende Wert für jedes Bit weiter geschoben werden. Ob eine 1 da steht entscheidet die if-Anweisung. Beispiel: Am Port liegt nacheinander 1,0,0,1,1 an: Dann würde also beim 1,4 und 5 Bit die If-Bedingung erfüllt sein und der Inhalt des Schieberegisters wird mit 1 VerODERt. Steht im Schieberegister vorher 01101100 würde nach der vorODERung 01101101 drin stehen und danach das ganze nach links geschoben werden, was dann 11011010 ergibt
jo und mir raucht der schädel vor laute bits und ports allso was muss ich nun nehmen?
Wie gesagt, ich würde es so machen:
1 | schieberegister = 0; |
2 | for(i = 0; i < 16; i++) |
3 | {
|
4 | if(Bit) |
5 | schieberegister |= 1; |
6 | schieberegister <<= 1; |
7 | }
|
aber bei dir ergibt es doch dann folgendes 1. schieberegister = 0; 2. for(i = 0; i < 16; i++) 3. { 4. if(Bit) 5. schieberegister |= 1; //zb 00000001 6. schieberegister <<= 1; //und dann 00000010 was 2 entspricht 7. }
und das wäre dann falsch weil man ja nur 00000001 eingibt und das entscpricht ja 1 und nicht 2
Nein, du willst doch z.B. beispiel ein Folge von einem Port einlesen und den dann in einem Register speichern oder nicht?
1 | schieberegister = 0 //Hier isses noch 0x00 |
2 | for(i = 0; i < 16; i++) |
3 | {
|
4 | if(Bit) // Wenn der Portpin auf 1 ist => erfüllt |
5 | schieberegister |= 1; //Ergibt 0x01 |
6 | schieberegister = schieberegister << 1; //ergibt 0x02 |
7 | }
|
Beim nächsten durchgang wird dann wieder das LSB (also das niederwertigste Bit) mit dem aktuellem Port-Wert belegt. Und das ganze dann eben 16 mal, so dass ...... argghhh.. mist verdammte. Haste räscht. Das muss natürlich vor das if. Weil sonst einmal zu viel geschoben wird. Oh man ist glaub zu warm heute.
1 | schieberegister = 0 //Hier isses noch 0x00 |
2 | for(i = 0; i < 16; i++) |
3 | {
|
4 | schieberegister <<= 1; |
5 | if(Bit) |
6 | schieberegister |= 1; |
7 | |
8 | }
|
Boa is mir das peinlich [/c]
Laß Dich nicht irre machen, Du mußt natürlich erst schieben und dann das Bit dazu odern. Anders machts keinen Sinn. Peter
jo es ist einfach zu warm mir gehts genauso aber ok zuerst schieben und dann...
^^Den Post hättest dir aber auch sparen können, da hab ich hier weitaus schlimmeres gesehen!
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.