Problem mit Timer1 bei Mega32
Hallo!
Nun ist es mal wieder soweit und etwas funktioniert nicht.
Kurz worum es geht: Ich bin gerade daran mit dem Atmega 32 einen Frequenz bzw. Pulsmustergenarotor zu programmieren. Der Timer muss verwendet werden, da in der Zwischenzeit auch noch andere Funktionen ausgeführt werden müssen.
Da ich kein Freund von ewigen Tabellen bin, viel zu viel Aufwand O:) , habe ich ein Unterprogramm geschrieben, welches den benötigten Prescalerwert bestimmt und dann den zur Vorgewälten Frequenz passenden Reloadwert berechnet. Das benötigt zwar etwas Zeit macht aber nix, da es im Setupmode abläuft. Dieser Teil funktioniert einwandfrei!
Nun aber zum Problem: Ich hatte das ganze, damals allerdings mit direkten Werten mit einem AT90S8515 getestet und sah so aus:
If A = 0 Then
A = 1
Elseif A = 1 Then
Config Timer1 = Timer , Prescale = 256 'Ausgabe 0,5Hz
Timervorgabe1 = 49911
Elseif A = 2 Then
Config Timer1 = Timer , Prescale = 256 'Ausgabe 1Hz
Timervorgabe1 = 57724
Elseif A = 3 Then
Config Timer1 = Timer , Prescale = 256 'Ausgabe 1,5Hz
Timervorgabe1 = 60328
Elseif A = 4 Then
Config Timer1 = Timer , Prescale = 64 'Ausgabe 2Hz
Timervorgabe1 = 49911
Elseif A = 5 Then
Config Timer1 = Timer , Prescale = 64 'Ausgabe 2,5Hz
Timervorgabe1 = 53036
Elseif A = 6 Then
Config Timer1 = Timer , Prescale = 64 'Ausgabe 3Hz
Timervorgabe1 = 55119 .... usw
Dies klappt auf dem 8515. Nicht aber auf dem Mega32!!!
Das jetzige Programm ist natürlich viel übersichtlicher, da nur noch Verzweigungen für die benötigten Prescale Werte nötig sind.
Allerdings übernimmt der Chip im laufenden Programm den neuen Wert einfach nicht. Da man für Prescale ja keine Variable nehmen kann muss es ja wie oben gelößt werden. Habe das Programm schon zig mal im Simulator getestet, und da geht alles. Auf dem Chip selber sieht man dass alles korrekt abläuft, bis ein neuer Prescale geladen werden müsste, der wird einfach nicht übernommen.
Kennt jemand dieses Problem? Oder gibt es eine andere Lösung? Warum funktioniert es mit dem 90S8515 und nicht mit dem Mega32? Den Timer 1 müsste ich verwenden, weil ich bis 0,5 Hz gehen muss!
Der Quarztakt ist auch in Ordnung, sonst würde das Programm ja mit den in der Init gesetzten ja nicht richtig funktionieren.
Bin auf Eure Antworten gespannt,
Sven
Immer noch Problem mit dem Timer1 Prescaler
Hallo!
Deinen Tipp habe ich getestet. Läßt sich zwar kompilieren und auch Simulieren, aber funtionieren tut es in der Realität leider nicht :-(.
D.h. Der Prescaler wird nicht verändert, wie er sollte.
mfg
Sven
Prescaler läßt sich nicht verändern
Hallo!
So erstmal Danke für die Antworten! Es scheint aber wirklich so zu sein, daß der Fehler im Bascom liegt. Bei einem AT90S8515 funktioniert es wunderbar und ich kann ohne Kunstgriffe jede beliebige Zeit erzeugen.
Da ich mein Projekt nicht einstampfen kann habe ich das jetzt mit krücken umgangen...Timer mehrfach laufen lassen oder mit Wait, zum Glück muss der Controller in den langen zu erzeugenden Pulspausen nichts machen, sonst ginge das nicht. Da sonst Wait oder dauernde Interrupts alles andere blockieren würden.
Kann das evtl. auch am Chip liegen? Also ich meine am Typ? Prozessor habe ich schon getauscht, es ist bei jedem so. Ein Mega 16 käme noch in Frage, da hier das Pinning passt. Wäre ein Versuch wert, oder?
Zum simulieren mit Bascom, ja da sieht man schön, wie alles klappt, das sagt aber noch lange nichts drüber aus, ob es dann tatsächlich im Chip auch so läuft. Vermutlich setzt Bascom etwas nicht korrekt um???
Überprüfen kann man sowas nur mit einem Monitorprogramm, das einem tatsächlich die Geschehnisse im Chip zeigt. Gibt es sowas eigentlich für Bascom, oder überhaupt für Atmels, um so zu Debuggen?
Bin leider nicht so fit in assembler, aber wäre es vielleicht auch möglich mit Inline-Assembler den Prescaler zu verändern?
Gruß
Sven