Hallo,

Ik ben nu aan het programmeren met de 18F2550 in C18. Nu loop ik tegen het probleem aan dat de interrupts niet werken. Ik ben naar mijn mening alles geprobeerd maar het wil niet lukken. Hij reageert nergens op. Het is de bedoeling dat als de schakelaar die via INT0 aan de ground zit gesloten wordt, dat er dan een character gestuurd wordt via rs232. RS232 heb ik wel werkend gekregen maar de interrupt nog niet. Kan iemand misschien naar mijn code kijken en me vertellen wat er mis mee is?


#include <p18cxxx.h>
#include <xlcd.h>
#include <delays.h>
#include <stdlib.h>
#include <stdio.h>
#include <usart.h>
#include <portb.h>
#define DATAPORT PORTB
#define RS_Pin	PORTBbits.RB2
#define E_Pin	PORTBbits.RB3


#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config DEBUG = ON

void ISR(void);

#pragma code HIGH_INTERRUPT_VECTOR = 0x8
void high_ISR (void)
{
    _asm
           goto ISR
   _endasm
}

#pragma code
#pragma interrupt ISR
void ISR(void)
{
     
	WriteUSART( 111 );
       INTCONbits.INT0IF = 0;
}


void EnableHighInterrupts (void)
{
  RCONbits.IPEN = 1;         /* enable interrupt priority levels */
  INTCONbits.GIEH = 1;       /* enable all high priority interrupts */
}



void main( void )
{

PORTB=0;
CMCON=0x07;
CCP1CON = 0x0F;
ADCON1 = 0xCF;


 UCONbits.USBEN=0;
 UCFGbits.UTRDIS=1;
       
EnableHighInterrupts();


OpenRB0INT (PORTB_CHANGE_INT_ON & /* enable the RB0/INT0 interrupt */
              PORTB_PULLUPS_ON &    /* configure the RB0 pin for input */
              FALLING_EDGE_INT);    /* trigger interrupt upon S3 button
                                       depression */

TRISC=240;
PORTC=0;



OpenUSART( USART_TX_INT_OFF &
USART_RX_INT_OFF &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_CONT_RX &
USART_BRGH_HIGH,
130 );

while(1)
{
PORTB=254;
WriteUSART( 110);
Delay10KTCYx(10);
PORTB=0;
Delay10KTCYx(10);
}
}

Je moet PORTB uitlezen na een interrupt. Staat ook ergens vaag in de datasheet. Zie onderstaande code (werkt!):


void high_isr(void);
void low_isr(void);

#pragma code high_vector = 0x08
	void interrupt_at_high_vector (void){
		_asm goto high_isr _endasm;
	}
#pragma code

#pragma interruptlow high_isr
void high_isr(void) {
	char q;
	// PortB change interrupt
	if(INTCONbits.RBIF == 1) {
		q = PORTB;
		// something
		q = PORTB;
		INTCONbits.RBIF = 0;
	}
	// PortB interrupt
	if(INTCONbits.INT0IF == 1) {
		q = PORTB;
		// something
		q = PORTB;
		INTCONbits.INT0IF = 0;
	}
}