PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Timer1 bei Mega32



ACsenf
15.12.2005, 11:40
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

PicNick
15.12.2005, 11:51
Bevor wir alle in den Datasheets versinken: Timer Stoppen VOR Änderung ?
Btw: die kanst auch den Prescaler als variable führen
presc = 1, 2, 3, 4 (/1, /8, /64, /256)
und selber reinpinseln:
TCCR1B = TCCR1B AND &HF8 ' löschen prescaler
TCCR1B = TCCR1B OR presc ' setzen prescaler

ACsenf
15.12.2005, 12:03
Hallo!

Danke für den Hinweis, werde es gleich morgen mal austesten. Den timer stoppe ich vorher und wird erst ganz am Ende des Subs, das die Änderungen macht wieder gestartet.
Noch eine Frage zu deinem Hinweiß, von welchem Variablentyp muss presc=xx sein? Muss der Prescaler generell gelöscht werden, bevor ich einen neuen Wert setze?

mfg

Sven

PicNick
15.12.2005, 12:32
prec sollt' ein byte sein.
Prescaler sind drei bit, die gehören gesetzt, ohne sonstwas zu ändern. Und das geht am besten eben so.
wie gesagt, bin nicht sicher wegen des Stoppens, aber einen Versuch ist es schon wert.

ACsenf
16.12.2005, 10:39
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

PicNick
16.12.2005, 12:13
Ich hab mir das angesehen.
1. Du kannst einfach schreiben: TCCR1B = presc (BasCom tut das auch so). das AND und OR is unnötig.
2. Dein Fehlschlag ist so nicht zu erklären.
Kannst du deine Source (komplett) posten, oder, wenn's geheim ist, schick' mir eine PN, ich schweige und lösch' es dann.

hrei
16.12.2005, 13:31
Hallo,

das Problem ist auch im englischsprachigen Forum bekannt.
Der auch dort gegebene Rat, das TCCR direkt zu beschreiben, scheint allerdings nicht zu funktionieren. Es wird immer auf 1024 zurückgestellt. Den Bug gab es schon irgendwann mal, wenn ich recht erinnere, nun ist er zusammen mit anderen Ärgernissen wieder da.

MCS läßt in letzter Zeit deutlich nach. Da wird ein Support für 99,-- EUR jährlich angeboten, der ja auch für die Katz wäre, da die Lösung für einige Probleme einfach nicht existiert (TAB-Ärgernis, M168 Timer2 Problem).
Der Forensupport von MCS bzw. den dort vertretenen Nutzern, ist teilweise so dümmlich, das es nur mehr Ärger schafft. Ratschläge wie: "Nimm statt TAB einfach ein paarmal die Leertaste" sind nun mal unter der Grasnarbe.

Gäbe es eine echte (Basic) Alternative, würde ich sie mittlerweile nutzen.

Grüße
Henrik

PicNick
16.12.2005, 19:13
Der auch dort gegebene Rat, das TCCR direkt ..nicht zu funktionieren.

Ich hab mir den generierten Code angeschaut, Bascom macht das beim ersten und jedes weitere Mal eigentlich vollig korrekt (insofern nutzt der ob. Workaround natürlich nix)
Ich kann eigentlich keinen Fehler vom Bascom entdecken, wüßt auch nicht, wie er das beeinflussen könnte


Es wird immer auf 1024 zurückgestellt. Den Bug gab es schon irgendwann mal

Du sagst, nach dem write in das Prescaler register steht was anderes drinnen ?

ACsenf
20.12.2005, 15:37
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

linux_80
20.12.2005, 19:15
Hi Sven,
normalerweise sollte es funktionieren das Programm für den M16 zu übersetzen und auf dem M32 laufen zu lassen, einfach die andere .dat angeben.
Eigentlich sollten sich der M16 und M32 nur in der Speichergrösse unterscheiden, beim Flashen aber wieder M32 angeben.
Wenn Bascom für den M16 andere libs verwendet könnte das Problem weg sein, man kann dann aber auch nur 1KB statt 2KB Sram verwenden, aber zum forschen reichts ja erstmal.