Forum: Mikrocontroller und Digitale Elektronik zwei zeitkritische Funktionen, Interruptkonflikt?


von Thomas (Gast)


Lesenswert?

Hallo Leute,

mit dem Atmega 8 lasse ich über Timer 2 ein PWM Signal ausgeben, bei dem 
per Interrupt eine sinus LUT (256) ausgelesen werden soll.Deren Frequenz 
liegt zwischen 50 und 70 Hz.
"Gleichzeitig" soll mit Timer 1 per Input Capture fortlaufend ein 
Eingangssignal von 0,5 -2 Hz ausgelesen werden, Auflösung in ms.
Jeder gemessene Wert soll auch per UART ausgegeben werden.

Fosc= 3.684000

Kann mir jemand einen Tipp geben, wie ich die Interrupts verwalte, dass 
sie sich nicht gegenseitig stören? Oder habe ich da iregndwo einen 
grundsätzlichen Denkfehler?

Für Hilfe wäre ich dankbar, auch ein Tipp wo es nachzulesen wäre, wäre 
gut. Im Tutorial habe ich nix gefunden....

Gruß

Thomas

: Verschoben durch Moderator
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Thomas schrieb:
> Kann mir jemand einen Tipp geben, wie ich die Interrupts verwalte, dass
> sie sich nicht gegenseitig stören?

Wenn ich dich recht verstanden habe, musst du weiter nichts tun als
die ISRs einfach nur kurz zu halten: beide ISRs müssen abgearbeitet
sein, bevor der jeweils nächste gleichartige Interrupt eintrifft.
Die PWM wird ja ohnehin von der Hardware erzeugt, es ist also nur
wichtig, dass in jeder Periode (also 50...70mal pro Sekunde) die
Tabelle einmal ausgelesen wird und der Wert im OCRx aktualisiert
wird.  Beim input capture zeichnet ebenfalls die Hardware den
tatsächlichen aktuellen Wert auf, du musst ihn lediglich aus dem
entsprechenden Register ausgelesen haben, bevor ein erneutes Ereignis
eintrifft (was ja vergleichsweise selten ist).

Hat nichts mit GCC zu tun, daher schiebe ich das mal.

von Thomas (Gast)


Lesenswert?

Vielen Dank für die Antwort!

Sorry, dass ich die Frage ins GCC gestellt hatte!

Wenn ich Dich recht verstanden habe, kann ich dann auch die UART,die ich 
ebenfalls mit Interrupt steuern möchte, einfach nur versuchen so kurz 
wie möglich zu halten, dann wird es eh hintereinander abgearbeitet.

Beim Input capture mit Messzeiten von 0.5 bis 2 Hz wollte ich auch mit 
Interrupt arbeiten, also ms inkrementieren. Ist das falsch? Bei fosc 
3.686400 und clk/1024 könnte ich natürlich einfach den Wert aus TNCT1 
auslesen bzw ICR. Allerdings habe ich da noch ein Verständnissproblem, 
wie ich den Time Stamp in Millisekunden umformen/ausrechnen soll, da der 
Messwert Grundlage der Berechnung zur Sinussignalsteuerung von Timer 2 
sein soll.

Gruß

Thomas

von Falk B. (falk)


Lesenswert?

@  Thomas (Gast)

>Wenn ich Dich recht verstanden habe, kann ich dann auch die UART,die ich
>ebenfalls mit Interrupt steuern möchte, einfach nur versuchen so kurz
>wie möglich zu halten,

Was denn halten? Lies mal was über Interrupts.

>Beim Input capture mit Messzeiten von 0.5 bis 2 Hz wollte ich auch mit
>Interrupt arbeiten, also ms inkrementieren. Ist das falsch?

Ja. Man berechnet einfach die Differenz zweier Messungen. Bei 2 Hz hat 
man dazu alle Zeit der Welt.

> Bei fosc
>3.686400 und clk/1024 könnte ich natürlich einfach den Wert aus TNCT1
>auslesen bzw ICR.

Genau so.

> Allerdings habe ich da noch ein Verständnissproblem,
>wie ich den Time Stamp in Millisekunden umformen/ausrechnen soll,

Kleines Einmaleins?

> da der
>Messwert Grundlage der Berechnung zur Sinussignalsteuerung von Timer 2
>sein soll.

Ja und? Das ist doch trivial. Schreibs mal aufs Papier.

MFG
Falk

von Hinz (Gast)


Lesenswert?

Trivial ist das, was man beherrscht, oder auch nur meint,
zu beherrschen. In zweitem Fall nennt mans aber nur so...

Interrupts so kurz wie möglich zu halten, ist die trivialste
Antwort - das liest man schließlich überall.

Also:
Wenn es darauf ankommt, dass der Sinus "sauber" sein soll,
muss die LUT 50 ... 70 x 256 = 12800 ... 17920 mal pro Sekunde
zum GENAU richtigen Zeitpunkt ausgelesen werden.

In diesem Fall wäre zu überlegen, ob es nicht reichen würde,
NUR den PWM-Interrupt zu nutzen, dort umgehend die LUT-Routine
abzuarbeiten und anschließend in diesem Interrupt die Erkennung
des 0,5-2,0 Hz Signals (und die nötigen RS232-Aktionen) per
Polling, also Abfrage des Zustands, abzuarbeiten.
Das 0,5-2,0 Hz Signal würde dabei auf < 0,1 ms genau erfasst
werden, es darf nur kein Puls kürzer als 0,1 ms sein.

Allen Schlaumeiern zum Trotz wäre in diesem Fall die Dauer der
Interruptroutine in relativ weiten Grenzen unkritisch!

@ Thomas:
Schau mal, ob das vom Programmablauf so funktionieren könnte,
für die Umformung der Zeitmesswerte kriegst du dann bestimmt
auch noch einen Tipp...

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.