Forum: Mikrocontroller und Digitale Elektronik M16C65 HW Interrupt


von Bruno N. (nusbr)


Lesenswert?

Brauche Eure Hilfe

M16C65 R5F3650EDFB

Habe Probleme mit INT0 und INT1. Beim ausführen des Interrupts hängt 
sich der uC auf. Was ist falsch???

main
1
//Include Dateien
2
#include "sfr65.h"      //Special Function Register Definition
3
#include "stdio.h"      //Standart io
4
#include "stdlib.h"
5
#include "lowlevelinit.h"     //Lowlevelinit
6
#include "driver_lcd.h"    //Treiber 4x20 Zeichen LCD 
7
8
9
//Variabeln Konstanten Global
10
char  encoder_wert=0x00;
11
char  encoder_flag=0x00;
12
13
//Defines
14
//Interrupts
15
16
/*INTERRUPTROUTINE------------------------------------------------------------
17
**  Funktion:         INT0 Interruptroutine encoder taste
18
**  Parameter:        Keine
19
**  Rückgabe:          Keine
20
**  Hardwareadresse INT0
21
**---------------------------------------------------------------------------*/
22
#pragma INTERRUPT int_enc_taste    //Encoder Tasten Interrupt
23
void int_enc_taste (void)
24
{  asm("fclr I");      //protect bit löschen
25
  int0ic = 0;            //int0 deaktivieren
26
  asm("fset I");      //protect bit aktivieren
27
p10_0 = 0x00;//TEST
28
asm("fclr I");        //protect bit löschen
29
  ir_int0ic = 0;      //int0 flag löschen
30
  int0ic = 1;            //int0 aktivieren
31
  asm("fset I");      //protect bit aktivieren
32
  return;
33
}
34
//ENDE INTERRUPTROUTINE ENCODER_Kanal1
35
36
/*INTERRUPTROUTINE------------------------------------------------------------
37
**  Funktion:         INT1 Interruptroutine encoder kanal1
38
**  Parameter:        Keine
39
**  Rückgabe:          Keine
40
**  Hardwareadresse INT1
41
**---------------------------------------------------------------------------*/
42
#pragma INTERRUPT int_enc_ch1    //Encoder Kanal1 Interrupt
43
void int_enc_ch1 (void)
44
{  asm("fclr I");      //protect bit löschen
45
  int1ic = 0;            //int1 deaktivieren
46
  asm("fset I");      //protect bit aktivieren
47
p10_0 = 0x00;//TEST
48
  asm("fclr I");      //protect bit löschen
49
  ir_int1ic = 0;      //int1 flag löschen
50
  int1ic = 1;            //int1 aktivieren
51
  asm("fset I");      //protect bit aktivieren
52
//  return;
53
}
54
//ENDE INTERRUPTROUTINE ENCODER_Kanal1
55
56
57
58
//Hauptprogramm
59
void main(void)
60
{
61
}

*sect30.inc*
1
  .lword  dummy_int    ; vector 27  (for user) timer B1
2
  .lword  dummy_int    ; vector 28  (for user) timer B2  .glb  _int_enc_taste  ; INT0 (software int 29)
3
  .lword  _int_enc_taste  ; INT0 (software int 29)
4
  .glb  _int_enc_ch1  ; INT1 (software int 30)
5
  .lword  _int_enc_ch1  ; INT1 (software int 30)
6
  .lword  dummy_int    ; vector 31  (for user) int2
7
  .lword  dummy_int    ; vector 32  (for user or MR30)
8
  .lword  dummy_int    ; vector 33  (for user or MR30)

Danke

von Tauwetter (Gast)


Lesenswert?

Ohne mir das Datenblatt des µC anzusehen, eine Interrupt-Routine zu 
einem externen INT sieht immer so aus: INT-Flag löschen, Aktion 
ausführen und fertig.
Ich sehe nicht, was 'fclr I', 'fset I' und das Aktivieren und 
Deaktivieren in der Routine sollen. Das INT-Flag muß gelöscht werden, 
das sehe ich nicht. Bleibt es gestzt, hängt der Prozessor.

Falls Du erwartest, dass P10_0 toggelt, dann solltest Du einmal eine '1' 
und das andere Mal eine '0' schreiben.

von Bruno N. (nusbr)


Lesenswert?

Also FSET I schaltet die Interrupts frei

Aber es sieht so aus als der Eintrag in sect30.inc fehlschlägt und der 
uC ins Nirvana geht!

von Bruno N. (nusbr)


Lesenswert?

Habe den Fehler gefunden!

im sect30.inc stand
1
.if  0
1
;---------------------------------------------------------------------
2
; variable vector section
3
;---------------------------------------------------------------------
4
    .section  vector,ROMDATA
5
    .org    __VECTOR_ADR__
6
7
.if  = 0
8
    .lword   dummy_int    ; vector  0  BRK
9
    .lword  dummy_int    ; vector  1
10
    .lword  dummy_int    ; vector  2
11
    .lword  dummy_int    ; vector  3
12
    .lword  dummy_int    ; vector  4  (for user) int3
13
    .lword  dummy_int    ; vector  5  (for user) timerB5
14
    .lword  dummy_int    ; vector  6  (for user) timerB4
15
    .lword  dummy_int    ; vector  7  (for user) timerB3
16
    .lword  dummy_int    ; vector  8  (for user) si/o4/int5
17
    .lword  dummy_int    ; vector  9  (for user) si/o3/int4
18
    .lword  dummy_int    ; vector 10  (for user) Bus collision detection
19
    .lword  dummy_int    ; vector 11  (for user) DMA0


müsste aber
1
.if  __MVT__ == 0

stehen
1
;---------------------------------------------------------------------
2
; variable vector section
3
;---------------------------------------------------------------------
4
    .section  vector,ROMDATA
5
    .org    __VECTOR_ADR__
6
7
.if  __MVT__ == 0
8
    .lword   dummy_int    ; vector  0  BRK
9
    .lword  dummy_int    ; vector  1
10
    .lword  dummy_int    ; vector  2
11
    .lword  dummy_int    ; vector  3
12
    .lword  dummy_int    ; vector  4  (for user) int3
13
    .lword  dummy_int    ; vector  5  (for user) timerB5
14
    .lword  dummy_int    ; vector  6  (for user) timerB4
15
    .lword  dummy_int    ; vector  7  (for user) timerB3
16
    .lword  dummy_int    ; vector  8  (for user) si/o4/int5
17
    .lword  dummy_int    ; vector  9  (for user) si/o3/int4
18
    .lword  dummy_int    ; vector 10  (for user) Bus collision detection
19
    .lword  dummy_int    ; vector 11  (for user) DMA0

Was es genau bedeutet weis ich nicht, funktioniert aber ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.