Autor Tema: Ayuda con la interrupcion en XC8 - no funciona  (Leído 7360 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado daca1953

  • PIC10
  • *
  • Mensajes: 7
Ayuda con la interrupcion en XC8 - no funciona
« en: 19 de Agosto de 2019, 02:12:52 »
Buenas tardes compañeros.

tengo una duda ya que no he podido dar solucion al siguiente problema.

Lo que quiero es hacer la funcion de interrupcion con el compilador XC8 que se active cuando se desborde el Timer 0 del uC, estoy usando un PIC18F2550 y tengo el siguietne codigo: (solo es una practica del TIMER0)

********************************************
#include <xc.h>
#include <stdio.h>
#include "config.h"

void interrupt interrupcion(void){
    LATAbits.LA0=!PORTAbits.RA0;
    INTCONbits.T0IF=0;
    return 0;
}

void main(void) {
    //OSCILADOR
    OSCCONbits.IDLEN=0;         //modo IDLE
    OSCCONbits.IRCF=0b111;      //freq 8MHz
    OSCCONbits.SCS=0b10;        //oscilador interno
    //I/O
    ADCON1bits.PCFG=0b1111;     //todos los pines digitales
    TRISAbits.TRISA0=0;         //RA0 out
    LATAbits.LA0=1;             //LED apagado
    //INTERRUPCIONES
    RCONbits.IPEN=0;            //sin prioridad de interrupcion
    INTCONbits.GIE=1;           //habilita interrupciones no mascarables
    INTCONbits.T0IF=0;
    INTCONbits.T0IE=1;          //habilita int TMR0
    //TIMER 0
    T0CONbits.T08BIT=0;         //16bit
    T0CONbits.T0CS=0;           //fuente del oscilador interno
    T0CONbits.PSA=0;            //prescaler asignado
    T0CONbits.T0PS=0b100;       //1:32
    T0CONbits.TMR0ON=1;         //encendido de es
    while(1){
       
    }
    return;
}
********************************************
El problema es que al copilar me sale error y me dice esto:

main.c:5:6: error: variable has incomplete type 'void'
void interrupt interrupcion(void){
     ^
main.c:5:15: error: expected ';' after top level declarator
void interrupt interrupcion(void){
              ^
              ;

pero no he podido corregir el error :shock: :shock: y la verdad no lo encuentro, agradeceria mucho la ayuda para solucionar este problema

De ante mano muchas gracias.

Saludos :D

Desconectado AccioRw

  • PIC16
  • ***
  • Mensajes: 165
Re:Ayuda con la interrupcion en XC8 - no funciona
« Respuesta #1 en: 19 de Agosto de 2019, 04:16:06 »
void interrupt interrupcion(void){
    LATAbits.LA0=!PORTAbits.RA0;
    INTCONbits.T0IF=0;
    return 0;
}
********************************************
El problema es que al copilar me sale error y me dice esto:

main.c:5:6: error: variable has incomplete type 'void'
void interrupt interrupcion(void){

Hola daca1953, al menos uno de los errores en la función de la interrupción es que tienes puesto al final "return 0;"
quita el 0 por que al ser una funcion void... no puedes retornar nada así que dejalo solo en "return;"
o quitale el "return;" directamente, prueba a ver si ha mejorado algo  :)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda con la interrupcion en XC8 - no funciona
« Respuesta #2 en: 19 de Agosto de 2019, 07:41:35 »
Es correcto, removiendo los 2 return el MPLAB devuelve lo siguiente:

Citar
BUILD SUCCESSFUL (total time: 2s)

Desconectado daca1953

  • PIC10
  • *
  • Mensajes: 7
Re:Ayuda con la interrupcion en XC8 - no funciona
« Respuesta #3 en: 19 de Agosto de 2019, 14:26:10 »
hola

puse el codigo como me dicen y me sigue saliendo el error

void interrupt interrupcion(){
    LATAbits.LA0=!PORTAbits.RA0;
    INTCONbits.T0IF=0;
}

******************

main.c:5:6: error: variable has incomplete type 'void'
void interrupt interrupcion(){
     ^
main.c:5:15: error: expected ';' after top level declarator
void interrupt interrupcion(){
              ^
              ;

 :z) :z) :z)

sera algo que esta mal instalado del compilador? porque volvi a crear el rpyecto y pear el codigo y nada

porque si a  KILLERJC le compila, ya debe sera algun problema

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda con la interrupcion en XC8 - no funciona
« Respuesta #4 en: 19 de Agosto de 2019, 15:17:56 »
Yo no tengo el config.h , tal ves ahi este el error. Que tiene ese archivo?

Desconectado daca1953

  • PIC10
  • *
  • Mensajes: 7
Re:Ayuda con la interrupcion en XC8 - no funciona
« Respuesta #5 en: 19 de Agosto de 2019, 15:53:55 »
Son los bits de configuracion, mira:

***************************
// PIC18F2550 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1L
#pragma config PLLDIV = 1       // PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly))
#pragma config CPUDIV = OSC1_PLL2// System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])
#pragma config USBDIV = 1       // USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes directly from the primary oscillator block with no postscale)

// CONFIG1H
#pragma config FOSC = INTOSCIO_EC// Oscillator Selection bits (Internal oscillator, port function on RA6, EC used by USB (INTIO))
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)

// CONFIG2L
#pragma config PWRT = ON        // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOR = ON         // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
#pragma config BORV = 1         // Brown-out Reset Voltage bits (Setting 2 4.33V)
#pragma config VREGEN = ON      // USB Voltage Regulator Enable bit (USB voltage regulator enabled)

// CONFIG2H
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)

