SPI funktiniert nicht

Gast #515437
Lesenswert?
• ▲
▼
Hallo zusammen,

ich habe gerade versucht eine Verbindung über SPI zwischen zwei 
Mikrocontrollern herzustellen. Dazu hab ich ein Programm aus der 
Codesammlung des Forums genommen. Der dort verwendete Controller war der 
Atmega8, ich benutze den Atmega48. Die Pinbelegungen der beiden 
Controller sind identisch, daran dürfte es also nicht liegen. Beide 
Controller besitzen einen Takt von 8MHz.

Hab den Code mal angehängt. Woran kann es liegen?

Angehängte Dateien:
Gast #515596
Lesenswert?
• ▲
▼
du hast den SPI-Interrupt aktiviert UND ein ISR, d.h. wenn das SPI 
fertig ist wird die ISR aufgerufen und damit automatisch das SPIF 
gelöscht!,
 klar, dass sich der µC aufhängt.
(am besten den interrupt nicht aktivieren, wenn du den sowieso nicht 
brauchst, das Flag wird doch trotzdem gesetzt)
wird der slave wirklich mit high-pegel am SlaveSelect pin angesprochen?
1
    PORTB &= ~_BV(PB0);  <- das sollte so funktionieren
ach ja um dich vor überraschungen zu schützen den slaveselect pin des 
Master auf output oder pullup aktivieren
Gast #515619
Lesenswert?
• ▲
▼
Hi Jörg,


>am besten den interrupt nicht aktivieren, wenn du den sowieso nicht
>brauchst, das Flag wird doch trotzdem gesetzt

Welchen? Den SPI? Aber der wird doch gar nicht aktiviert. Die Routine 
ist zwar drin, aber der Interrupt wird nirgens aktiviert. Sehe ich 
zumindest nicht ;-)

Brauchen tu ich doch eigentlich nur den Timer-Interupt.....
Gast #515651
Lesenswert?
• ▲
▼
Ok, hast recht, aber im Simulator läuft das Programm!
- bis der Timer1 überläuft dauert es eben ziemlich lang
- die SPI übertragung dauert auch min. 8*16Takte
- laufen die µCs wirklich mit 8MHz? (Fuses bzw. CLKPR-Register korrekt?)
(standard sind 1MHz, da dauert alles 8x so lang)
- btw. die SIGNAL-Geschichten sind veraltet!
und sorry nochmals
Gast #515655
Lesenswert?
• ▲
▼
>>Brauchen tu ich doch eigentlich nur den Timer-Interupt.....

Genau und da steht ein "return" drin. Sollte das nicht ein "reti" sein ?

Oder Abfrage umstellen um das "return/reti" ganz zu vermeiden.

  if (count == 1) {
    master_transmit ('1');
    count--;
  }
  else if (count == 0) {
    master_transmit ('0');
    count++;
  }


Holger
Gast #515660
Lesenswert?
• ▲
▼
@Holger:
>> Sollte das nicht ein "reti" sein ?
gibts nicht in C, wenn der Compiler die ISR als solche erkennt, wird da 
schon korrekt "reti" benutzt, also: "return" ist schon richtig, man darf 
natürlich keine Werte zurückgeben (irgendwie logisch, wohin auch?)
Gast #515823
Lesenswert?
• ▲
▼
Also langsam verzweifel ich wirklich.

Hab jetzt alles noch mal überprüft, aber keinen Fehler gefunden. Takt 
von 8MHz ist auf beiden Controllern eingestellt. Es scheint so, als 
bleibt der Controller beim Master an der Stelle

while (!(SPSR & (1<<SPIF))); //Wait for Transmission Complete

hängen. Ich weiß nur nicht warum. Keiner ne Idee?
Gast #515831
Lesenswert?
• ▲
▼
Wenn du das Programm für einen ATMega 8 übersetzt hast und in den 48
brennst, dann könnte das dein Problem sein. Die Registeradressen sind
beim 48 anders. Da müsste dann aber weit mehr schief laufen. Mehr fällt 
mir dazu nicht mehr ein.

Ich probier das Master Proggi heute Abend mal auf einem 88 oder 168
aus.
Gast #515838
Lesenswert?
• ▲
▼
Die einzige Registeradresse die anders war, war die des TIMSK-Registers. 
Das habe ich von TIMSK(Atmega8) in TIMSK1(Atmega48) umbenannt. Ansonsten 
waren die Registeradressen soweit gleich.....

Oder ich hab was übersehen....
Gast #517198
Lesenswert?
• ▲
▼
Supi Holger,

jetzt klappt es bei mir auch. Obwohl ich nicht ganz verstehe warum.

SS ist beim Atmega8 auch nicht PB0 sondern auch PB2. dOb ich jetzt nen 
High- und Lowpegel mit PB0 oder PB2 erzeuge müsste doch eigentlich 
keinen Unterschied machen. Oder?
Gast #517294
Lesenswert?
• ▲
▼
>>wieso Macke? Auf Seite 126 ist beschrieben das der SS Pin im Mastermode
>>auf High gehalten werden muß damit der SPI im Master läuft (Seite 126
>>atmega8.pdf)

muss er nicht ;)

Er muss nur als Eingang beim Mastermode auf High gehalten werden. Als
Ausgang ist der Pegel egal. Ich nehm SS immer gleich als CS Pin für
irgendein SPI Gerät. Als Eingang ist der ja schon fast nicht mehr
zu gebrauchen. Jeder Low Pegel resettet den Mastermode und
macht ihn zum Slave.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.