Forum: Mikrocontroller und Digitale Elektronik Interrupt an RB0 mit PIC18F25J10


von Volker G. (thirty)


Lesenswert?

Hallo alle zusammen.
Ich möchte meinen PIC18F25J10 so einstellen, das er bei steigender 
Flanke an RB0 einen Interrupt auslöst und in die Interrupt-Routine 
springt. Wenn ich mir das nun mit meinem ICD2 anschaue, dann klappt das 
nicht. Er spingt nicht in die Routine. Habe ich eventuell ein Register 
falsch eingestellt?
als Compiler benutze ich den C18.
Hier mein Quellcode:
#include <p18cxxx.h>

//Konfiguration
#pragma config DEBUG=ON      //Background Debugger enabled, , , , , , ,
#pragma config XINST=OFF    //Instruction set extension disabled
#pragma config STVREN=OFF    //Reset on stack overflow disabled
#pragma config WDTEN=OFF    //Watchdog timer disabled
#pragma config CP0=OFF      //Programm memory is not code protected
#pragma config FCMEN=OFF    //Fail-Safe clock monitor disabled
#pragma config IESO=ON      //Two-speed startup enabled (nur wenn OSC 
auf HS steht)
#pragma config FOSC2=ON      //Clock selected by FOSC as system clock is 
enabled when OSCCON<1:0> = 00
#pragma config FOSC=HS      //High Speed oscillator
#pragma config WDTPS=1      //Watchdog Timer postscale = 1:1


void high_isr (void);              //Funktionsprototyp für Interrupt 
hohe Priorität

//Interrupt mit hoher Priorität
#pragma code high_vector=0x08
void high_interrupt(void)
{
    _asm GOTO high_isr _endasm           //Sprung zur eigentlichen ISR
}
#pragma code                   //return to the default code section
void high_isr (void)
{
  //hier Serviceroutine eintragen
  while(1);
}

//////////////////////
//  Initialisierung  //
//////////////////////

void init_ports (void)              //1=Eingang, 0=Ausgang
{
  ADCON1 = 0b00001111;            //alle digitale I/O (Datenblatt S.218)
  TRISA = 0b00000111;              //RA0...RA2 Eingänge, RA3...RA7 
Ausgänge
  PORTA = 0;                  //alle zurücksetzen
  TRISB = 0b00000001;              //RB0 = external interrupt 0 input
  PORTB = 0;                  //alle zurücksetzen
}
void init_interrupt(void)
{
  INTCON = 0b11010000;            //Interrupts generell erlauben, 
externen interrupt0 ein
  INTCON2bits.INTEDG0 = 1;          //interrupt an RB0 reagiert auf 
steigende Flanke (bit6 > INTEDG0)
  INTCONbits.INT0IF = 0;            //Interrupt zurücksetzen > auf 
erneuten Interrupt an RB0 warten
}

//////////////////////
//  Hauptprogramm  //
//////////////////////

void main (void)
{
  OSCCON = 0b00000000;            //Primary oscillator
  init_ports();
  init_interrupt();

while(1);
}


Vielen Dank für eure Hilfe und noch frohe Ostern.

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.