TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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);
}
}