mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt an RB0 mit PIC18F25J10


Autor: Volker G. (thirty)
Datum:

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

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.