Hi,
I'm found two approaches to implements an interrupt handler on sdcc,
but none is working here.

The first one is this:

void timer_intr() interrupt 0 {
  LED_PIN ^= 1;
  INTCONbits.T0IF = 0;
}

But when compiling I get this error:

sdcc -mpic16 -p18f2680 -V -Wl-c -I/home/alan/pic/inte/ -ointe.hex inte.o
message: using default linker script "/usr/share/gputils/lkr/18f2680.lkr"
error: multiple sections using address 0

So looking at inte.asm file we see:

;--------------------------------------------------------
; interrupt vector
;--------------------------------------------------------

;--------------------------------------------------------
; global & static initialisations
;--------------------------------------------------------
; ; Starting pCode block for absolute section
; ;-----------------------------------------
S_inte_ivec_0x0_timer_intr      code    0X000000
ivec_0x0_timer_intr:
        GOTO    _timer_intr

; I code from now on!
; ; Starting pCode block
S_inte__main    code
_main:
;       .line   82; inte.c      RCONbits.IPEN = 1;
        BSF     _RCONbits, 7
;       .line   85; inte.c      INTCONbits.GIEH = 1;
        BSF     _INTCONbits, 7
;       .line   88; inte.c      INTCONbits.T0IE = 1;
        BSF     _INTCONbits, 5

Really the _timer_intr is not placed at 0x000008 but 0X000000.


The second approach is this:

DEF_INTHIGH(high_int)
DEF_HANDLER(SIG_TMR0, _tmr0_handler)
END_DEF

SIGHANDLER(_tmr0_handler)
{
  LED_PIN ^= 1;
  INTCONbits.T0IF = 0;
}

Now the compilation goes fine and the interrupt handle address is
placed at 0x000008.

But the timer0 is not generating interruptions for me. I'm sending my
file below.

What is the right solution to fix this problem?

Cheers,

Alan

#include <pic18f2680.h>
#include <signal.h> // for interrupt

// ------------------------------------------------
// change these if you're wiring the LED to other pin

#ifndef LED_TRIS
#define LED_TRIS  TRISAbits.TRISA0
#endif

#ifndef LED_PIN
#define LED_PIN   PORTAbits.RA0
#endif

// ------------------------------------------------
// configuration for PIC18F2680
// xtal based, PLL enabled (for xtal to max 10 MHz, for higher xtal
freqencies use _OSC_HS_1H )
code char at __CONFIG1H _conf1  = _OSC_HS_1H & //_OSC_HSPLL_1H &
                                  _IESO_OFF_1H &
                                  _FCMEN_ON_1H;

code char at __CONFIG2L _conf2  = _BOREN_BOHW_2L &
                                  _BORV_1_2L;   // 4.3 V

code char at __CONFIG2H _conf3  = _WDTPS_1_2H &
                                  _WDT_OFF_2H;

code char at __CONFIG3H _conf4  = _MCLRE_ON_3H &
                                  _LPT1OSC_OFF_3H &
                                  _PBADEN_OFF_3H;

code char at __CONFIG4L _conf5  = _LVP_ON_4L &
                                  _XINST_OFF_4L & // extended instruction set 
off => if enabled,
your sdcc compiled programm will not work properly!
                                  _STVREN_OFF_4L;

code char at __CONFIG5L _conf6  = _CP0_OFF_5L &
                                  _CP1_OFF_5L &
                                  _CP2_OFF_5L &
                                  _CP3_OFF_5L;

code char at __CONFIG5H _conf7  = _CPB_OFF_5H &
                                  _CPD_OFF_5H;

code char at __CONFIG6L _conf8  = _WRT0_OFF_6L &
                                  _WRT1_OFF_6L &
                                  _WRT2_OFF_6L &
                                  _WRT3_OFF_6L;

code char at __CONFIG6H _conf9  = _WRTB_OFF_6H &
                                  _WRTC_OFF_6H &
                                  _WRTD_OFF_6H;

code char at __CONFIG7L _conf10 = _EBTR0_OFF_7L &
                                  _EBTR1_OFF_7L &
                                  _EBTR2_OFF_7L &
                                  _EBTR3_OFF_7L;

code char at __CONFIG7H _conf11 = _EBTRB_OFF_7H;


DEF_INTHIGH(high_int)
DEF_HANDLER(SIG_TMR0, _tmr0_handler)
END_DEF

SIGHANDLER(_tmr0_handler)
{
  LED_PIN ^= 1;

  // Clear interrupt flag;
  INTCONbits.T0IF = 0;
}

void main() {
   // Enables priority levels on interrupts
   RCONbits.IPEN = 1;

   // Enables high priority interrupts
   INTCONbits.GIEH = 1;

   // Enables the TMR0 overflow interrupt
   INTCONbits.T0IE = 1;

   //set timer overflow
   TMR0H = 10;
   TMR0L = 0;

   //clear T0CON
   T0CON = 0;
   //set prescaler to 1:256
   T0CONbits.T0PS0 = 1;
   T0CONbits.T0PS1 = 1;
   T0CONbits.T0PS2 = 1;

   //wait until bit clear
   while(INTCONbits.T0IF)
        INTCONbits.T0IF = 0;

   //timer on
   T0CONbits.TMR0ON = 1;

   // set pin to output
   LED_TRIS = 0;

   //turn led on
   LED_PIN = 1;

   while(1) {

   }
}

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Sdcc-user mailing list
Sdcc-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sdcc-user

Reply via email to