Hallo,
nach langem basteln und agieren ist es mir gelungen nun eine SPI
verbindung zwischen dem Raspberry pi und einem ATmega8A herzustellen.
Mein eigentliches Ziel ist von dem Raspberry dem ATmega einen wert zu
übergeben damit der wiederum weiss wie viele steps er drehen lassen
muss.
Ich dachte mir ich schreibe dazu ein kleines Programm und hänge ein paar
LEDs an um zu sehen ob sich etwas tut nur leider macht weder eine LED
noch sonst irgendetwas einen mux.
Ich bin da etwas ratlos.
Hier ist das Programm was ich geschrieben habe:
1 | # define F_CPU 1000000UL
|
2 | #include <util/delay.h>
|
3 | #include <avr/io.h>
|
4 |
|
5 |
|
6 |
|
7 |
|
8 | char stepValues[5][4] = {{0, 0, 0, 0}, // Stepper aus
|
9 | {1, 0, 0, 0}, // Step 1
|
10 | {0, 1, 0, 0}, // Step 2
|
11 | {0, 0, 1, 0}, // Step 3
|
12 | {0, 0, 0, 1}}; // Step 4
|
13 |
|
14 |
|
15 | void SPI_SlaveInit(void);
|
16 | char SPI_Exchange(void);
|
17 | void moveStepper(char s, float delayValue);
|
18 | void action(char count,float delayValue);
|
19 |
|
20 | char main()
|
21 | {
|
22 | SPI_SlaveInit();
|
23 | char data;
|
24 |
|
25 |
|
26 | while(1)
|
27 | {
|
28 | data = SPI_Exchange()
|
29 | action(data, 3.125);
|
30 |
|
31 |
|
32 | }
|
33 |
|
34 | }
|
35 |
|
36 | void SPI_SlaveInit(void)
|
37 | {
|
38 | DDRB |= (1<<PB4);
|
39 | PORTD |= (1<<PD0)|(1<<PD1);
|
40 | DDRD |=(1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD5);
|
41 | SPCR = (1<<SPE);
|
42 | }
|
43 |
|
44 | char SPI_Exchange(void)
|
45 | {
|
46 | char data;
|
47 |
|
48 | while(!(SPSR & (1<<SPIF)))
|
49 | {}
|
50 |
|
51 | data = SPDR;
|
52 | SPDR=0x00;
|
53 | return data;
|
54 | }
|
55 |
|
56 | void moveStepper(char s, float delayValue)
|
57 | {
|
58 |
|
59 |
|
60 | PORTD &= ~( ( 1 << PD2 ) | ( 1 << PD3 ) | ( 1 << PD4 ) | ( 1 << PD5 ) );//Pins 2, 3, 4, 5 löschen!
|
61 |
|
62 | PORTD |= ( 1 << ( s + PD2) ); //Nur den entsprechenden Pin setzen!
|
63 | PORTD |= ( 1 << ( s + PD3) );
|
64 | PORTD |= ( 1 << ( s + PD4) );
|
65 | PORTD |= ( 1 << ( s + PD5) );
|
66 | _delay_ms(delayValue); //Pause von 3.125
|
67 | }
|
68 |
|
69 | void action(char count, float delayValue)
|
70 | { char i=0,sequenceStep;
|
71 |
|
72 | if(count > 0)
|
73 | for( i = 0; i < count; i++)
|
74 |
|
75 | for(sequenceStep = 1; sequenceStep <= 4; sequenceStep++)
|
76 | moveStepper(sequenceStep, delayValue);
|
77 |
|
78 | if(count < 0)
|
79 | for( i = 0; i < ~(count); i++)
|
80 | for(sequenceStep = 4; sequenceStep > 0; sequenceStep--)
|
81 | moveStepper(sequenceStep, delayValue);
|
82 |
|
83 | if(count == 0) //Stromlos schalten
|
84 | moveStepper(0, delayValue);
|
85 | }
|
Es tut sich aber nichts habe LEDS an den jeweiligen ausgängen.
Ist es vielleicht besser einfach RX/TX zu nehmen da ich natürlich ein
Problem bekomme bei negativen werten und dann mit High-Byte und Low-Byte
arbeiten muss??
Ich hoffe ihr könnt mir helfen danke schon mal im vorraus!!