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
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.
Ohne Code ist das ne Frage für Hellseher. Peter
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.