Hallo liebe µC-Gemeinde,
an diesem schönen Sonntag nachmittag findet sich bestimmt jmd. der mir
helfen kann.
Ich bin gerade an einer SW-SPI am "verzweifeln" und ggf. ist ja ein oder
mehrere liebe Helferlein gerade im Forum auf der Sonnenterasse aktiv :-)
Anbei die Codeschnispsel. An meinem Osci sehe ich den SPI SCK Takten,
aber keine DAten am MOSI ausgeben. Der Mosi taktet 8 mal high und dann
bleibt der low... Das kann doch nur eine kleine Unachtsamkeit sein.?!?
Bin gerade blind und finde den Fehler nicht :-(
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | #define TRUE 1
|
5 | #define FALSE 0
|
6 |
|
7 | volatile unsigned char sck_toggle = FALSE;
|
8 |
|
9 | void init_IOs(void); // Initialisierung (weitere) IOs
|
10 | void init_Timer_0(void);
|
11 |
|
12 | int main(void)
|
13 | {
|
14 | uint8_t i;
|
15 | uint8_t val;
|
16 | uint8_t ausgabe =5;
|
17 |
|
18 | init_IOs();
|
19 | init_Timer_0();
|
20 |
|
21 | sei();
|
22 | val=0x0A;
|
23 |
|
24 | for(;;)
|
25 | {
|
26 |
|
27 | for( i = 8; i; i-- ){
|
28 | PORTB &= ~(1<<MOSI); //Immer Null, wenn NIcht high muss
|
29 | if(ausgabe & 0x80 ) //MSB first
|
30 | {
|
31 | PORTB |= (1<<MOSI);
|
32 | }
|
33 | ausgabe <<= 1;
|
34 | if(sck_toggle == TRUE) //SCK
|
35 | {
|
36 | PORTB ^= (1<<SCK);
|
37 | }
|
38 | }
|
39 |
|
40 | }
|
41 |
|
42 | }
|
43 |
|
44 | void init_IOs(void)
|
45 | {
|
46 | DDRB = (1<<SS) | (1<<SCK)| (1<<MOSI);
|
47 | DDRB &= ~( (1<<PB1) | (1<<PB3) );
|
48 | }
|
49 |
|
50 | ISR (TIMER0_COMPA_vect)
|
51 | {
|
52 | sck_toggle ^= 1; //Variable für SCK toggeln
|
53 | }
|
Vielen DAnk im Voraus :-)
PS: Attiny 45-20PU ohne CKDIV/8 Taktet gerade ISR mit 2khZ