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
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.
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
@ 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
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...