TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: mak_paint en 24 de Noviembre de 2018, 12:17:39

Título: variable de usuario en XC8
Publicado por: mak_paint en 24 de Noviembre de 2018, 12:17:39
saludos, en esta ocasión acudo al foro para realizar una pregunta, es lo siguiente: digamos que deseo crear una variable de tipo 8 bits sin signo (uint8_t ), y la llamó "FLAGS" mi deseo es q en partes del programa poder leer o escribir  de forma individual cada bit de esta variable, en el compilador MIKROC lo haría: FLAG.f0=1; y si deseo tomar un decisión podría ser: if (FLAG.f0==01){...} etc... pero en XC8 no se ni como declararla ni como usarla en BIT separados, cabe decir q necesito que estos "flags"  se encuentren en la misma variable pues hay una parte del codigo que uso una funcion SWITCH CASE y tomo decisiones dependiendo del contenido de esta variable... bueno estodo gracias de ante mano..
Título: Re:variable de usuario en XC8
Publicado por: KILLERJC en 24 de Noviembre de 2018, 13:50:07
Como vos los planteas, esta es la solucion que se me ocurre
Podes usar una union de un uint8_t y una structura de bitfields... algo asi:

Código: C
  1. union myuint8_t {
  2.     struct {
  3.         uint8_t F0: 1;
  4.         uint8_t F1: 1;
  5.         uint8_t F2: 1;
  6.         uint8_t F3: 1;
  7.         uint8_t F4: 1;
  8.         uint8_t F5: 1;
  9.         uint8_t F6: 1;
  10.         uint8_t F7: 1;
  11.     };
  12.     uint8_t valor;
  13. };

entonces lo inicializas

union myuint8_t FLAGS;

Código: C
  1. FLAGS.valor = 0x86;

Y acceder luego o cambiar los bits con:

Código: C
  1. FLAGS.F0 = 1;

Lo que si no tenes que confiarte que F0 va a ser el bit 0 siempre. Ya que el orden de los bitfields es dependiente del compilador.

--------------------

Por otro lado al querer acceder a un bit generalmente se usan las AND y OR

Código: C
  1. if ( FLAGS & ( 1 << x ) )
Donde x es el numero de bit que te interesa.
Si queres poner a 1 el bit 3 por ejemplo usas:

Código: C
  1. FLAGS | ( 1 << 3 )
Si queres poner a 0 el bit 7 por ejemplo usas:

Código: C
  1. FLAGS & ~( 1 << 7 )

MikroC te da esa facilidad que contas, pero la mayoria utiliza este que nombre al ultimo.
Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 24 de Noviembre de 2018, 14:20:57
muchas gracias por tu respuesta, definitivamente si en mikroc es mas fácil pero el compilador mikroc no se si le pasa a otros me a provocado muchos errores aveces hago una parte nueva del código lo compilo lo grabo al pic y el pic enloquece se cuelga me bugs etc, luego sin modifica ese trozo de código( pues me canso de revisarlo y se q esta bien) sigo unas cuantas lineas mas y compilo grabó y se van todos los problemas, llegue a pense q algun sector de la memoria del pic se habia dañado pero probe con varios y pasaba lo mismo...
Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 24 de Noviembre de 2018, 14:32:01
no consigo que funcione..
Título: Re:variable de usuario en XC8
Publicado por: KILLERJC en 24 de Noviembre de 2018, 17:12:44
Pone el codigo que estas tratando de usar... Me refiero a un ejemplo mínimo donde lo uses.
Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 24 de Noviembre de 2018, 18:48:55
ok seria algo asi...
///////////////////////////////////////
void main() {
  do{
    if (RA0==0) {
      FLAG.F0=1;
      ADC1();      //aca tona una muetra en un canal analogo 0
      RESUL1= ADRESL
    }

    else if (RA1==0){
      FLAG.F1=1;
      ADC2();     //aca tona una muetra en un canal analogo 1
      RESUL2= ADRESL
    }

    else if (RA2==0){
      FLAG.F2=1;
      ADC3();    //aca tona una muetra en un canal analogo2
      RESUL3= ADRESL
    }
   
    if (PIR2bits.TMR3IF==1){
      TIME=0;
    }

  }while (TIME==1);

  DECIDE();
}