// CONFIG3H
#pragma config CCP2MX = ON      // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
#pragma config PBADEN = OFF     // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
#pragma config LPT1OSC = OFF    // Low-Power Timer 1 Oscillator Enable bit (Timer1 configured for higher power operation)
#pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)

// CONFIG4L
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = OFF        // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))

// CONFIG5L
#pragma config CP0 = OFF        // Code Protection bit (Block 0 (000800-001FFFh) is not code-protected)
#pragma config CP1 = OFF        // Code Protection bit (Block 1 (002000-003FFFh) is not code-protected)
#pragma config CP2 = OFF        // Code Protection bit (Block 2 (004000-005FFFh) is not code-protected)
#pragma config CP3 = OFF        // Code Protection bit (Block 3 (006000-007FFFh) is not code-protected)

// CONFIG5H
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block (000000-0007FFh) is not code-protected)
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM is not code-protected)

// CONFIG6L
#pragma config WRT0 = OFF       // Write Protection bit (Block 0 (000800-001FFFh) is not write-protected)
#pragma config WRT1 = OFF       // Write Protection bit (Block 1 (002000-003FFFh) is not write-protected)
#pragma config WRT2 = OFF       // Write Protection bit (Block 2 (004000-005FFFh) is not write-protected)
#pragma config WRT3 = OFF       // Write Protection bit (Block 3 (006000-007FFFh) is not write-protected)

// CONFIG6H
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) are not write-protected)
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot block (000000-0007FFh) is not write-protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM is not write-protected)

// CONFIG7L
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF      // Table Read Protection bit (Block 2 (004000-005FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF      // Table Read Protection bit (Block 3 (006000-007FFFh) is not protected from table reads executed in other blocks)

// CONFIG7H
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) is not protected from table reads executed in other blocks)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda con la interrupcion en XC8 - no funciona
« Respuesta #6 en: 19 de Agosto de 2019, 17:03:07 »
Hice lo mismo que tenes vos... Sigo sin entender porque te da ese error. Busque y no hay ningun problema.

Pense que podria ser el stdio.h que no hace falta aca, pero lo escribi y tampoco me da problemas. En resumen, me anda perfecto a mi...

Tengo 2 versiones. La V1.4 y la V2.05 y las dos me compilan bien :/

Desconectado AccioRw

  • PIC16
  • ***
  • Mensajes: 165
Re:Ayuda con la interrupcion en XC8 - no funciona
« Respuesta #7 en: 20 de Agosto de 2019, 03:31:46 »
Yo la versión con la que trabajo y sé que funciona perfectamente, la he proabdo proyectos serios y ni un solo problema es la V1.33, siempre que uso un 2550/4550 solo uso esa versión de XC8 por si quieres probar...
La versión del MPLABX si la he variado porque creo que no afecta pero con algunos proyectos que usan ese pic sigo usando la V2.35 de no ser que sea un proyecto nuevo que ya uso la versión nueva del MPLABX que esté usando en ese momento.

Si quieres subir el proyecto entero pruebo a compilártelo yo también tal cual lo tengas a ver que hace y si me saca errores.

Desconectado daca1953

  • PIC10
  • *
  • Mensajes: 7
Re:Ayuda con la interrupcion en XC8 - no funciona
« Respuesta #8 en: 23 de Agosto de 2019, 00:56:30 »
Hola, perdon la demora estaba embolatado con unos trabajos de la u

Mira este es el archivo quel proyecto, te lo agradezco mucho, voy a probar la version que medices para el compilador porque tambien me paso con un PIC12F1501

Desconectado AccioRw

  • PIC16
  • ***
  • Mensajes: 165
