Hallo,
ich hätte mal eine kurze Frage, wie man sowas am besten lösen kann.
Ich übergebe der derzeitigen spi_init() meines Attiny841 ein mit, wie
schnell dir Frequenz sein soll.
1 | void spi_init(uint8_t prescaler)
|
2 | {
|
3 | DDRA |= (1<<DDRA7) | (1<<DDRA6) | (1<<DDRA4);
|
4 | SPCR = (1<<SPE) | (1<<MSTR);
|
5 | SPSR &= ~(1<<SPI2X);
|
6 |
|
7 | switch(prescaler)
|
8 | {
|
9 | case 4: return;
|
10 | case 16: SPCR |= (1<<SPR0); break;
|
11 | case 64: SPCR |= (1<<SPR1); break;
|
12 | case 128: SPCR |= (1<<SPR1) | (1<<SPR0); break;
|
13 | case 2: SPSR |= (1<<SPI2X); break;
|
14 | case 8: SPSR |= (1<<SPI2X); SPCR |= (1<<SPR0); break;
|
15 | case 32: SPSR |= (1<<SPI2X); SPCR |= (1<<SPR1); break;
|
16 | //case 64: SPSR |= (1<<SPI2X); SPCR |= (1<<SPR1) | (1<<SPR0); break;
|
17 | default: return;
|
18 | }
|
19 | }
|
20 |
|
21 |
|
22 |
|
23 |
|
24 | // ODER
|
25 |
|
26 |
|
27 | #define SPI_FCK 128
|
28 | #define SPI_USE_SPI2X
|
29 | void spi_init(void)
|
30 | {
|
31 | DDRA |= (1<<DDRA7) | (1<<DDRA6) | (1<<DDRA4);
|
32 | SPCR = (1<<SPE) | (1<<MSTR);
|
33 |
|
34 | #if (SPI_FCK == 16)
|
35 | SPCR |= (1<<SPR0);
|
36 | #elif (SPI_FCK == 64)
|
37 | SPCR |= (1<<SPR1);
|
38 | #elif (SPI_FCK == 128)
|
39 | SPCR |= (1<<SPR1) | (1<<SPR0);
|
40 | /*
|
41 | #else // SPI_FCK == 4 || SPI_FCK fehlerhaft
|
42 | */
|
43 | #endif
|
44 |
|
45 | #ifdef SPI_USE_SPI2X
|
46 | SPSR |= (1<<SPI2X);
|
47 | #endif
|
48 | }
|
Das ganze produziert im Vergleich zur direkten Zuweisung natürlich
deutlich mehr Programmspeicher. Gibt es da ansonsten Ansätze, dass noch
kürzer zu lösen?