Forum: Mikrocontroller und Digitale Elektronik Raspberry&ATmega8A&STEPPER


von Ralf S. (orgsi1990)


Lesenswert?

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!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.