Forum: Mikrocontroller und Digitale Elektronik schieberegister einlesen


von hab ein problem (Gast)


Lesenswert?

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;
    }

}
}

von hab ein problem (Gast)


Lesenswert?

am ende kommte ne zahl raus aber nur beim testen mit visual basic
mfg

von Timmo H. (masterfx)


Lesenswert?

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.

von hab ein problem (Gast)


Lesenswert?

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 ?

von Timmo H. (masterfx)


Lesenswert?

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

von Timmo H. (masterfx)


Lesenswert?

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

von hab ein problem (Gast)


Lesenswert?

jo und mir raucht der schädel vor laute bits und ports
allso was muss ich nun nehmen?

von Timmo H. (masterfx)


Lesenswert?

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
}

von hab ein problem (Gast)


Lesenswert?

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

von hab ein problem (Gast)


Lesenswert?

und das wäre dann falsch weil man ja nur 00000001 eingibt
und das entscpricht ja 1
und nicht 2

von Timmo H. (masterfx)


Lesenswert?

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]

von Peter D. (peda)


Lesenswert?

Laß Dich nicht irre machen, Du mußt natürlich erst schieben und dann das
Bit dazu odern.

Anders machts keinen Sinn.


Peter

von hab ein problem (Gast)


Lesenswert?

jo es ist einfach zu warm
mir gehts genauso

aber ok zuerst schieben und dann...

von joi (Gast)


Lesenswert?

prinzibiell? lol, lern deutsch.

von Timmo H. (masterfx)


Lesenswert?

^^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
Noch kein Account? Hier anmelden.