- LiTime Speicher und Akkus         
Ergebnis 1 bis 8 von 8

Thema: Butterfly unter BASCOM Interruptproblem mit Timer

  1. #1

    Butterfly unter BASCOM Interruptproblem mit Timer

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen,

    habe die Frage schon in einem anderen Forum gestellt, aber leider keine Antwort erhalten. Habe ein Problem mit dem Auslösen des Timerinterrupts beim Butterfly.
    Folgender Beispiel-Code will im BASCOM-Simulator nur mit dem 2313 einen Timer-Überlauf-Interrup auslösen. Mit der m169def.dat läuft der Timer zwar, aber es kommt zu keinem Interrupt (BASCOM-Simulator und auch in real Butterfly). Wo stelle ich mich hier zu blöd an?

    $regfile = "2313def.dat"
    '$regfile = "m169def.dat" ' keine Chance
    $crystal = 8000000


    'Configute the timer to use the clock divided by 1024
    Config Timer0 = Timer , Prescale = 1024

    'Define the ISR handler
    On Ovf0 Tim0_isr
    'you may also use TIMER0 for OVF0, it is the same
    'On Timer0 Tim0_isr ' dasselbe ( nur mit 2313)


    Enable Timer0
    the timer interrupt
    Enable Interrupts

    Do
    Print Timer0
    Loop

    'the following code is executed when the timer rolls over
    Tim0_isr:
    Print " *";
    Return

    End


    Dake für eure Hilfe

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    Die Interrupts sind im Atmega169 auf mehrere TIMSK-Register verteilt.
    Dadurch codiert Bascom z.B. 'Enable Timer2' falsch.

    Enable Timer0 (Overflow) müsste aber gehen, da es das Bit 0 des Registers TISMK0 ist.
    Ansonsten notfalls die Definitionen aus der m169def.dat verwenden:
    Code:
    On Ovf0 Tim0_isr ;OVF0=$016 Overflow0 Interrupt
    TISMK0.TOIE0 = 1 ;Enable Timer0
    Lange Rede, kurzer Sinn: Den Simulator kannst Du bei den 169-Registern vergessen. Teste es am am lebenden Objekt.
    Bei Problemen melde Dich noch mal...

  3. #3
    Hallo Thomas,

    danke für deine Antwort und sorry. Habe den falschen code gepostet.
    Timer0 funktioniert mit der 169def.dat. (copy and paste=copy and waste)
    Hatte das Problem mit dem Timer1. Weiß aber jetzt, dass es nicht an mir lag und versuch das Problem mit Timer0 über ein UP zu lösen.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    Deshalb hatte ich mich auch gwundert, da Timer0 eigentlich läuft.

    Timer1 Overflow aktivierst Du als Bascom workaround mit
    Code:
    TISMK1.TOIE1 = 1 ;Enable Timer1
    Timer2 Overflow schreibt sich dann
    Code:
    TISMK2.TOIE2 = 1 ;Enable Timer2

  5. #5
    Hi Thomas,

    lauf noch nicht rund mit Bascom. Wie meinst du das mit" Timer1 Overflow aktivierst Du als Bascom workaround mit"
    Im Quältext bringt er mir hier eine Fehlermeldung, oder muss das in der 169def.dat geändert werden?

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    Das war nur ein Test, ob Du auch schön brav in das Atmega169-Datenblatt und in die Datei m169def.dat reinschaust...

    Offensichtlich nicht, deshalb hier noch mal ohne Syntax-Fehler:
    Code:
    $regfile = "m169def.dat"
    Timsk1.toie1 = 1                                            'Enable Timer1
    Das frisst Bascom 1.11.8.1 ohne zu murren.

  7. #7
    Ich weiß, in der 169def.dat stehts vom Syntax so ähnlich, wie du es gerade gepostet hast.

    Danke noch mal. Kanns aber erst morgen an der arbeit proben.

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    Nee ernsthaft, es funktioniert nur, wenn es in der 169def.dat steht!!

    Deshalb noch mal zum besseren Verständnis aus der 169def.dat
    TIMSK1 = $6F

    ; *** TIMSK1 ***
    ICIE1 = 5
    OCIE1B = 2
    OCIE1A = 1
    TOIE1 = 0
    ... so und jetzt schaun wir mal in die doc2514.pdf von atmel zum AtMega169
    Seite 341: "Register Summary" (0x6F) TIMSK1

    Seite 122: TIMSK1
    Bit 0 TOIE1
    : Timer/Counter1, Overflow Interrupt Enable
    When this bit is written to one, and the I-flag in the Status Register is set (interrupts globally enabled), the Timer/Counter1 Overflow interrupt is enabled. The corresponding Interrupt Vector (See Interrupts on page 46.) is executed when the TOV1 Flag, located in TIFR1, is set.
    Den angesprochenen Interruptvektor musst Du in Bascom noch setzen mit
    Code:
    On Timer1 Tim1_isr
    und das TOV1-Flag ist Dein Overflow

    Ich hoffe, ich habe Dich jetzt zum weiteren LESEN animiert.
    Du kannst in Bascom alles machen, was Atmel im Manual beschreibt. D.h. wenn der Bascom Befehl nicht funktioniert (BUG) dann setze die Register per Hand.

Berechtigungen

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

LiTime Speicher und Akkus