mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR: Interrupt vom Timer ausgelöst


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich überlege mir das AVR Butterfly Board zu kaufen. Ich will damit 
Impulse mit einer Frequenz von 76,8 kHz generieren. Dies würde ich 
mittels eines Timers realisieren, der in der entsprechenden Frequenz 
einen Interrupt auslöst. Da dies nur
 Taktzyklen bei einer Taktfrequenz von 8 Mhz entspricht, wüsste ich 
gerne wie viele Takte die CPU bis zum ersten Befehls meiner 
Interruptroutine braucht. Mein Programm soll auch noch ohne die 
Signalgenerierung zu stören auf Eingaben über die serielle Schnittstelle 
(was dann auch wieder irgendwelche Interrupts wären) reagieren können.

Ich frage dies, da ich die Erfahrung mit Motorola 68k Systemen gemacht 
habe, wo ein Interrupt bereits 44 Zyklen bis zur Ausführung des ersten 
Befehls aus der Interruptroutine braucht.

Für Eure Hilfe wäre ich dankbar!

Grüße,
Matthias

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein nackter Interrupt kostet 10 Zyklen, ein leerer Interrupt 30 Zyklen 
(AVR-GCC).

Um Frequenzen zu erzeugen eignet sich der ATTiny25 oder 261 sehr gut, da 
diese ne interne PLL (64MHz) für den Timer haben.
Die Frequenmz macht man dann im PWM- oder Toggle-Pin-Modus.
Damit ist es wurscht, wie lange ein Interrupt dauert.


Peter

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Peter,

danke für Deine schnelle Antwort.

Was ist der Unterschied zwischen einem leeren und einem nackten 
Interrupt?

Ich befürchte, dass ich doch Interrupts brauchen werde, da ich kein 
bloses Rechtecksignal der angegebenen Frequenz brauche sondern bestimmte 
Bitfolgen senden muss. Im Endeffekt eine serielle Datenübertragung.

Matthias

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die Bits in deinem Signal immer Gleich lang sind, kannst du evtl. 
UART oder SPI dafür verwenden, und bist alle Timingprobleme los?

Oder, wenns ganz schnell sein soll, mach das nicht über den 
Timer-Interrupt sondern direkt (mit Abgezählten 
Taktzyklen/Instruktionen) im Hauptprogramm (so wie z.B. die Software-USB 
Implementierungen)

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider sind die Bitfolgen nicht immer gleichlang, sie werden dazu 
benützt um Befehle über einen Energie-Daten-Bus zu senden. Also 
dynamisch generiert.

Die Signalerzeugung im Hauptprogramm habe ich mir auch schon überlegt, 
nur wenn dann Interrupte von irgendwo anders her kommen (z.B. serielle 
Schnittstelle Recieve Buffer full oder sowas) wird das Timing der 
Impulse gestört. Oder?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias wrote:
> Was ist der Unterschied zwischen einem leeren und einem nackten
> Interrupt?

Nackt heißt abschalten der Registersicherung, der Programmierer muß das 
dann manuell tun.

Ein leerer Interrupthandler sichert immer 3 Register (SREG, R0, R1).

Eigentlich würde SREG ausreichen, wenn man nicht ausgerechnet R0,R1 
dafür und als Zero-Register genommen hätte, sondern z.B. R2,R3.
R0,R1 sind nämlich schon von bestimmten Befehlen belegt (LPM,SPM,MUL).


Peter

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, das heißt ich brauche doch 30 Zyklen... Die Signalerzeugung im 
Hauptprogramm ist dann glaube ich doch effektiver, da ich nicht jedesmal 
30 Zyklen verschwende.

Gibt es eine Möglichkeit sämtliche Interrupts auszuschalten, so dass 
mein Hauptprogramm absolut Timingsicher läuft?

Kann ich ohne Interrupts über die serielle Schnittstelle kommunizieren? 
Ich stelle mir das so vor, dass ich in einer Schleife ständig den 
Füllstand des Eingangspuffers überprüfe und wenn der voll ist dann die 
Daten hole, also polling. Abhängig davon muss natürlich dann die Anzahl 
der Wartezyklen sein.

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.