Forum: Mikrocontroller und Digitale Elektronik STM8S - Systemclock und Timer


von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

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

von Ralph S. (jjflash)


Lesenswert?

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 !

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

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. :-)

von Ralph S. (jjflash)


Lesenswert?

smile, dennoch Danke !

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.