/////////////////////////////
void DECIDE(){
  swich(FLAG){
       
       case 1: FORMAT(RESUL1); PRINT(TOTAL); LED1=1;FLAG=0;break;

       case 2: FORMAT(RESUL2); PRINT(TOTAL); LED=0;FLAG=0; break;

       case 4: FORMAT(RESUL3); PRINT(TOTAL); LED2=1;FLAG=0;break;
     
       case 3: LED1=1;LED2=1;FLAG=0; berak;
   
       case 6:....ETC..

       case 7:...ETC...

       defaul : IMPEDANCIA();FLAG=0; break;

  }
}

en realidad el código no es asi hice un pequeño concepto para que se entienda lo que necesito es poder manipular los bits individualmente de FLAG pues en la función DECIDE hago uso del "swiche case" para decidir otras cosas.













Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 24 de Noviembre de 2018, 19:12:55
lo escribi tal cual como me lo pusiste al principio la estructura de bitfields y el compilador me arroja estos errores:

proyecto.c:86:1: error: unknown type name 'FLAGS'
FLAGS.valor;
^
proyecto.c:86:6: error: expected identifier or '('
FLAGS.valor;
     ^
proyecto.c:607:11: error: use of undeclared identifier 'FLAGS'
          FLAGS.F0=1;
Título: Re:variable de usuario en XC8
Publicado por: KILLERJC en 24 de Noviembre de 2018, 19:55:32
Tu programa no tiene un loop infinito... asi como me lo mostras.. No comprendo el porque usas usar un switch..case... Pero en fin.. hice este codigo y funciona:


