Forum: Mikrocontroller und Digitale Elektronik Atmega32, SPI ueber Timer gesteuert macht Probleme


von Mike (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Program?

Generell: achte darauf, dass du innerhalb der ISR nicht mehr Zeit für 
die Abarbeitung der ISR brauchst, als die Zeitspanne von einem ISR 
Aufruf zum nächsten ist.

von Peter D. (peda)


Lesenswert?

Ohne Code ist das ne Frage für Hellseher.

Peter

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Mike (Gast)


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

von Karl H. (kbuchegg)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.