Hallo,
ich bin absoluter Neuling was µCs angeht, und versuche anhand eines
Evaluation Boards den M16C62P von Renesas kennen zu lernen.
Als IDE benutze ich den mitgelieferten HEW (4.02). Da die Anleitung vom
EVB eher mager ist, versuche ich mich anhand des Tutorials von Prof.
Brett Ninness (http://sigpromu.org/brett/elec3730/m16c_tut2.pdf) mit den
verschiedenen Funktionen vertraut zu machen. (Habe nur port init
verändert und die den Inhalt der if-schleife der interrupt fkt.
verändert, da ich nur 4LEDs aber kein Display habe)
Nachdem ich nun seit zwei Tagen keinen Timer Interrupt bekomme, frag
ich mich, was ich falsch mache oder etwas vergesse:
ncrt30.a30 (Auszug)
1
mov.b #03h,0ah ;enable PRC1 and PRC0 bits
2
mov.b #00h,04h ;set processor mode
3
mov.b #08h,06h ;set to no division mode on main clock
4
mov.b #20h,07h ;
5
mov.b #00h,0ah ;disable PRC1 and PRC0 bits
6
...
7
fset I
------
sample2.c
1
#pragma INTERRUPT TimerA0int
2
voidTimerA0int(void)
3
{"lass LEDs an Port4 blinken"}//sind auch initialisiert
Timer initialisiert mit:
1
ta0mr=0x80;//f32
2
ta0=0x7A11;//10Mhz-Quarz auf EVB -> soll 10Hz
3
ta0ic=0x01;//priority lvl=1
4
tabsr|=0x01;//starten
-> sect30.inc
1
.glb_TimerA0int
2
.lword_TimerA0int
Hab zusätzlich noch ein paar Ports (p4_0-p4_3) mit LEDs die bei
interuppt blinken sollten.
Wenn ich debugge, ich hab ein Breakpoint in der Interrupt-Fkt., komme
ich dort niemals hin..
Hab ich etwas wesentliches vergessen?
Dank im Voraus
Lunarfur
Deine Angaben zu Quellcode sind unzureichend. Insbesondere interessiert,
wie die Datei sect30.inc aussieht - das ist die Datei, in der die
Interruptvektor-Tabelle angelegt ist. Fehlt deine Interruptroutine dort,
wird sie nie angesprungen (s. 2. Inserting an ISR into the Interrupt
Vector Table im o.g. Tutorial)
Habe das Forum nochmal durchsucht, aber auch der Zielprozessor ist
korrekt ausgewählt.
Auch wenn ich nicht debugge, sondern flashe und dann resette passiert
nichts.
Es muss sichergestellt sein, dass der Vektor in der Tabelle an der
richtigen Position steht. In der ersten Fassung sah ich das nicht. Der
zweite Ausschnitt sieht OK aus.
Vorsicht bei dem Flashen, wenn sec30.inc nicht 101%ig richtig ist. Ein
Vektor zuviel drin z.B. durch ein vergessenes Auskommentieren des
entsprechenden dummy_ints und man kann sich aus dem M16C (und R8C)
aussperren.
Ich weiß nicht woran es jetzt liegt, aber es funktioniert, nachdem ich
ein Demo-Programm geladen habe, jetzt geht auch mein Code.
Was ich beim weiteren Stöbern gelernt habe, und evtl. anderen helfen
kann:
Vergesst nicht den Assemblerbefehl fset I um das Interrupt Flag zu
setzen.
Woran es auch gelegen haben könnte: Denkt bei der Einrichtung des
Prozessormodes sowie der System Clock, dass das jeweilige Protection Bit
auf 1 gesetzt wird, bevor ihr die Register setzt, sonst könnte es sein,
dass ihr mit dem default nur 1/8 der CPU-Frequenz arbeitet und unter
Umständen einfach nur auf das Interrupt so lange warten müsst.
Grüße
Lunarfur