mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik schieberegister einlesen


Autor: hab ein problem (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
    }

}
}

Autor: hab ein problem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
am ende kommte ne zahl raus aber nur beim testen mit visual basic
mfg

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal vom switch abgesehen würde ich es so machen:
for (i= 0; i<16; i++){
  if(P1_0)
    schieberegister |= 1;

  schieberegister <<= 1;

}
Mehr brauch man eigentlich nicht machen. Musst nur noch dein Switch
einbauen.

Autor: hab ein problem (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hab ein problem (Gast)
Datum:

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

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie gesagt, ich würde es so machen:
schieberegister = 0;
for(i = 0; i < 16; i++)
{ 
  if(Bit)
    schieberegister |= 1;
  schieberegister <<= 1;
} 

Autor: hab ein problem (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
      }

Autor: hab ein problem (Gast)
Datum:

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

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, du willst doch z.B. beispiel ein Folge von einem Port einlesen und
den dann in einem Register speichern oder nicht?
schieberegister = 0 //Hier isses noch 0x00
for(i = 0; i < 16; i++)
{ 
  if(Bit)    // Wenn der Portpin auf 1 ist => erfüllt
    schieberegister |= 1;   //Ergibt 0x01
  schieberegister = schieberegister << 1;  //ergibt 0x02
} 
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.
schieberegister = 0 //Hier isses noch 0x00
for(i = 0; i < 16; i++)
{
  schieberegister <<= 1;
  if(Bit)    
    schieberegister |= 1;  

} 
Boa is mir das peinlich
[/c]

Autor: Peter Dannegger (peda)
Datum:

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

Anders machts keinen Sinn.


Peter

Autor: hab ein problem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jo es ist einfach zu warm
mir gehts genauso

aber ok zuerst schieben und dann...

Autor: joi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
prinzibiell? lol, lern deutsch.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
^^Den Post hättest dir aber auch sparen können, da hab ich hier weitaus
schlimmeres gesehen!

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.