TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: TombA en 18 de Abril de 2014, 21:32:27

Título: ERROR interrupcion USART bootloader
Publicado por: TombA en 18 de Abril de 2014, 21:32:27
hola!!!

estoy empezando con C18 y me surgio un problema que por mas que he leido muchos foros no he podido solucionar...

El hardware q uso es una placa BOOTLOADER con pic 18F2550 (sacada de la pagina de NEOTEO y modificada)

lo que quiero hacer es recibir una cadena cuando se active la interrupcion con la funcion getcusart y que salga de la interrupcion cuando el caracter que reciba sea una a


El problema que tengo es que al compilarlo me aparece el error
Error - section 'interrup' can not fit the absolute section. Section 'interrup' start=0x00000008, length=0x00000006

segun entendí es porq el espacio asignado a la interrupcion no es suficiente!! y se soluciona modificando algunos valores de la parte del re-mapeo, pero no tengo idea como se hace!!

si a alguien le pasó y pudo solucionarlo por favor q me ayude a solucionarlo,. He probado varias cosas pero sigue apareciendo el mismo error o si se compila correctamente, al grabarlo en el PIC se sobre-escribe el bootloader y tengo q cargarlo de nuevo con el PICKIT2.


dejo el codigo q estoy usando


#include <p18F2550.h>
#include <stdio.h>
#include <delays.h>
#include <usart.h>
       
        #pragma config PLLDIV      = 5         // (CRISTAL DE 20 MHz)
        #pragma config CPUDIV     = OSC1_PLL2   
        #pragma config USBDIV     = 2         
        #pragma config FOSC        = HSPLL_HS
        #pragma config FCMEN      = OFF
        #pragma config IESO         = OFF
        #pragma config PWRT        = OFF
        #pragma config BOR          = ON
        #pragma config BORV        = 3
        #pragma config VREGEN    = ON      //REGULADOR DE VOLTAJE USB
        #pragma config WDT         = OFF
        #pragma config WDTPS     = 32768
        #pragma config MCLRE      = ON
        #pragma config LPT1OSC  = OFF
        #pragma config PBADEN    = OFF
        #pragma config STVREN    = ON
        #pragma config LVP          = OFF
        #pragma config XINST      = OFF       // CONJUNTO DE INSTRUCCIONES EXTENDIDAS
        #pragma config CP0         = OFF
        #pragma config CP1         = OFF
        #pragma config CPB         = OFF
        #pragma config WRT0       = OFF
        #pragma config WRT1       = OFF
        #pragma config WRTB       = OFF       // PROTECCIÓN DE ESCRITURA PARA EL BLOCK DE BOOT
        #pragma config WRTC       = OFF
        #pragma config EBTR0      = OFF
        #pragma config EBTR1      = OFF
        #pragma config EBTRB      = OFF

#define REMAPPED_RESET_VECTOR_ADDRESS              0x1000
#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS   0x1008
#define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS   0x1018

void YourHighPriorityISRCode();
void YourLowPriorityISRCode();

extern void _startup (void);        // See c018i.c in your C18 compiler dir
#pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS

void _reset (void){
    _asm goto _startup _endasm
}

#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS
void Remapped_High_ISR (void)   {
    _asm goto YourHighPriorityISRCode _endasm
}

#pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS
void Remapped_Low_ISR (void){
     _asm goto YourLowPriorityISRCode _endasm
}

#pragma code HIGH_INTERRUPT_VECTOR = 0x08
void High_ISR (void)   {
     _asm goto REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS _endasm
}

#pragma code LOW_INTERRUPT_VECTOR = 0x18
void Low_ISR (void){
     _asm goto REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS _endasm
}

#pragma code


#pragma interrupt YourHighPriorityISRCode
void YourHighPriorityISRCode()   {
}   

//This return will be a "retfie fast", since this is in a #pragma interrupt section


#pragma interruptlow YourLowPriorityISRCode
void YourLowPriorityISRCode()   {
}   

//This return will be a "retfie", since this is in a #pragma interruptlow section



void ISRRecepcion(void);   

char cadena[10]="", dato, cad[1]="";        //variables globales
int i=0;

#pragma code interrup = 0x0008
void VectorInterrupcion(void)
  {
      _asm goto ISRRecepcion _endasm
  }

#pragma code // Cerramos seccion.-


/* ** Rutina de Interrupcion ** */
 
#pragma interrupt ISRRecepcion
  void ISRRecepcion(void)
     {
         i=0;       
 
         while (i=0)
            {
               dato=getcUSART();      // Leemos dato recibido.-
           itoa(dato,cad);            // Convierto a cadena
                strcat(cadena,cad);     // Concateno lo que hay en stringx a string
           
                if (dato='a')
                   {
                        i=1;
         }             
            }
      }


void main(void)
 {
    RCONbits.IPEN=0;                                       // Desabilitamos Prioridades.-
   INTCONbits.PEIE=1;                                // Habilitamos Interrupcion de perifericos.-
   INTCONbits.GIE=1;                                 // Habilitamos Interrupcion Global.-

   OpenUSART( USART_TX_INT_OFF &          // disables transmission interrupt 
               USART_RX_INT_OFF &                      // disables reception interrupt
               USART_ASYNCH_MODE &                  // sets it in asynchronous mode
               USART_EIGHT_BIT&                         // sets to use 8-bit data mode
               USART_CONT_RX &                          // sets the port in continues receive mode
               USART_BRGH_LOW,                         // uses the high sped Baud rate formula LOW or HIGH
               77 );                                               // si usamos LOW 9600bps=Fosc/(64*(spbrg+1)) [Fosc=frecuencia oscilador]
                                                                     // si usamos USART_BRGH_HIGH cambia 64 por 16
                                                                     // spbrg es un valor entre 0 y 255!! se usa HIGH o LOW dependiendo cual de menos error

                                                                    // http://dics.voicecontrol.ro/tutorials/brgh/calculate.php
                  /*9600-8-N-1*/
   

    ADCON1=0x0F;                                          //Todos entrada/salida digitales.-

    TRISA=0xFF;                                             //Puerto A como entrada
    stdout =_H_USART;   
   
   while(1)
      {      

        if (PORTAbits.RA0==1)                         //Si RA0 esta en nivel alto...
           {                  
                printf("%s", cadena);
           }
         if (PORTAbits.RA1==1)                        //Si RA1 esta en nivel alto...
           {         
                printf("AT+CBC\n\r");
           }      
                 
         Delay10KTCYx(255);         

      }

 
}