PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Butterfly unter BASCOM Interruptproblem mit Timer



taurus48
25.06.2006, 21:12
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

-tomas-
26.06.2006, 10:35
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:

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

taurus48
26.06.2006, 20:59
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.

-tomas-
27.06.2006, 09:34
Deshalb hatte ich mich auch gwundert, da Timer0 eigentlich läuft.

Timer1 Overflow aktivierst Du als Bascom workaround mit
TISMK1.TOIE1 = 1 ;Enable Timer1

Timer2 Overflow schreibt sich dann

TISMK2.TOIE2 = 1 ;Enable Timer2

taurus48
28.06.2006, 16:52
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?

-tomas-
28.06.2006, 17:18
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:

$regfile = "m169def.dat"
Timsk1.toie1 = 1 'Enable Timer1
Das frisst Bascom 1.11.8.1 ohne zu murren.

taurus48
28.06.2006, 17:24
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.

-tomas-
28.06.2006, 18:43
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

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.