Atmega32, SPI ueber Timer gesteuert macht Probleme

Gast #2015891
Lesenswert?

Hallo,

nachdem ich schon viel in diesem Forum gelesen und gelernt habe, wende 
ich mich nun auch schriftlich an euch, da ich in einem Projekt ein 
kleines Problem habe, das ich auch nach laengerer Lektuere nicht loesen 
kann. Die entsprechenden App-Notes von Atmel habe ich gelesen.

Ich mochte in C ueber das SPI einen Bus aufbauen und an einen der 
Teilnehmer (eine 74HC595-Kaskade), gesteuert ueber den Timer1, 
Datensaetze zu je 40 Bit (5 Byte, da 5 74Hc595) senden.

Solange ich aus int main() heraus diese 5 Byte in einer Endlosschleife 
sende, funktioniert das auch recht ordentlich. Jedoch ist dann der Bus 
voll.

Aus diesem Grund habe ich den Aufruf zum Schreiben in einen 
Interruptaufruf des Timer1 gelegt und lasse durch 5maliges Einschreiben 
in das SPDR die Daten auf den Bus ausschreiben. Jedoch kommt es bereits 
nach wenigen Aufrufen zum Absturz des SPI. Weder MOSI noch SCK zeigen ab 
diesem Zeitpunkt eine Reaktion.

Ist dieses ein Bug oder hat jemand dieses Problem auch schon gehabt und 
geloest?

Da ich an diesem Problem nun schon einige Stunden sitze, waere ich ueber 
jeden Hinweis dankbar.

Mit Gruss

Mike
Moderator (Firma: Titel) Persönliche Seite #2016199
Lesenswert?

Mike schrieb:
> Solange ich aus int main() heraus diese 5 Byte in einer Endlosschleife
> sende, funktioniert das auch recht ordentlich. Jedoch ist dann der Bus
> voll.
Stört dich das? Warum?

> Aus diesem Grund habe ich den Aufruf zum Schreiben in einen
> Interruptaufruf des Timer1 gelegt
Machs doch besser so: setz im Timerinterrupt ein Flag, und wenn das 
gesetzt ist, starte die Übertragung in der Main-Loop...

> Jedoch kommt es bereits nach wenigen Aufrufen zum Absturz des SPI.
> Weder MOSI noch SCK zeigen ab diesem Zeitpunkt eine Reaktion.
> Ist dieses ein Bug
Ja. In deiner Software.
Gast #2017061
Lesenswert?

Hallo,

zunaechst Danke fuer die schnellen Antworten.

Das Problem konnte ich gestern dann doch noch loesen. Wie Herr Buchegger 
schon schrieb, lag das Problem darin, dass der Interrupt einen neuen 
Schreibvorgang ausloeste, bevor der erste abgeschlossen war. Nachdem ich 
nun die SPI-Clock angepasst habe, schreibt die Routine die Daten nun 
sauber aus.


Vielen Dank.

Mit Gruss

Mike
#2017093
Lesenswert?

Mike schrieb:
> Hallo,
>
> zunaechst Danke fuer die schnellen Antworten.
>
> Das Problem konnte ich gestern dann doch noch loesen. Wie Herr Buchegger
> schon schrieb, lag das Problem darin, dass der Interrupt einen neuen
> Schreibvorgang ausloeste, bevor der erste abgeschlossen war. Nachdem ich
> nun die SPI-Clock angepasst habe, schreibt die Routine die Daten nun
> sauber aus.

Man kann auch in jedem ISR Aufruf immer nur 1 Byte ausgeben. Das hat 
dann den Vorteil, dass der komplette Codeteil, der auf das fertigwerden 
der SPI wartet flachfällt.

Denk mal darüber nach.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren