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 !!
Code:#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) { } }
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
Code:#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 }
Lesezeichen