Hallo, ich habe an meinem MSP430G2553 ein 74HC595 angeschlossen über die UCA-Schnittstelle. Das benutze ich als ein 3-pin, 8-bit Master SPI. Am Schieberegister hängen wiederum acht LEDs. Das senden funktioniert soweit ganz gut, jedoch scheint es, dass die übergebene Variable an das TXBUF "verschoben" bei den LEDs wieder herauskommt. Das sieht wie folgt aus: übergebebenes | Empfangenes Byte Byte an TXBUF | an LEDs 00000000 | 00111111 10000000 | 00000000 11000000 | 00100000 11100000 | 00110000 11110000 | 00111000 11111000 | 00111100 11111100 | 00111110 11111110 | 10111111 11111111 | 11111111 Ich kann dort leider keine Zusammenhang finden, warum sich das verschoben hat. Vielen Dank für eure Hilfe. Quellcode:
1 | #include<msp430.h> |
2 | |
3 | #define latchPIN BIT5
|
4 | #define serPIN BIT2
|
5 | #define clkPIN BIT4
|
6 | |
7 | |
8 | void WriteData(unsigned char data) |
9 | {
|
10 | P1OUT &= ~(latchPIN); |
11 | |
12 | while (!(IFG2 & UCA0TXIFG)); |
13 | UCA0TXBUF = data; |
14 | |
15 | P1OUT |= latchPIN; |
16 | }
|
17 | |
18 | |
19 | int main() |
20 | {
|
21 | // stop watchdog-timer
|
22 | WDTCTL = WDTPW | WDTHOLD; |
23 | |
24 | // initialise special-register
|
25 | P1SEL = serPIN + clkPIN; |
26 | P1SEL2 = serPIN + clkPIN; |
27 | |
28 | // initialise latchPIN
|
29 | P1OUT = 0x00; |
30 | P1DIR |= latchPIN; |
31 | |
32 | |
33 | // SPI configuration
|
34 | UCA0CTL1 |= UCSWRST; |
35 | |
36 | UCA0CTL0 = UCMST + UCSYNC; // 3-pin, 8-bit SPI master |
37 | UCA0CTL0 &= ~(UCCKPH) & ~(UCCKPL); |
38 | UCA0CTL1 |= UCSSEL_2; // SMCLK |
39 | UCA0BR0 |= 0x01; // /2 |
40 | UCA0BR1 = 0; // |
41 | UCA0MCTL = 0; // No modulation |
42 | |
43 | UCA0CTL1 &= ~UCSWRST; |
44 | |
45 | |
46 | unsigned char data; |
47 | volatile int iCount, delay; |
48 | |
49 | |
50 | // Hauptschleife
|
51 | for (;;) |
52 | {
|
53 | data = 0; |
54 | |
55 | for (iCount = 7; iCount >= 0; iCount--) |
56 | {
|
57 | // Byte senden
|
58 | WriteData(data); |
59 | |
60 | // SW Delay
|
61 | delay = 10000; |
62 | do delay--; |
63 | while(delay != 0); |
64 | |
65 | // weiteres bit setzen
|
66 | data |= (1 << iCount); |
67 | }
|
68 | |
69 | // letztes Byte senden
|
70 | WriteData(data); |
71 | |
72 | // SW Delay
|
73 | delay = 10000; |
74 | do delay--; |
75 | while(delay != 0); |
76 | }
|
77 | |
78 | |
79 | return 0; |
80 | }
|