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

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.