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
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.