-         

Ergebnis 1 bis 10 von 10

Thema: Problem mit Timer1 bei Mega32

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    22.03.2005
    Beiträge
    91

    Problem mit Timer1 bei Mega32

    Anzeige

    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 , 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

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    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
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    22.03.2005
    Beiträge
    91
    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

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    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.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    22.03.2005
    Beiträge
    91

    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

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    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.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    64
    Beiträge
    277
    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

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Zitat Zitat von hrei
    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

    Zitat Zitat von hrei
    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 ?

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    22.03.2005
    Beiträge
    91

    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

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •