Kampfwurst_Hugo
05.10.2011, 18:33
Hallo
Ich habe von meinem Lehrer einen Code für SPI erhalten.
Der Atmega 2560 soll der Master sein. Als Slaves werden 2 AT90PWM316 oder 2 Atmega 16 verwendet.
Das Problem ist das ich nicht mal den Master zum laufen bekommen.
Warscheinlich ist nur eine Kleinigkeit falsch aber ich finde den Fehler nicht.
Hier der Code.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
unsigned char status = 0;
volatile unsigned char count;
void timer1 (void);
void master_init (void);
void master_transmit (unsigned char data);
SIGNAL (SIG_SPI) {
return;
}
SIGNAL (SIG_OVERFLOW1) { //Senderoutine
if (count == 1) {
master_transmit ('1');
count--;
return;
}
if (count == 0) {
master_transmit ('0');
count++;
}
}
void timer1 (void) {
TIMSK1 |= _BV(TOIE1); //Timer Overflow Interrupt enable
TCNT1 = 0; //Rücksetzen des Timers
TCCR1B = _BV(CS10) | _BV(CS11); //8MHz/65536/64 = 1,91Hz --> 0,5s
}
void master_init (void) {
DDRB = _BV(PB0) | _BV(PB3) | _BV(PB5); // setze SCK,MOSI,PB0 (SS) als Ausgang
DDRB &= ~_BV(PB4); // setze MISO als Eingang
PORTB = _BV(PB5) | _BV(PB0); // SCK und PB0 high (ist mit SS am Slave verbunden)
SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPR0); //Aktivierung des SPI, Master, Taktrate fck/16
status = SPSR; //Status löschen
}
void master_transmit (unsigned char data) {
PORTB &= ~_BV(PB0); //SS am Slave Low --> Beginn der Übertragung
SPDR = data; //Schreiben der Daten
while (!(SPSR & (1<<SPIF)));
PORTB |= _BV(PB0); //SS High --> Ende der Übertragung
}
int main (void) {
master_init ();
timer1 ();
sei ();
for (;;);
return 0;
}
Ich habe von meinem Lehrer einen Code für SPI erhalten.
Der Atmega 2560 soll der Master sein. Als Slaves werden 2 AT90PWM316 oder 2 Atmega 16 verwendet.
Das Problem ist das ich nicht mal den Master zum laufen bekommen.
Warscheinlich ist nur eine Kleinigkeit falsch aber ich finde den Fehler nicht.
Hier der Code.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
unsigned char status = 0;
volatile unsigned char count;
void timer1 (void);
void master_init (void);
void master_transmit (unsigned char data);
SIGNAL (SIG_SPI) {
return;
}
SIGNAL (SIG_OVERFLOW1) { //Senderoutine
if (count == 1) {
master_transmit ('1');
count--;
return;
}
if (count == 0) {
master_transmit ('0');
count++;
}
}
void timer1 (void) {
TIMSK1 |= _BV(TOIE1); //Timer Overflow Interrupt enable
TCNT1 = 0; //Rücksetzen des Timers
TCCR1B = _BV(CS10) | _BV(CS11); //8MHz/65536/64 = 1,91Hz --> 0,5s
}
void master_init (void) {
DDRB = _BV(PB0) | _BV(PB3) | _BV(PB5); // setze SCK,MOSI,PB0 (SS) als Ausgang
DDRB &= ~_BV(PB4); // setze MISO als Eingang
PORTB = _BV(PB5) | _BV(PB0); // SCK und PB0 high (ist mit SS am Slave verbunden)
SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPR0); //Aktivierung des SPI, Master, Taktrate fck/16
status = SPSR; //Status löschen
}
void master_transmit (unsigned char data) {
PORTB &= ~_BV(PB0); //SS am Slave Low --> Beginn der Übertragung
SPDR = data; //Schreiben der Daten
while (!(SPSR & (1<<SPIF)));
PORTB |= _BV(PB0); //SS High --> Ende der Übertragung
}
int main (void) {
master_init ();
timer1 ();
sei ();
for (;;);
return 0;
}