Guten Abend,
ich hab hier eine Schaltung vor mir, wo 4 Schieberegister kaskadiert
wurden. Die Ansteuerung der Schieberegister,74HC595D, erfolgt über SPI,
Controller ist ein AtMega32.
Meine Frage dazu ist, wie steuere ich so was an, ich hatte mir ueberlegt
das so zumachen:
Das Array ground_tab ist eine Vorgabe, diese Werte muessen ausgegeben
werden:
1 | #include <avr/io.h>
|
2 | .
|
3 | .
|
4 | static uint32_t ground_tab[6] = {0xFD,0x2CF5,B6C95,AB2C55,5AB2663,C5C8A27B};
|
5 | .
|
6 | .
|
7 | void init_spi(void)
|
8 | {
|
9 | // Set MOSI, SS and SCK output, all others input
|
10 | DDRB |= (1<<PB4) | (1<<PB5) | (1<<PB7) | (1<<PB0) | (1<<PB1) | (1<<PB2);
|
11 |
|
12 | // Enable SPI, Master, set clock rate double
|
13 | SPCR |= (1<<SPE) | (0<<DORD) | (1<<MSTR) | (1<<CPHA);
|
14 | SPSR |= (1<<SPI2X);
|
15 | SPDR = 0x01;
|
16 | SR_On;
|
17 | }
|
18 |
|
19 | void spi_split(uint32_t data)
|
20 | {
|
21 | int8_t i;
|
22 | uint8_t tmp;
|
23 | for(i=3;i >= 0; i--){
|
24 | tmp = (data >> (8*i));
|
25 | spi_senden(tmp);
|
26 | }
|
27 | SR_On();
|
28 | asm volatile ("nop");
|
29 | SR_Off;
|
30 | }
|
31 |
|
32 | void spi_senden(uint8_t cData)
|
33 | {
|
34 | SR_Off;
|
35 | while(!(SPSR & (1<<SPIF)));
|
36 | SPDR = cData;
|
37 | while(!(SPSR & (1<<SPIF)));
|
38 | SR_On;
|
39 | }
|
40 |
|
41 | int main(void)
|
42 | {
|
43 | for(;;)
|
44 | {
|
45 | .
|
46 | .
|
47 | for(uint8_t i=0;i<6;i++)
|
48 | {
|
49 | spi_split(ground_tab[i]);
|
50 | }
|
51 | .
|
52 | .
|
53 | }
|
54 | }
|
Das ist so wie ich mir das vorgestellt habe, kann das so funktionieren,
hab damit noch keine Erfahrung.
Schon mal Danke,
Roland