Código: C
  1. union mytipo_t {
  2.     uint8_t val;
  3.     struct {
  4.         uint8_t F0:1;
  5.         uint8_t F1:1;
  6.         uint8_t F2:1;
  7.         uint8_t F3:1;
  8.         uint8_t F4:1;
  9.         uint8_t F5:1;
  10.         uint8_t F6:1;
  11.         uint8_t F7:1;
  12.     };
  13. };
  14.  
  15. union mytipo_t flags;
  16.  
  17. void main(void){
  18.  
  19.     flags.val = 0;
  20.     flags.F0 = 1; // Aca lo hace valer 0x01
  21.     flags.F2 = 1; // Aca lo hace valer 0x05
  22.          
  23.     while(1){
  24.  
  25.     }
  26.  
  27. }
Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 24 de Noviembre de 2018, 22:05:57
sigue sin funcionar......
proyecto.c:498:3: error: statement requires expression of integer type ('union mytipo_t' invalid)
  switch(FLAGS){
Título: Re:variable de usuario en XC8
Publicado por: KILLERJC en 25 de Noviembre de 2018, 09:33:23
Que raro... yo lo puedo compilar sin ningun problema al codigo que te pase, el problema es en TU codigo, ya que lo veo declarado como FLAGS en mayusculas.

Recorda que para acceder a los 8 bits necesitas usar flags.val, por ejemplo aca:


  swich(FLAG){

deberia ser:

  swich(FLAGS.val){

Nuevamente, si queres que sea FLAGS solo ahi, luego podes acceder bit a bit como la segunda solucion que te mostre.
Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 25 de Noviembre de 2018, 10:47:38
Que raro... yo lo puedo compilar sin ningun problema al codigo que te pase, el problema es en TU codigo, ya que lo veo declarado como FLAGS en mayusculas.

Recorda que para acceder a los 8 bits necesitas usar flags.val, por ejemplo aca:


  swich(FLAG){

deberia ser:

  swich(FLAGS.val){

Nuevamente, si queres que sea FLAGS solo ahi, luego podes acceder bit a bit como la segunda solucion que te mostre.



Ok voy a probar, se me ocurrió también como solo yo escribo los bits  en 4 lineas y en swich leo la variable entera, que tal si en donde escribo los bit lo hago en asm,... otra cosa antes preguntaste por q uso el switch... case... bueno de esta variable FLAG van a cambiar 4 bits  durante el programa pueden estar en 1 varios de ellos en distintas combinaciones por lo tanto puedo tener la variable con valores desde 0 a 15 en decimal... entonces en la función DECIDE debo ejecutar  instrucciones dependiendo de valor de FLAG la solución mas elegante que se me ocurre es el uso de switch, imagina que use 15"if" y "else if" seria horrible ademas de la confusión ya que en ciertos casos se ejecuta la misma instrucción con dos valores distintos en  FLAG osea asi:
//////codigo real//////
....case 5:
    case 13:
              if (TOG){
               TOG=~TOG;
               H_LED=1;MEDIA(1);FORMAT(TOTAL);PRINT(TOTAL);
               break;
             }
             else {
               TOG=~TOG;
               IMPED();FLAG_CON=0;T3CONbits.TMR3ON=1;
               break;
             }
..... 

como ves para case 5 y 13 , voy a las mismas instrucciones, eso pasa  en unos cuantos casos mas, y en otros no.. ahora volviendo a los bits de FLAG solo manipulo estos bits en 4 líneas durante todo el codigo del resto leo la variable entra, asi q te parece mi idea de usar asm en estos pequeños casos y ahorrarnos el "union".... lo q no se como introducir una linea de asm en xc8 en buscado en la red y al parecer es problemático, por que xc8 es tan poco amigable...   


Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 25 de Noviembre de 2018, 13:21:12
y los problemas no acaban ahora que genere la funcion de interrupcion tambien me saltan errores:


#define FLG_VF  INTCONbits.INT0IF   
#define FLG_TC  INTCON3bits.INT1IF 

//////////////////////////////
void interrupt boton(){
__delay_ms(300);
  if (FLG_VF==1){
    V_Hz = ~V_Hz;
  }
  else if (FLG_TC==1){
   SELC_TC = ~SELC_TC;
  }
  FLG_VF=0;
  FLG_TC=0;
}
//////////////////////////
y los errores que saltan son:
proyecto.c:74:6: error: variable has incomplete type 'void'
void interrupt boton(){
     ^
proyecto.c:74:15: error: expected ';' after top level declarator
void interrupt boton(){
              ^
              ;
2 errors generated.
(908) exit status = 1
nbproject/Makefile-default.mk:106: recipe for target 'build/default/production/proyecto.p1' failed


////////////////////////

uso un 18F1320 en la configuración deshabilite las prioridades en la interrupción....
Título: Re:variable de usuario en XC8
Publicado por: KILLERJC en 25 de Noviembre de 2018, 15:04:54
Discúlpame pero sigo viendo cosas que NO deberías hacer...

Citar
void interrupt boton(){
__delay_ms(300);

Un DELAY en una interrupción, es algo que JAMAS deberías hacer

El/Los siguiente error es de algo que no es esa parte del código.. al menos yo no veo error ahí. O algo mal escrito.

Citar
entonces en la función DECIDE debo ejecutar  instrucciones dependiendo de valor de FLAG la solución mas elegante que se me ocurre es el uso de switch, imagina que use 15"if" y "else if" seria horrible ademas de la confusión ya que en ciertos casos se ejecuta la misma instrucción con dos valores distintos en  FLAG osea asi:

No conozco que estas haciendo ni el funcionamiento del programa. Tal ves sea cierto que no hay otra forma. No lo puedo saber a ciencia cierta, pero lo que me habias presentado:

Código: C
  1. case 1: FORMAT(RESUL1); PRINT(TOTAL); LED1=1;FLAG=0;break;
  2.  
  3.        case 2: FORMAT(RESUL2); PRINT(TOTAL); LED=0;FLAG=0; break;
  4.  
  5.        case 4: FORMAT(RESUL3); PRINT(TOTAL); LED2=1;FLAG=0;break;
  6.      
  7.        case 3: LED1=1;LED2=1;FLAG=0; berak;

Era como que si se podia hacer 1 if por cada bit de flag.
Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 25 de Noviembre de 2018, 15:22:30
gracias por tanta ayuda... bueno el delay de la interrupción la quite y el error sigue y es en la función de interrupción pues si la quito del código pues compila bien..
///////////////////////////
void interrupt boton(){
  if (FLG_VF==1){
    V_Hz = ~V_Hz;
  }
  else if (FLG_TC==1){
   SELC_TC = ~SELC_TC;
  }
  FLG_VF=0;
  FLG_TC=0;
//
}
///////////////////////////////

y el error es como se lee en el mensaje que emite MPLAB en la interrupción, pero como tu dices alli no hay error:

///////////////////////////////////
proyecto.c:117:6: error: variable has incomplete type 'void'
void interrupt boton(){
     ^
proyecto.c:117:15: error: expected ';' after top level declarator
void interrupt boton(){
              ^
              ;
2 errors generated.



 
Título: Re:variable de usuario en XC8
Publicado por: KILLERJC en 25 de Noviembre de 2018, 16:53:29
Para que veas que la parte del codigo NO esta mal... y que puede ser algo que tenes definido mal, por ejemplo una variable, etc... Compile el siguiente codigo:

Código: C
  1. #include <xc.h>
  2. #include <stdint.h>
  3. #define _XTAL_FREQ 4000000
  4.  
  5.  
  6. union mytipo_t {
  7.     uint8_t val;
  8.     struct {
  9.         uint8_t F0:1;
  10.         uint8_t F1:1;
  11.         uint8_t F2:1;
  12.         uint8_t F3:1;
  13.         uint8_t F4:1;
  14.         uint8_t F5:1;
  15.         uint8_t F6:1;
  16.         uint8_t F7:1;
  17.     };
  18. };
  19.  
  20. union mytipo_t flags;
  21. uint8_t V_Hz,SELC_TC;
  22.  
  23. void interrupt boton(){
  24.   if (INTCONbits.T0IF==1){
  25.     V_Hz = ~V_Hz;
  26.   }
  27.   else if (INTCONbits.TMR0IF==1){
  28.    SELC_TC = ~SELC_TC;
  29.   }
  30.   INTCONbits.T0IF=0;
  31.   INTCONbits.TMR0IF=0;
  32. //
  33. }
  34.  
  35. void main(void){
  36.  
  37.     flags.val = 0;
  38.     flags.F0 = 1;
  39.     flags.F2 = 1;
  40.          
  41.     while(1){
  42.  
  43.     }
  44.  
  45. }

Cambie unicamente los FLG_VF y TC por cualquier flag, la primera que encontre. tambien defini a V_Hz y SELC_TC como enteros, ya que no se que son.
Y el resultado fue el siguiente:

Código: [Seleccionar]
CLEAN SUCCESSFUL (total time: 62ms)
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'F:/CCS/MPLABx/XC8.X'
make  -f nbproject/Makefile-default.mk dist/default/production/XC8.X.production.hex
make[2]: Entering directory 'F:/CCS/MPLABx/XC8.X'
"C:\Program Files (x86)\Microchip\xc8\v1.43\bin\xc8.exe" --pass1  --chip=18F1320 -Q -G  --double=24 --float=24 --emi=wordwrite --opt=+asm,+asmfile,-speed,+space,-debug,-local --addrqual=ignore --mode=free -P -N255 -I"../testLibrary.X" --warn=-3 --asmlist -DXPRJ_default=default  --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,-download,+config,+clib,-plib   --output=-mcof,+elf:multilocs --stack=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s"    -obuild/default/production/main.p1  main.c
main.c:32: warning: (373) implicit signed to unsigned conversion
main.c:35: warning: (373) implicit signed to unsigned conversion
"C:\Program Files (x86)\Microchip\xc8\v1.43\bin\xc8.exe"  --chip=18F1320 -G -mdist/default/production/XC8.X.production.map  --double=24 --float=24 --emi=wordwrite --opt=+asm,+asmfile,-speed,+space,-debug,-local --addrqual=ignore --mode=free -P -N255 -I"../testLibrary.X" --warn=-3 --asmlist -DXPRJ_default=default  --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,-download,+config,+clib,-plib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s"      --memorysummary dist/default/production/memoryfile.xml -odist/default/production/XC8.X.production.elf  build/default/production/main.p1     
Microchip MPLAB XC8 C Compiler (Free Mode) V1.43
Build date: Jul 24 2017
Part Support Version: 1.43
Copyright (C) 2017 Microchip Technology Inc.
License type: Node Configuration

:: advisory: (1233) Employing 18F1320 errata work-arounds:
:: advisory: (1234)  * GOTO instruction at reset vector must be preceded by NOP
:: advisory: (1234)  * DAW instruction may improperly clear CARRY bit
:: warning: (1273) Omniscient Code Generation not available in Free mode
:: warning: (1311) missing configuration setting for config word 0x300001; using default
:: warning: (1311) missing configuration setting for config word 0x300002; using default
:: warning: (1311) missing configuration setting for config word 0x300003; using default
:: warning: (1311) missing configuration setting for config word 0x300005; using default
:: warning: (1311) missing configuration setting for config word 0x300006; using default
:: warning: (1311) missing configuration setting for config word 0x300008; using default
:: warning: (1311) missing configuration setting for config word 0x300009; using default
:: warning: (1311) missing configuration setting for config word 0x30000A; using default
:: warning: (1311) missing configuration setting for config word 0x30000B; using default
:: warning: (1311) missing configuration setting for config word 0x30000C; using default
:: warning: (1311) missing configuration setting for config word 0x30000D; using default

Memory Summary:
    Program space        used    CAh (   202) of  2000h bytes   (  2.5%)
    Data space           used    16h (    22) of   100h bytes   (  8.6%)
    Configuration bits   used     7h (     7) of     7h words   (100.0%)
    EEPROM space         used     0h (     0) of   100h bytes   (  0.0%)
    ID Location space    used     8h (     8) of     8h bytes   (100.0%)
    Data stack space     used     0h (     0) of    80h bytes   (  0.0%)


You have compiled in FREE mode.
Using Omniscient Code Generation that is available in PRO mode,
you could have produced up to 60% smaller and 400% faster code.
See http://www.microchip.com/MPLABXCcompilers for more information.

make[2]: Leaving directory 'F:/CCS/MPLABx/XC8.X'
make[1]: Leaving directory 'F:/CCS/MPLABx/XC8.X'

BUILD SUCCESSFUL (total time: 1s)
Loading code from F:/CCS/MPLABx/XC8.X/dist/default/production/XC8.X.production.hex...
Loading completed

El cual no me dio ningun error. Y usando el PIC18F1320.
Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 25 de Noviembre de 2018, 19:33:33
ok... veamos FLG_VF y FLG_TC son las banderas de las interrupciones externas INT0 y INT1 como se ve aca:
///////////////////////////////////
#define FLG_VF  INTCONbits.INT0IF   
#define FLG_TC  INTCON3bits.INT1IF
///////////////////////////////////
lo que voy a hacer es poner las directo en el codigo asi:
//////////////////////////////////
void interrupt boton(){
  if (INTCONbits.INT0IF==1){
    V_Hz = ~V_Hz;
  }
  else if (INTCON3bits.INT1IF==1){
   PORTAbits.RA6 = PORTAbits.RA6 + 1;
  }
  INTCONbits.INT0IF=0;
  INTCON3bits.INT1IF=0;
//
}
//////////////////////////////

SELC_TC es un pin de PORTA.... y, V_Hz es una variable bandera de tipo bit que e declarado antes al principio del programa:
////////////////////////////

#define SELC_TC PORTAbits.RA6
/////////////////////////////
__bit       V_Hz;
////////////////////////////////

salta el mismo error supongo que tienes razón no debe ser la función  interrupcion, pero si la comento y nada mas a ella entonces si compila sin error
 :?

Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 25 de Noviembre de 2018, 19:37:29
debo colocar la funcion de interrupcion en algún sitio especifico del código o no importa???
Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 25 de Noviembre de 2018, 19:45:38
noto esto el included <xc.h> aparece como error....
/////////////////
Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 25 de Noviembre de 2018, 20:11:23
disculpa aca se ve mejor
Título: Re:variable de usuario en XC8
Publicado por: KILLERJC en 25 de Noviembre de 2018, 20:41:00
El xc.h te deberia funcionar bien... ya que ese archivo luego te agrega el PIC que corresponde y te habilita el uso de las estructuras INTCONbits así como también todos los registros.

Lo que no reconozco es el __bit, el manual de XC8 no lo define. Y seguramente sea ese bit_config.h que tenes.
Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 26 de Noviembre de 2018, 00:52:36
El xc.h te deberia funcionar bien... ya que ese archivo luego te agrega el PIC que corresponde y te habilita el uso de las estructuras INTCONbits así como también todos los registros.

Lo que no reconozco es el __bit, el manual de XC8 no lo define. Y seguramente sea ese bit_config.h que tenes.

no le hagas caso a bit_config.h es una archivo de cabecera que hice para tener los bit de configuración ósea los fuses, en un archivo aparte para no tenerlos amontonados el el código principal... sin ese arreglo que hice ya igual me marca el error en el xc.h aunque no interfiere en nada en el código como dices... la estructura __bit la uso para crear variables de un solo bit uso "__bit" pues la estructura"bit" el compilador no me la reconoce y en un foro vi que se creaba asi: "__bit" y a funcionado, el código si quito la funcion de interrupcion funciona al 100 y uso varios de estas variables __bity todo bien,  ademas por prueba quite todo lo que tiene que ver con __bit  V_Hz de la función de interrupción y por ultimo deje la funcion de interrupcion vacía y sigue sin compilar :

///////////////////////////////////
void interrupt boton(){

}
////////////////////////////////////

proyecto.c:116:6: error: variable has incomplete type 'void'
void interrupt boton(){
     ^
proyecto.c:116:15: error: expected ';' after top level declarator
void interrupt boton(){
              ^
              ;
2 errors generated.
(908) exit status = 1
Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 26 de Noviembre de 2018, 00:55:22
probé de esta otra forma  que vi en el documento de ayuda del compilador xc8 de como se debe escribir la funcion de interrupcion:
////////////////////
void interrupt boton(void){

}
///////////////////////////
y este fue el error que aroo el compilador
///////////////////////
PuntaLoguica.c:116:6: error: variable has incomplete type 'void'
void interrupt boton(void){
     ^
PuntaLoguica.c:116:15: error: expected ';' after top level declarator
void interrupt boton(void){
              ^
              ;
2 errors generated.
(908) exit status = 1
Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 26 de Noviembre de 2018, 01:04:54
voy a hacer una prueba voy a compilar un código de prueba en un nuevo proyecto con tan solo la funcion de interrupcion a ver que pasa...
Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 26 de Noviembre de 2018, 01:15:40
aca la prueba:
//////////////////////


// PIC18F1320 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1H
#pragma config OSC = INTIO2     // Oscillator Selection bits (Internal RC oscillator, port function on RA6 and port function on RA7)
#pragma config FSCM = OFF       // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal External Switchover mode disabled)

// CONFIG2L
#pragma config PWRT = ON        // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOR = ON         // Brown-out Reset Enable bit (Brown-out Reset enabled)
#pragma config BORV = 42        // Brown-out Reset Voltage bits (VBOR set to 4.2V)

// 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 MCLRE = OFF      // MCLR Pin Enable bit (RA5 input pin enabled, MCLR disabled)

// CONFIG4L
#pragma config STVR = ON        // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = OFF        // Low-Voltage ICSP Enable bit (Low-Voltage ICSP disabled)

// CONFIG5L
#pragma config CP0 = OFF        // Code Protection bit (Block 0 (00200-000FFFh) not code-protected)
#pragma config CP1 = OFF        // Code Protection bit (Block 1 (001000-001FFFh) not code-protected)

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

// CONFIG6L
#pragma config WRT0 = OFF       // Write Protection bit (Block 0 (00200-000FFFh) not write-protected)
#pragma config WRT1 = OFF       // Write Protection bit (Block 1 (001000-001FFFh) not write-protected)

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

// CONFIG7L
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 (00200-000FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 (001000-001FFFh) not protected from table reads executed in other blocks)

// CONFIG7H
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot Block (000000-0001FFh) 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.

#include <xc.h>

void interrupt boton (){
   
}


void main(void) {
    return;
}
///////////////
 y da el error:

//////////////////////
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'C:/Users/mak_p/Documents/prueba.X'
make  -f nbproject/Makefile-default.mk dist/default/production/prueba.X.production.hex
make[2]: Entering directory 'C:/Users/mak_p/Documents/prueba.X'
"C:\Program Files (x86)\Microchip\xc8\v2.00\bin\xc8-cc.exe"  -mcpu=18F1320 -c  -fno-short-double -fno-short-float -memi=wordwrite -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -Wa,-a -DXPRJ_default=default  -msummary=-psect,-class,+mem,-hex,-file  -ginhx032 -Wl,--data-init -mno-keep-startup -mno-download -mdefault-config-bits   -std=c99 -gdwarf-3 -mstack=compiled:auto:auto:auto     -o build/default/production/newmain.p1 newmain.c
make[2]: *** [build/default/production/newmain.p1] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
newmain.c:56:6: error: variable has incomplete type 'void'
void interrupt boton (){
     ^
newmain.c:56:15: error: expected ';' after top level declarator
void interrupt boton (){
              ^
              ;
2 errors generated.
(908) exit status = 1
nbproject/Makefile-default.mk:106: recipe for target 'build/default/production/newmain.p1' failed
make[2]: Leaving directory 'C:/Users/mak_p/Documents/prueba.X'
nbproject/Makefile-default.mk:90: recipe for target '.build-conf' failed
make[1]: Leaving directory 'C:/Users/mak_p/Documents/prueba.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed

BUILD FAILED (exit value 2, total time: 868ms)
/////////////////////////////
si quito la funcion interrupción compila bien....
Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 26 de Noviembre de 2018, 01:26:00
asi se ve:
Título: Re:variable de usuario en XC8
Publicado por: KILLERJC en 26 de Noviembre de 2018, 07:24:44
Proba crear un proyecto nuevo.... no deberias tener error ahi... es la unica que se me ocurre..

Por cierto en el main, no necesitas un return. solo necesitas un while(1), el loop infinito siempre debe estar.
Título: Re:variable de usuario en XC8
Publicado por: mak_paint en 26 de Noviembre de 2018, 09:44:04
lo ultimo fue un proyecto nuevo y da el mismo error... voy a desinstalar el xc 8 y instalare uno versión mas antigua