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


von Matthias (Gast)


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

von Peter D. (peda)


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

von Matthias (Gast)


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

von Εrnst B. (ernst)


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)

von Matthias (Gast)


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?

von Peter D. (peda)


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

von Matthias (Gast)


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.

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.