Forum: Mikrocontroller und Digitale Elektronik Schiebergister seltsam. SW SPI geht


von Murphy S. (student-f)


Angehängte Dateien:

Lesenswert?

Hallo Jungs,

ich zweifel gerade etwas an meinem Verständnis. (Die anderen Threads, 
auch die Artikel zu Schieberegister etc. sind gelesen!)

Habe mir eine SW-SPI geschrieben, diese funktioniert auch einwandfrei. 
Danach herübergegangen zum Schieberegister und dies macht ein seltsames 
VErhalten am Output Nr. 8

Folgender Code für das Schieberegister (HC595)
1
void sent_Byte_SHIFT(unsigned char data) // Anpassen!
2
{ //CPHA = 1 CPOL = 0
3
  uint8_t i;
4
    for(i = 8; i; i-- )      // 8 Bit shiften 
5
      {
6
      PORTB |= (1<<SCK);         
7
       // Daten ausgeben Anfang
8
         PORTB &= ~(1<<MOSI);     
9
        if(data & 0x80 )         //MSB first
10
        {
11
          PORTB |= (1<<MOSI);     
12
        }
13
      // Daten ausgeben Ende
14
      
15
      data <<= 1;          
16
      PORTB &= ~(1<<SCK);         
17
      }
18
19
    PORTB |= (1<<SS);             //SS high (RCK)
20
    PORTB &= ~(1<<SS);             //SS low (RCK)
21
}

Geändert im Vergleich zur SW - SPI das Thema mit dem SS High / SS low an 
RCK)

Anbei das Timining und deren Daten im Anhang. Gesendet werden:
1
    sent_Byte_SHIFT(0x00);
2
    delay_hw_timer(1);    //Hardware Timer
3
    sent_Byte_SHIFT(0xFF);

Auffällig ist, dass der achte Ausgang nicht das macht, was er machen 
sollte :-( Er invertiert immer. Denkfehler oder waran könnte es liegen?

Vielen Dank an alle User.

von Willi (Gast)


Lesenswert?

Frank V. schrieb:
> PORTB |= (1<<SCK);

Clock kommt doch zu früh!
Erst den Ausgang setzen.

von Murphy S. (student-f)


Lesenswert?

Gutn Morgen Willi,

die Welt und der Samstag morgen kann so einfach sein:

Für alle anderen, falls von Interesse:
1
void sent_Byte_SHIFT(unsigned char data) 
2
{ //CPHA = 1 CPOL = 0
3
  uint8_t i;
4
    for(i = 8; i; i-- )      // 8 Bit shiften 
5
      {
6
      //PORTB |= (1<<SCK);         
7
       // Daten ausgeben Anfang
8
         PORTB &= ~(1<<MOSI);     
9
        if(data & 0x80 )         //MSB first
10
        {
11
          PORTB |= (1<<MOSI);     
12
        }
13
      // Daten ausgeben Ende
14
      PORTB |= (1<<SCK);         //neu hier!
15
      data <<= 1;          
16
      PORTB &= ~(1<<SCK);         
17
      }
18
19
    PORTB |= (1<<SS);             //SS high (RCK)
20
    PORTB &= ~(1<<SS);             //SS low (RCK)
21
}

Vielen Dank im Voraus.

von Willi (Gast)


Lesenswert?

Frank V. schrieb:
> Vielen Dank im Voraus.

Was brauchst Du denn noch? :-)

von Murphy S. (student-f)


Lesenswert?

Wir werden sehen und hier lesen:-)

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.