Hi Leute. Brauche dringend eure Hilfe, da ich bei meiner Motorsteuerung
(gesteuert via SPI) nicht weiterkomme.
Habe bereits einen weiteren µC als Master konfiguriert und getestet.
Funktioniert bisher alles einwandfrei.
Jetzt habe ich leider ein Problem bei meinem SLAVE (ATMEGA8). Der ISR
will einfach nicht auslösen und die Werte zuordnen.
Bitte schaut euch einfach mal kurz den Code an. Vielleicht sehr ihr da
einen Fehler...
1 |
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <avr/delay.h>
|
5 |
|
6 | volatile unsigned char data;
|
7 | unsigned char status,transfer = 0, prozent=0, motor = 0;
|
8 | unsigned char richtung1=0, richtung2=1, enable=0, sync = 0, reset = 0, sleep = 0, mode = 0;
|
9 |
|
10 | ISR(SPI_STC_vect)
|
11 | {
|
12 | data = SPDR;
|
13 | transfer = (data & 0b10000000)>>7;
|
14 | switch(transfer)
|
15 | {
|
16 | case 0: motor = data & 0b01000000;
|
17 | transfer = data & 0b01111111;
|
18 | prozent = transfer; //wird für andere Anwendung
|
19 | //verwendet
|
20 | break;
|
21 |
|
22 | case 1: richtung1 = data & 0x01;
|
23 | richtung2 = (data & 0x02)>>1;
|
24 | mode = (data & 0b00001100)>>2;
|
25 | enable = (data & 0x10)>>4;
|
26 | sleep = (data & 0x20)>>5;
|
27 | reset = (data & 0x40)>>6;
|
28 | break;
|
29 | }
|
30 | }
|
31 |
|
32 | void motor_init(void)
|
33 | {
|
34 | PORTD = 0x00;
|
35 | PORTB = 0x00;
|
36 | PORTC = 0x00;
|
37 | }
|
38 |
|
39 |
|
40 | void slave_init (void)
|
41 | {
|
42 | DDRB &= ~((1<<PB2)|(1<<PB3)|(1<<PB5)); //MISO als Ausgang, der Rest
|
43 | //als Eingang
|
44 | DDRB |= (1<<PB4);
|
45 | SPCR = _BV(SPE) | _BV(SPIE); //Aktivierung des SPI + Interrupt
|
46 | fclk/4
|
47 | status = SPSR; //Status löschen
|
48 | }
|
49 |
|
50 | int main (void) {
|
51 |
|
52 | DDRB = 0xFF;
|
53 | DDRC = 0xFF;
|
54 | DDRD = 0xFF;
|
55 |
|
56 | motor_init();
|
57 | slave_init ();
|
58 | sei ();
|
59 |
|
60 | while(1)
|
61 | {
|
62 | //im vollständigen Code werden hier die Ports in Abhängigkeit der im
|
63 | //ISR ermittelten Variablen gesetzt/rueckgesetzt.
|
64 | }
|
65 | return 0;
|
66 | }
|