www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zwei MC miteinander über SPI verbinden


Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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);


}

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Durch Testen habe ich heruasgefunden. Wenn Daten empfangen werden 
springt er wohl in den Interrupt- aber speichert diesen Wert nicht ab

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Globale Variable + Verwendung in normalem Programm + Verwendung in 
Interrupt = Variable als volatile deklariert?

Ralf

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.