PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC4520 ISR/Interrupt will nicht



PicNewbie
08.04.2010, 20:51
Hi Leute,

ich hab gestern angefangen auf einem PICDEM 2 PLUS mit Pickit2, MPLAB und C18 zu programmieren. ( ich komme vom AVR )
Hab meine ersten "Hello World" Programme hinter mir und wollte jetzt über den Taster S3 ( INT0 ) einen Interrupt auslösen und ne LED toggeln..
Ich hab mich dumm und dusselig durch Datenblatt und Foren gegoogelt aber nichts wollte so richtig.
Mit nem Timeroverflow funktioniert die ISR.
Was muss ich denn alles beachten. ICh hab das gefühl ich configuriere vll was in ner falschen reihenfolge oder vergesse eine kleinigkeit.
Könnt Ihr mir weiterhelfen? Ein Beispiel wäre sehr hilfreich da ich wie gesagt blutiger PIC Anfänger bin.

hier mein Versuch, bin mir grad nicht mehr so sicher ob es die letzte VErsion ist, hab soo viel ausprobiert...

Danke !!



#include <p18f4520.h>
#include <delays.h>
#include <portb.h>

void change(void);
#pragma config WDT = OFF
#pragma code HIGH_INTERRUPT_VECTOR = 0x08
void high_ISR (void){
_asm
goto change
_endasm

}
#pragma code
#pragma interrupt change
void change(void)
{
LATBbits.LATB1= !LATBbits.LATB1;
INTCONbits.INT0IF = 0;
}

void main(void)
{
TRISB=0x00;
LATB =0b00000010;
RCONbits.IPEN = 1;
//INTCONbits.INT0IE = 1;
//INTCON2bits.INTEDG0=1;
INTCONbits.GIE = 1;
OpenRB0INT (PORTB_CHANGE_INT_ON &
PORTB_PULLUPS_ON &
FALLING_EDGE_INT);
LATBbits.LATB1=1;
while(1)
{
}
}

PicNewbie
09.04.2010, 09:53
Ok... ich habs.
Hab den code nochmal neui geschrieben. Aber der Fehler liegt am Board selbst.
An RB0 hängt noch ne LED. Der interne Pullup kann die nicht genug treiben, d.h. die Spannung fällt so drastisch ab, dass der PIC18f4520 die Flanke nicht mehr erkennt.
Ein hoch auf die Entwickler die das Board entworfen haben ;)

erleichterte Grüße




#include <p18f4520.h>
#include <portb.h>

void main (void);
void InterruptHandlerHigh (void);

void
main ()
{
INTCON2=0b0000000;
TRISB=0b00000001;
LATB=0b00000110;
INTCON=0b00010000;
INTCONbits.GIE=1;
LATBbits.LATB1 =0;
while (1)
{
}
}



#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
_asm
goto InterruptHandlerHigh
_endasm
}

#pragma code
#pragma interrupt InterruptHandlerHigh
void
InterruptHandlerHigh ()
{
INTCONbits.INT0IF = 0;
LATBbits.LATB1 = !LATBbits.LATB1; //toggle LED on RB1


}