Hallo! Ich hab ein kleines Problem mit dem Timer0 Compare A Interrupt. Ich brauche einen Interrupt, der mit 250 kHz aufgerufen wird. Prozessor: AT90S8515 Takt: 8Mhz Clear after Compare match angeschaltet Prescaler auf 8 OCR1AL auf 4 gesetzt Und den Interrupt aktiviert. Es funktioniert relativ gut. Problem ist folgendes: zwischen einem und dem nächsten Timeraufruf liegen 3,87 us zwischen dem nächsten und dem übernächsten dann 4.13 us. Also auf zwei Interrupts gesehen stimmt die Frequenz dann auch. Aber eben zwischen den beiden Aufrufen nicht. Was mache ich falsch? Danke. Steffen
> Ich brauche einen Interrupt, der mit 250 kHz aufgerufen wird. ... > Takt: 8Mhz Puh! Mit 32 Takten pro ISR hast Du damit eine Prozessorauslastung von 100 %.
Ja - das ist mir bewusst. Ich werde einen Mega8515 einsetzen und auf 16 MHz takten ... Während er den Timer ausführt soll es nur einen counter erhöhen und einen pin toggeln oder ihn nicht toggeln (also mit 150 kHz). Die daten, wie lang er ihn toggeln soll, bekommt er aus einem externen sram. Ich hoffe das geht ... Aber wo liegt jetzt in obigem der Fehler? Die 125 khz (also alle zwei perioden sind exakt) - nur die zwischen drin stimmen net. Und ich hab in den Routinen nix drin stehen ... (also nur, dass ein Pin auf h und wieder auf l gesetzt wird). Grüße Steffen
Ich hab gerade getestet. Das selbe Phämonen tritt auch auf, wenn ich die Frequenz des Timers zum Beispiel auf 47 kHz herunterdrehe. Also denke ich eher, dass es ein Fehler meinerseits ist. Was hab ich da falsch eingestellt? Grüße Steffen
Was heißt ,,dasselbe Phänomen'' in dem Falle? ± 1 Prozessortakt in der Interruptannahme? Ansonsten ist das sicher ohne Sourcecode schwer zu sagen. Ich würde das Ganze wahrscheinlich komplett anders lösen. Die Impulsgenerierung mit einem output compare von der Hardware auslösen lassen, dabei vorbereitend für das nächste output compare event festlegen, wie mit dem OC-Ausgang zu verfahren ist sowie den OCR-Wert eintragen, bei dem das nächste Event passiert. Damit löst das event selbst sofort automatisch die entsprechende Hardware-Aktion aus (also ggf. den Flankenwechsel) -- ohne jitter in der Interruptbearbeitung. Die Interruptroutine hat dann massig (:-) Zeit zu reagieren, da sie nur noch das nächste Event vorbereiten muß (OCR neu setzen und die nächste Flanke berechnen), damit ist sie relativ unkritisch.
Tja - das waren Frequenzunterschiede von 47,3 bis 47,7 Hz soweit ich das richtig in Erinnerung habe. Die Flanken müssen immer zur selben Zeit kommen, also alle 1 / 250000 Sekunden einmal. Das einzige was man regeln können muss (auf einene Impuls genau) ist an und aus. Also zum Beispiel 10 pulse und dann 5 'pulsenlange' pausen... wie soll man das vorbereiten? kann man mit dem OC Ausgang gleichzeitig toggeln und einen Interrupt aufrufen ?!? Grüße Steffen
Nein, Du solltest Dir mal die Funktion von output compare genauer angucken. Du änderst den OC-Ausgang nie mehr manuell, sondern läßt das jeweils vom output compare event erledigen. Das output compare event ,,tickt'' hardwaremäßig exakt (sobald der Zähler den Wert des OCR-Registers erreicht) und führt dann die programmierte Änderung (oder eben nicht-Änderung) des OC-Ausgangs aus. Außerdem löst es einen Interrupt aus, und den nutzt Du, um den nächsten OCR-Wert zu setzen sowie die nächste Hardwareaktion beim Eintreffen dieses OC-events zu programmieren.
Ah - ok. Gut danke. Ich werde das morgen probieren und mich dann wieder melden. Danke für deine schnelle Hilfe !! Grüße Steffen
Hallo zusammen. Nein - SPI kann ich leider nicht verwenden. Es halndelt sich um eine Ansteuerung eines Chips. Mehr kann ich leider (aus betrieblichen Gründen) nicht sagen. Ich werds jetzt mal so ausprobieren, wie Jörg vorgeschlagen hat. Grüße Steffen
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.