Pin einlesen und schieben

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.
Gast
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);
}
Gast
@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.
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)
Gast
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
}
Gast
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.
Gast
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
  ...
Gast
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)
Angehängte Dateien:
Gast
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?
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.