www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI: ATMega8<=>ATMega644


Autor: Tobi W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte 2 µC per SPI verbinden. Det atmega8 (16 Mhz) sendet in einer 
Endlosschleife ein Byte was jede Sekunde um 1 erhöht wird.

Slave ist der ATMega644 (20 Mhz). Er wartet testweise auf die zu 
empfangenen Bytes und gibt das empfangene Byte auf einem Display als 
Zahl aus.

Um zu überprüfen wie viele Byte bereits empfangen wurden wird in der 2. 
Zeile angegeben wie viele Bytes bisher empfangen wurden.


Leider steht in der 2. Zeile immer eine 0 und die erste Zeile bleibt 
leer. Er empfängt also nichts. Um zu überprüfen ob die Sendeschleife 
auch läuft habe ich nach jedem Senden einen Ausgangspin invertiert -> 
Ja, er sendet.


MOSI <=> MOSI
MISO <=> MISO
SS <=> SS
GND <=> GND

Master:
void SPI_MasterInit(void)
{
  /* Set MOSI and SCK output, all others input */
  DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK);
  /* Enable SPI, Master, set clock rate fck/16 */
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

void SPI_MasterTransmit(char cData)
{
  /* Start transmission */
  SPDR = cData;
  /* Wait for transmission complete */
  while(!(SPSR & (1<<SPIF)))
    ;
}

int main(void) 
{  
  char i = 0;
  SPI_MasterInit();
  DDR_SPI |= (1<<DD_SS);
  while(1)
  {
    PORTB &=~(1<<DD_SS);    //  Aktiviere Slave
    wait_ms(1);
    SPI_MasterTransmit(i++);
    wait_ms(1);
    PORTB |=(1<<DD_SS);    // Deaktiviere Slave
    wait_ms(1000);
  }
  return 0;
}


Slave:
void SPI_SlaveInit(void)
{
  /* Set MISO output, all others input */
  DDR_SPI = (1<<DD_MISO);
  /* Enable SPI */
  SPCR = (1<<SPE);
}

char SPI_SlaveReceive(void)
{
  /* Wait for reception complete */
  while(!(SPSR & (1<<SPIF)))
    ;
  /* Return Data Register */
  return SPDR;
}

int main(void)
{
  uint16_t i=0;
  char string[20];
  DDRB=1;
  
  LCDInit();
  SPI_SlaveInit();
  

  while(1)
  {
    itoa(i++,string,10);
    LCDSetCursorPos(1,0);
    LCDWrite(string);
    
    itoa(SPI_SlaveReceive(),string,10);
    LCDSetCursorPos(0,0);
    LCDWrite(string);
  }
  return 0;
}


Weiß jemand woran das liegen könnte? Danke schonmal.

Tobi

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lass einfach den mega644 bei jedem spi interrupt nen pin toggeln dann 
siehst du ob da der hund begraben liegt (ansonsten is vlt. dei 
verbindung im a****.

Autor: Tobi W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Max,

danke für die Unterstützung!

Ich habe nochmal die Verbindung durchgeklingelt, alles sauber. Habe auch 
nochmal die Define's mit den Datenblättern und der Verdrahtung gecheckt, 
auch richtig.

Das Pin-Toggeln brauche ich denke ich nicht versuchen, da er das 
gezählte Ankommen ja sowieso mit dem i++ zählt und auf dem Display 
ausgeben würde.

Ich habe jetzt auch den atmega8 ausgetauscht und programmiert. Dabei 
sind Daten über die MOSI Leitung zum Slave gewandert und das Display hat 
eine 212 und eine 624 angezeigt. Dies verdeutlich, dass die 
physikalische Verbindung da ist.

Aber auch der neue Controller lässt das Display des Slave eine leere 
Zeile und eine Null anzeigen.

Autor: Tobi W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, mein MKII Programmierer stört beim Anschließen offensichtlich den 
BUS.


Wenn ich eine externe Spannungsquelle anschließe, fangen beide an zu 
zählen.


Danke nochmal ;)

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.