M16C65 HW Interrupt

OP #1633982
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
Gast #1634216
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.
OP #1634514
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 ;-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.