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.