Ich habe zwei MC über SPI (Haupttakt/4) miteinander verbunden. Mein Master gibt den Takt (SCK), CS und die Daten (Mosi) an den Slave. Der Slave soll diese Daten mit einem Interrupt verstehen und abspeichern. Er erkennt diese Daten aber leider nicht. Weiß nicht mehr weiter.... Habe folgende Einstellungen im Slave getroffen: SPI initialisierung: void SPI_Slave_INIT(void) { SPCR |= (1<<SPE) | (0<<MSTR) | (1<<SPIE); } Interrupt Funktion (Daten sollen per Interrupt erkannt und in der globalen Variable RECEIVE_u8[1] gespeichert werden- ich denke hier stimmt etwas nicht!! SIGNAL (SIG_SPI) { RECEIVE_u8[1] = SPDR; while(!(SPSR & (1<<SPIF))); } In der Main soll die Variable (mit Pulse an PD1) ausgegeben werden int main (void) { init_ports(); //Portinitialisierung sei(); //Globale Interrupts aktiviert //INIT SPI SPI_Slave_INIT(); while(1) { for (int16_t n = 0; n < RECEIVE_u8[1] ; n++) { PORTC &= ~ (1<<PC1); _delay_us(10); PORTC |= (1<<PC1); _delay_us(10); } _delay_ms(10); }
Durch Testen habe ich heruasgefunden. Wenn Daten empfangen werden springt er wohl in den Interrupt- aber speichert diesen Wert nicht ab
Globale Variable + Verwendung in normalem Programm + Verwendung in Interrupt = Variable als volatile deklariert? Ralf
Ich habe die Variable als Volatile deklariert: volatile unsigned char Receive_u8[10]; stimmt doch alles? Hate es vielleicht mit dem Interrupt zu tun? Schlägt der Interrupt vielleicht nur zu wenn Daten eingelesen sind und nicht schon beim Empfangen? Dann müßte ich ohne Interrupt arbeiten mit einer Schleife die immer wieder den SPI-Eingang abfragt...
Also bei einer While-Schleife in der ISR bei der auf ein externes Ereignis gewartet wird klingeln bei mir schonmal die Alarmglocken. Ich würde den Empfang so machen: ISR(SPI_STC_vect) { rxbuffer = SPDR; } Der Interrupt löst nach empfang der Nachricht aus. Da braucht man auf nix anderes zu warten. Mfg
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.