Re:Ayuda con la interrupcion en XC8 - no funciona
« Respuesta #9 en: 23 de Agosto de 2019, 04:25:02 »
Hola daca1953, con MPLABX v5.15 y el compilador XC8 v1.33 me compila perfectamente tal cual lo has subido, no me deja abrirlo con el MPLAB v2.35 por que me sale un error diciendo que el IDE es muy antiguo (imagino que si se hace un proyecto con una version nueva del IDE no dejará abrirlo con las antiguas, nunca lo había probado...)
El problema debe ser el compilador  ;-)

Pd. Le reduzco la calidad a la captura para que me deje subirla.

Desconectado daca1953

  • PIC10
  • *
  • Mensajes: 7
Re:Ayuda con la interrupcion en XC8 - no funciona
« Respuesta #10 en: 23 de Agosto de 2019, 22:46:51 »
siiii era eso amigo, muchas gracias...debo usar un micro mas actualizado jajajaj

Saludos!!  :o :o

Desconectado AccioRw

  • PIC16
  • ***
  • Mensajes: 165
Re:Ayuda con la interrupcion en XC8 - no funciona
« Respuesta #11 en: 24 de Agosto de 2019, 05:29:10 »
debo usar un micro mas actualizado jajajaj

Yo aun sigo usando los 2550/4550 depende del motivo, para aprender por ejemplo los veo fundamentales por la cantidad de ejemplos que hay por la web, son sencillos y fáciles de entender en comparación con otro pic mas moderno que ya los datasheet acostumbran a tener no las 400 páginas del 25/4550 sino 800 si te vas a un 18F…  :D
También con los pic modernos ya se suele usar el MCC (configurador de microchip) y algo que antes hacías con las plibs a mano ahora lo hace todo solo, aprender con eso de golpe yo creo que es aprender mal, se que se puede hacer sin el configurador todo a mano pero aun así es más fácil de entender cómo funciona un 25/4550 que un pic moderno.

He puesto este ejemplo, ignoro si es tu caso o no simplemente es el ejemplo de uso que se me ha venido a la cabeza  ;-)
Me alegro que hayas solucionado tu problema, no vendría mal que en el titulo añadieras algo así como "solucionado" por que esto que te ha pasado a ti lo he visto varias veces con algunos amigos.

Desconectado daca1953

  • PIC10
  • *
  • Mensajes: 7
Re:Ayuda con la interrupcion en XC8 - no funciona
« Respuesta #12 en: 24 de Agosto de 2019, 18:15:11 »
sii basicamente estoy usando el 2550 para reforzar mis conocimientos y entender como funcionan los perifericos de una manejar mas sencilla, porque estoy de acueerdo contigo usar el MCC es muy bueno, facilita mucho las cosas pero aprenderlo sin saber como es

Desconectado Fabri Olivari

  • PIC10
  • *
  • Mensajes: 21
Re:Ayuda con la interrupcion en XC8 - no funciona
« Respuesta #13 en: 15 de Septiembre de 2019, 21:27:53 »
Hola compañero, creo que tu problema esta en la definicion de la funcion interrupcion
vos estas poniendo: void interrupt()interrupcion()
tenes que poner: void __interrupt() interrupcion()

Prueba poner dos guiones bajos antes de poner interrupt, esto es para MPLAB, XC8

Desconectado Nano_T

  • PIC10
  • *
  • Mensajes: 36
Re:Ayuda con la interrupcion en XC8 - no funciona
« Respuesta #14 en: 20 de Enero de 2020, 10:27:18 »
Muy buenas!
Según entiendo esto es por el cambio de estandar C90 a C99 que implementaron.
La correcta definición de las funciones de interrupcion debe realizarse de la siguiente forma:
Código: [Seleccionar]
void __interrupt() my_ISR_function(void){
    // Code here
}

Ha cambiado además la forma de definir la prioridad de las interrupciones y se pueden definir distintas funciones de interrupción para distintos flags o combinaciones de estos. Cito los ejemplos de la guía de aplicación de Microchip, esto no lo he probado.
Código: [Seleccionar]
void __interrupt(irq(TMR0), high_priority) tc0Int(void){
    TMR0IF=0;
    ++tick_count;
    return;
}

void __interrupt(irq(TMR1) ,high_priority) tc1Int(void){
    TMR1IF=0;
    tick_count += 100;
    return;
}

Además hubo otros pequeños cambios, cito un comentario a modo resumen.
https://www.microforum.cc/topic/5-i-used-to-use-to-locate-variables-but-since-xc8-20-this-is-no-longer-working/?do=findComment&comment=18

Guía de usuario XC8:
http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_XC8_C_Compiler_User_Guide_for_PIC.pdf

Saludos!