Pin einlesen und schieben

Gast #941454
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.
#941461
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)
Gast #941484
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
}
Gast #941499
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.
Gast #941529
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
  ...
Gast #941552
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)
Angehängte Dateien:
Gast #941566
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?
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren