www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik M16C65 HW Interrupt


Autor: Bruno Nussbaum (nusbr)
Datum:

Bewertung
0 lesenswert
nicht 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
//Include Dateien
#include "sfr65.h"      //Special Function Register Definition
#include "stdio.h"      //Standart io
#include "stdlib.h"
#include "lowlevelinit.h"     //Lowlevelinit
#include "driver_lcd.h"    //Treiber 4x20 Zeichen LCD 


//Variabeln Konstanten Global
char  encoder_wert=0x00;
char  encoder_flag=0x00;

//Defines
//Interrupts

/*INTERRUPTROUTINE------------------------------------------------------------
**  Funktion:         INT0 Interruptroutine encoder taste
**  Parameter:        Keine
**  Rückgabe:          Keine
**  Hardwareadresse INT0
**---------------------------------------------------------------------------*/
#pragma INTERRUPT int_enc_taste    //Encoder Tasten Interrupt
void int_enc_taste (void)
{  asm("fclr I");      //protect bit löschen
  int0ic = 0;            //int0 deaktivieren
  asm("fset I");      //protect bit aktivieren
p10_0 = 0x00;//TEST
asm("fclr I");        //protect bit löschen
  ir_int0ic = 0;      //int0 flag löschen
  int0ic = 1;            //int0 aktivieren
  asm("fset I");      //protect bit aktivieren
  return;
}
//ENDE INTERRUPTROUTINE ENCODER_Kanal1

/*INTERRUPTROUTINE------------------------------------------------------------
**  Funktion:         INT1 Interruptroutine encoder kanal1
**  Parameter:        Keine
**  Rückgabe:          Keine
**  Hardwareadresse INT1
**---------------------------------------------------------------------------*/
#pragma INTERRUPT int_enc_ch1    //Encoder Kanal1 Interrupt
void int_enc_ch1 (void)
{  asm("fclr I");      //protect bit löschen
  int1ic = 0;            //int1 deaktivieren
  asm("fset I");      //protect bit aktivieren
p10_0 = 0x00;//TEST
  asm("fclr I");      //protect bit löschen
  ir_int1ic = 0;      //int1 flag löschen
  int1ic = 1;            //int1 aktivieren
  asm("fset I");      //protect bit aktivieren
//  return;
}
//ENDE INTERRUPTROUTINE ENCODER_Kanal1



//Hauptprogramm
void main(void)
{
}

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

Danke

Autor: Tauwetter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bruno Nussbaum (nusbr)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Bruno Nussbaum (nusbr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe den Fehler gefunden!

im sect30.inc stand
.if  0
;---------------------------------------------------------------------
; variable vector section
;---------------------------------------------------------------------
    .section  vector,ROMDATA
    .org    __VECTOR_ADR__

.if  = 0
    .lword   dummy_int    ; vector  0  BRK
    .lword  dummy_int    ; vector  1
    .lword  dummy_int    ; vector  2
    .lword  dummy_int    ; vector  3
    .lword  dummy_int    ; vector  4  (for user) int3
    .lword  dummy_int    ; vector  5  (for user) timerB5
    .lword  dummy_int    ; vector  6  (for user) timerB4
    .lword  dummy_int    ; vector  7  (for user) timerB3
    .lword  dummy_int    ; vector  8  (for user) si/o4/int5
    .lword  dummy_int    ; vector  9  (for user) si/o3/int4
    .lword  dummy_int    ; vector 10  (for user) Bus collision detection
    .lword  dummy_int    ; vector 11  (for user) DMA0


müsste aber
.if  __MVT__ == 0

stehen
;---------------------------------------------------------------------
; variable vector section
;---------------------------------------------------------------------
    .section  vector,ROMDATA
    .org    __VECTOR_ADR__

.if  __MVT__ == 0
    .lword   dummy_int    ; vector  0  BRK
    .lword  dummy_int    ; vector  1
    .lword  dummy_int    ; vector  2
    .lword  dummy_int    ; vector  3
    .lword  dummy_int    ; vector  4  (for user) int3
    .lword  dummy_int    ; vector  5  (for user) timerB5
    .lword  dummy_int    ; vector  6  (for user) timerB4
    .lword  dummy_int    ; vector  7  (for user) timerB3
    .lword  dummy_int    ; vector  8  (for user) si/o4/int5
    .lword  dummy_int    ; vector  9  (for user) si/o3/int4
    .lword  dummy_int    ; vector 10  (for user) Bus collision detection
    .lword  dummy_int    ; vector 11  (for user) DMA0

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.