www.mikrocontroller.net

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


Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne Code ist das ne Frage für Hellseher.

Peter

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.