PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SPI + Interrupts = Problem



heidi01
27.10.2005, 13:15
HALLO;

ich verzweifle gerade an dem Versuch 2 ATMega's per SPI kommunizieren zu lassen.
µc 1 ist ein Mega 16 und sendet alle 2 sekunden eine zweistellige zahl per Hardware-SPI an µc2.
µC 2 ist ein Mega 8 der die Daten per Hardware-SPI empfängt.

Nun das Problem: Wenn ich den SPI Eingang regelmässig abfrage kommt jeder Wert an ( auskommentierte Routine in der Main Loop , Interrupts sind dabei Nicht enabled. Sobald ich die Interrupts einschalte und statt dem Polling die Interruptgesteuerte Routine verwende, kommt nur jeder 2 Wert am µC 2 an.
Hat jemand von Euch 'ne Idee wo hier mein Fehler liegt ?



Jürgen


$regfile = "m8def.dat"
$crystal = 4000000

Dim B As Byte

Config Spi = Hard , Interrupt = On
Spiinit
Enable Spi
Enable Interrupts

On Spi Spiempf

Cls
'---------------------------
Main:
Do
'Spiin B , 1
'Lcd B
'Waitms 222
'Cls
Loop
End
'----------------------------
Spiempf:

Spiin B , 1
Lcd B

Return

PicNick
27.10.2005, 13:38
Ich glaub, spiin ist nicht geeignet für sowas.
Versuch mal (ohne Garantie)

Spiempf:
B = Spsr
Lcd B
return

heidi01
28.10.2005, 01:13
@ Robert

Danke für Deine Antwort. Sie hat mir nur indirekt geholfen. Da ich mit SPSR gar nichts anzufangen wusste, habe ich mal wieder ins Datenblatt geschaut und dabei kam mir die Erleuchtung.
Das Register mit den Daten ist übrigens das SPDR. Im Datenblatt wird beschrieben, dass das SPI Interrupt Flag gesetzt wird, wenn der serielle Datentransfer beendet ist. Somit lese ich dann erst einen Wert ein wenn mir der erste entgangene Wert den Startschuss gab.
Also mit

spiempf:
b = spdr
lcd b
return

funktioniert das Ganze prima.

Tschüss
Jürgen