Forum: Compiler & IDEs Pin einlesen und schieben


von Klausi (Gast)


Lesenswert?

Hallo,

ich habe mal eine Verständnisfrage:

Wie kan ich den Wert an einem PIN einlesen und diesen in eine Variable 
schieben? Also quasi serielles Einlesen.
Ich verstehe einfach nicht die schiebe operation...

daten=(PINXY<<1);

von Johannes M. (johnny-m)


Lesenswert?

Klausi wrote:
> Ich verstehe einfach nicht die schiebe operation...
>
> daten=(PINXY<<1);
Was verstehst Du daran nicht? Die Anweisung schiebt den Wert von PINXY 
um eine Stelle nach links (wobei rechts eine Null eingefügt wird) und 
weist das Ergebnis der Variable daten zu.

von Klausi (Gast)


Lesenswert?

Ich will aber den Wert von PINXY einlesen und dann eine Stelle nach 
links schieben und dann das ganze wiederholen.

Müsste dies dann so aussehen:

for(...)
{
   daten|=(PINXY<<1);
}

von Marius W. (mw1987)


Lesenswert?

Das ganze würde so funktionieren:
1
for(int i=0; i<(sizeof(daten)*8); i++)
2
{
3
  daten = (daten << 1) | PINXY;
4
}

MfG
Marius

von Klausi (Gast)


Lesenswert?

@Marius

Ich habe versucht deinen Code zu simulieren. Was mich wundert ist dass 
beim ersten mal eine 5 (dez) in daten steht, dann eine 15, 31, 63, 127 
...
Und dann das ganze obwohl ich PINB5 garnicht gesetzt habe. Es hat keine 
Auswirkung ob ich PINB% setze oder nicht!

Ich werde nochmal verrückt, ich raffs einfach nicht.

PB5 ist als Eingang initalisiert worden.

von Philipp B. (philth)


Lesenswert?

Hm, also in C ist der kleinste Datentyp doch sowieso "char", das wären 
schonmal 8 bit.

Warum schiebst du nicht einfach das komplette Byte in eine Variable und 
verwendest dann einen Ausdruck wie
1
if(dein_port & (1 << dein_bit_oder_pin)
2
zielvarialbe=1;
3
else zielvariable=0;

Etwas wie (1 << PB5) schiebt einfach nur eine 1 6 Positionen weiter nach 
links, PB5 ist in diesem Fall keine Adresse, sondern eine einfache Zahl 
(in der io.h definiert). Es gibt DDRB, mit dem du Eingänge oder Ausgänge 
initialisierst. Aber ich bin selbst noch Anfänger.

"PINXY" steht nicht für einen Pin, sondern für einen kompletten Port 
(also 8 Pins). Ein Pin kann 1 oder 0 sein, das checkst du z.B. mit if()

(Bitte korriegiert mich jemand, wenn ich einen Grundlegenden Fehler 
weitererzähle)

von Klausi (Gast)


Lesenswert?

Also das Ganz so?
Wenn ich doch nur wüsste wieso der Simulator jetzt wieder nach der 
zweiten if Anweisung keinen Braekpoint setzen will????

Man, so eine einfache Aufgabe an der ich scheitere...ich könnt heulen.
1
for(...)
2
{
3
if(!(PORTB & (1<<PB7)))
4
    {
5
      if(PINB & (1<<PINB5))
6
        daten <<=1 ;
7
      else
8
        daten<<=0;      
9
    }
10
}

von Tobi (Gast)


Lesenswert?

for(...)
{
if(!(PORTB & (1<<PB7))) //Bit 7 ist also '0' gesetzt (in dem Fall
    {                   //heisst das, kein Pull Up ein, wenn DDRB7 = 0)
      if(PINB & (1<<PINB5)) // Wenn also am Pin B5 eine '1' anliegt
        daten <<=1 ;        //wird der Inhalt in daten 1 nach links 
geschoben
      else                  //allerdings wurde daten nirgends etwas 
zugewiesen
        daten<<=0;
    }
}

Ich glaube du meinst (ich weiß es aber nicht genau):

daten:=0;

for(int i=0; i<(sizeof(daten)*8); i++)
{
  if(PINB & (1<<PINB5)) daten = (daten << 1) | 1;
  else                  daten = (daten << 1);
}

Dieser code schiebt einfach das, was am PINB5 anliegt nach links. 
Allerdings würde das hier sehr schnell vonstatten gehen, sodass daten 
entweder 0 oder 0xFF beinhalten würde.

von Klausi (Gast)


Lesenswert?

Ich erhalte immer eine Null, wie du gesagt hast. Wieso, ich habe doch 
delay eingefügt.
1
...
2
uint16_t daten=0;
3
  PORTB &=~(1<<PB2);
4
  _delay_us(10);
5
6
  for(uint8_t k=0; k<=32; k++)
7
  {
8
    PORTB^=(1<<PB7);
9
    if(!(PORTB & (1<<PB7)))
10
    {
11
      if(PINB & (1<<PINB5))
12
        daten = (daten<<1)|1 ;
13
      else
14
        daten=(daten<<1);
15
      
16
    }
17
    _delay_us(10);
18
  }
19
  PORTB|=(1<<PB2)|(1<<PB7);
20
  
21
  ...

von Klausi (Gast)


Angehängte Dateien:

Lesenswert?

Der Code stellt eine SPI Schnittstelle ohne Senden dar. PB7 dient als 
Clock und PB5 ist der Data In.
Daten am PB5 liegen an, das konnte ich mit dem Oszilloskop messen. Also 
Clock funktioniert (siehe Anhang)

Kanal 1 ist Clock und 2 ist DataIn (PB5)

von Klausi (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab den Fehler gefunden, lag nicht am Programm, sondern war ein 
Kontaktproblem. Oh man viele Stunden für den Ar***.

Aber mir ist aufgefallen das die Bytes im Wort daten irgendwie 
vertauscht sind.

???

Wenn man das Bild mit dem Inhalt von "daten" (=D0 07) vergleicht fällt 
einem das auf.

Bild: 0000 0111 1101 000 = 07D0

Woran liegt das?

von Klausi (Gast)


Lesenswert?

Sorry, mein Fehler ich glaube es liegt am Speichern im EEPROM. Zuerst 
wird wahrscheinlich das LSB dann das MSB gesichert.

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.