Hallo zusammen, ich werkel immer noch an meinem eigenen Routinen für STM8S Controllern und mittlerweile weiß ich nicht, ob ich das Teil lieben oder hassen sollte. Weil mir (wie bei den STM32 Controllern auch) die Standardperipherals nicht gefallen und schlimmer noch die StdPeriphals für den STM8 nicht ohne Patch mit dem SDCC vereinbar sind, "bastel" ich mir meine eigenen Routinen zum Umgang mit dem STM8S. Momentan hänge ich (leider wohl wieder) beim Systemtakt und/oder dem Timer. Ich möchte den Timer1 interruptmässig betreiben und an sich dachte ich: Okay, diesmal war es einfach - und es war es nicht. Folgendes: Ich initialisiere den Systemtakt (wahlweise mit und ohne Quarz), initalisiere den Timer1 in Verbindung mit Autoreloadwerten. Zur Fehlersuche habe ich sämtliche Header und Libs entfernt. Das angehängte Programm soll 500 Hz Timer-Interruptgesteuert produzieren. Frequenz wird mit HAMEG HM8021-3 (1.6 GHz conter) kontrolliert (Frequenzzähler wurde mit 3 Frequenznormalen überprüft und zeigt absolut korrekt an). Das angehängte Programm macht folgendes: - es produziert eine Frequenz von 466,8 Hz mit internem Osszillator (mit 0,05 Hz Schwankungen, die des RC-Oszillators wegen wohl normal sein dürften) - es produziert eine Frequenz von 470,083 Hz mit externem Osszillator (und das absolut frequenzstabil) - ändert man den Reloadwert von 1000 in TIM1_ARRH und TIM1_ARRL auf 500 wird die Frequenz in beiden Fällen absolut korrekt verdoppelt (weshalb ich an sich davon ausgehe, dass die Auto-Reload Automatik des Timers korrekt funktioniert). - ändere ich bei Betrieb mit externem Quarz den Quarz von 16 MHz auf 20 MHz habe ich eine absolut korrekte proportionale Änderung von 470,083 auf 587,60 Hz Übersetzt wird das Versuchsprogramm mit: sdcc -mstm8 versuche_int.c (also keinerlei Optimierung). ---------------------------------------------------- Ich dachte: - Clockprescaler des Timers / 16 ergibt einen Timertakt von 1 MHz = 1 µs - Autoreloadwert von 1000 bedeutet, Interrupt wird in 1 µs * 1000 = 1 ms aufgerufen. - wird dort ein Pin getoggelt müsste das 500 Hz ergeben !!! Tut es aber nicht, es sind (mit Quarz) 470,083. Wo ist jetzt mein Fehler ????? In der Initalisierung des Systemtakts oder in der Programmierung des Timers. Wo habe ich etwas entscheidendes vergessen? (nein, es dreht sich nicht darum, einen genauen 500 Hz Takt "hinzudrehen", dazu müsste man nur mit dem Prescaler und dem Autoreloadwert "rumspielen" bis ein noch genauerer Frequenzzähler (Tektronix) sagt, es sind genau 500 Hz), sondern mir geht es um den systematischen Fehler den ich wohl begangen habe, die 500 Hz sind von mir willkürlich gewählt ! Ich denke, ich habe im Datenblatt irgendwas überlesen, weiß jemand was das ist (für mich sieht es so aus, als würde bei Verwendung eines 16 MHz Quarzes ein 15,066 MHz Quarz verwendet werden, den es gar nicht gibt) ? Gruß, Ralph
Boooooooaaaah, bin ich doof ! Da mache ich einen ganzen Abend lang rum .... und wie ich das hier gepostet hab, fällt es mir wie Schuppen von den Augen: um einen Teiler / 16 zu haben, muß das Prescalerregister den Wert 15 beinhalten. Sorry, betrachtet meine obige Anfrage als obsolet !
Ich war gerade dabei, Dir das als Antwort zu schreiben: Kapitel "17.3.3 Prescaler". Du warst schneller. Ja, solche Tage gibt es. Das liegt am Wetter. :-)
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.