mikrocontroller.net

Forum: Compiler & IDEs Pin einlesen und schieben


Autor: Klausi (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Klausi (Gast)
Datum:

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

Autor: Marius Wensing (mw1987)
Datum:

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

MfG
Marius

Autor: Klausi (Gast)
Datum:

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

Autor: Philipp B. (philth)
Datum:

Bewertung
0 lesenswert
nicht 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
if(dein_port & (1 << dein_bit_oder_pin)
zielvarialbe=1;
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)

Autor: Klausi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
for(...)
{
if(!(PORTB & (1<<PB7)))
    {
      if(PINB & (1<<PINB5))
        daten <<=1 ;
      else
        daten<<=0;      
    }
}

Autor: Tobi (Gast)
Datum:

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

Autor: Klausi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich erhalte immer eine Null, wie du gesagt hast. Wieso, ich habe doch 
delay eingefügt.
...
uint16_t daten=0;
  PORTB &=~(1<<PB2);
  _delay_us(10);

  for(uint8_t k=0; k<=32; k++)
  {
    PORTB^=(1<<PB7);
    if(!(PORTB & (1<<PB7)))
    {
      if(PINB & (1<<PINB5))
        daten = (daten<<1)|1 ;
      else
        daten=(daten<<1);
      
    }
    _delay_us(10);
  }
  PORTB|=(1<<PB2)|(1<<PB7);
  
  ...

Autor: Klausi (Gast)
Datum:
Angehängte Dateien:

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

Autor: Klausi (Gast)
Datum:
Angehängte Dateien:

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

Autor: Klausi (Gast)
Datum:

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

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.