Dimmer controlado por PIC

Y también es importante mencionar qué errores muestra el compilador, no solo decir que el programa no compila por X razón.
A mí me muestra que no reconoce las definiciones, por eso preguntaba, probablemente porque este PIC al ser tan pequeño no usa puertos A sino solo GPIO. Algunas cosas que tienen que cambiar sería, por ejemplo:
TRISAbits.TRISA1 -> TRISIO.TRISIO1
PORTAbits.RA1 -> GPIObits_t.GPIO1

En otra sección está por ejemplo una llamada a PIR1bits.RCIF pero esa es una bandera del UART, tambien es hardware que este modelo no incluye por lo que no está declarada, preferiría borrar esas secciones ya que no veo que lo configure, parece que solo se basó en copiarlo del código de otro controlador. Esto tendría menor errores, pero faltan los dos archivos .h

C:
#include <xc.h>

#include "pic12f629.h"

#include <stdio.h>

#include <stdlib.h>

#include "CONFIG.h"

#include "ADC.h"


#define _XTAL_FREQ 4000000


uint8_t tiempo;

uint8_t datos[10];


void __interrupt() Interrupcion(void){

    

    if(INTCONbits.TMR0IF == 1){

      

        GPIObits_t.GPIO1 = 1;      //alto

        __delay_us(100);

        GPIObits_t.GPIO1 = 0;      //bajo

        INTCONbits.TMR0IF = 0;

        INTCONbits.TMR0IE = 0;

          

    } /*else if(PIR1bits.RCIF == 1){

      

        char dataRX = RCREG;

        PIR1bits.RCIF = 0;

 

    }*/

    else if(INTCONbits.INTF == 1)

    {

        GPIObits_t.GPIO1 = 0;      //triac apagdo

        TMR0 = tiempo;

        INTCONbits.TMR0IF = 0;  //Limpia bandera de tmr0

        INTCONbits.TMR0IE = 1;

        INTCONbits.INTF = 0;       

    }

 

}


void TIMER0_init(void)

{

    OPTION_REGbits.T0CS = 0;    //0 TEMP, 1 CONT

    OPTION_REGbits.PSA = 0;     //0= PRE-TMR0, 1=PRE-WDT

    OPTION_REGbits.PS = 0B100;   //256

    TMR0 = 255;     

}


void RB0_init(void)

{

    OPTION_REGbits.INTEDG = 1;  //1 subida, 0= bajda

    INTCONbits.INTF = 0;

}



void main(void) {

    

    TRISIO.TRISIO1 = 0;   //triac

    TRISIO.TRISIO0 = 1;   //in

 

    ADC_init();

    //UART_init();

    TIMER0_init();

    RB0_init();

 

   INTCONbits.GIE = 1;     //Habilita interrupcion global     

   INTCONbits.INTE = 1;    //Habilita interrupcion por RB0

    __delay_ms(500);

    

    while(1)

    {

         tiempo = ADC_read(0);

        

         if(tiempo >= 210){

             GPIObits_t.GPIO1 = 1;

             INTCONbits.INTE = 0;

        }else if(tiempo <= 10){

             GPIObits_t.GPIO1 = 0;

             INTCONbits.INTE = 0;

        }else{

            INTCONbits.INTE = 1;

        }

        

    //sprintf(datos, "%d\n\r", tiempo);

    //UART_write_text(datos);

     __delay_ms(10);

    }

    return;

}
Las secciones que usan el UART están comentadas ya que no deberían ocuparse.
 
Podría ser XC-8 o Hi-Tech C con MPLAB-X
Como quiera, aunque el PIC12F629 no tiene ADC, faltan dos librerías: CONFIG.h y ADC.h
Sería mejor que subiera el proyecto dentro de un archivo comprimido.

Eso le hará ver el error.
A mí me muestra que no reconoce las definiciones, por eso preguntaba, probablemente porque este PIC al ser tan pequeño no usa puertos A sino solo GPIO. Algunas cosas que tienen que cambiar sería, por ejemplo:
TRISAbits.TRISA1 -> TRISIO.TRISIO1
PORTAbits.RA1 -> GPIObits_t.GPIO1

En otra sección está por ejemplo una llamada a PIR1bits.RCIF pero esa es una bandera del UART, tambien es hardware que este modelo no incluye por lo que no está declarada, preferiría borrar esas secciones ya que no veo que lo configure, parece que solo se basó en copiarlo del código de otro controlador. Esto tendría menor errores, pero faltan los dos archivos .h

C:
#include <xc.h>

#include "pic12f629.h"

#include <stdio.h>

#include <stdlib.h>

#include "CONFIG.h"

#include "ADC.h"


#define _XTAL_FREQ 4000000


uint8_t tiempo;

uint8_t datos[10];


void __interrupt() Interrupcion(void){

 

    if(INTCONbits.TMR0IF == 1){

  

        GPIObits_t.GPIO1 = 1;      //alto

        __delay_us(100);

        GPIObits_t.GPIO1 = 0;      //bajo

        INTCONbits.TMR0IF = 0;

        INTCONbits.TMR0IE = 0;

      

    } /*else if(PIR1bits.RCIF == 1){

  

        char dataRX = RCREG;

        PIR1bits.RCIF = 0;

 

    }*/

    else if(INTCONbits.INTF == 1)

    {

        GPIObits_t.GPIO1 = 0;      //triac apagdo

        TMR0 = tiempo;

        INTCONbits.TMR0IF = 0;  //Limpia bandera de tmr0

        INTCONbits.TMR0IE = 1;

        INTCONbits.INTF = 0;   

    }

 

}


void TIMER0_init(void)

{

    OPTION_REGbits.T0CS = 0;    //0 TEMP, 1 CONT

    OPTION_REGbits.PSA = 0;     //0= PRE-TMR0, 1=PRE-WDT

    OPTION_REGbits.PS = 0B100;   //256

    TMR0 = 255; 

}


void RB0_init(void)

{

    OPTION_REGbits.INTEDG = 1;  //1 subida, 0= bajda

    INTCONbits.INTF = 0;

}



void main(void) {

 

    TRISIO.TRISIO1 = 0;   //triac

    TRISIO.TRISIO0 = 1;   //in

 

    ADC_init();

    //UART_init();

    TIMER0_init();

    RB0_init();

 

   INTCONbits.GIE = 1;     //Habilita interrupcion global 

   INTCONbits.INTE = 1;    //Habilita interrupcion por RB0

    __delay_ms(500);

 

    while(1)

    {

         tiempo = ADC_read(0);

    

         if(tiempo >= 210){

             GPIObits_t.GPIO1 = 1;

             INTCONbits.INTE = 0;

        }else if(tiempo <= 10){

             GPIObits_t.GPIO1 = 0;

             INTCONbits.INTE = 0;

        }else{

            INTCONbits.INTE = 1;

        }

    

    //sprintf(datos, "%d\n\r", tiempo);

    //UART_write_text(datos);

     __delay_ms(10);

    }

    return;

}
Las secciones que usan el UART están comentadas ya que no deberían ocuparse.
Buenas tardes, mejor adjunto los archivos, en este caso ya para un pic 12f675 y pic12f629. Gracias por sus atenciones, muy aparte de sus humildes comentarios.
No es por nada y sin tratar de ofender, pero yo ni en mis primeros pasos de programación me hubiera atrevido a publicar en un Foro un código incompleto si tuviera una duda.
Y esto por el simple motivo que nadie puede tener acceso a mis archivos y que MPLAB es un IDE que soporta varios lenguajes de programación.
Viendo la sintaxis supuse que podría ser XC8 o Hi-Tech, pero cada versión de los mismos cambia y los proyectos dejan de ser compatibles.
Ese es uno de los principales motivos por los que me olvidé de MPLAB-X y me fue mejor con PIC C Compiler de CCS.
Así que por eso se debe subir un proyecto completo dentro de un archivo comprimido indicando versiones (Caso MPLAB-X)
Y también es importante mencionar qué errores muestra el compilador, no solo decir que el programa no compila por X razón.
Disculpa amigo, entonces ahi está el codigo completo. gracias.
 

Adjuntos

  • pic12f675.X.rar
    84.4 KB · Visitas: 4
  • 12f629.X.rar
    19 KB · Visitas: 5
Última edición:
- El 12F629 no tiene ADC, por mucho que programes... seguirá sin tenerlo.

- En el código del 12F675, el error está en el include ADC.H
Código:
    ADCON0bits.CHS=00;
    ADCON0bits.AN0 = channel;   //Seleccion e canal
La 2da línea está mal, debió ser
Código:
    ADCON0bits.CHS=channel;   //Seleccion e canal

Salta otro error porque en la rutina siguiente, que marcaste como comentario --> pusiste mal las /* */
 
El compilador te dice el error, básicamente no configuras la entrada análoga. Dentro de adc.h
C:
void ADC_init(void)
{
   
ADCON0bits.ADON = 0;
    CMCONbits.CM = 0B111;
    VRCON = 0X00;
    ADCON0bits.ADFM = 1;        // 1 derecha, 0 izquierda
    //ANSEL = 0x10;   // Todo como analogico <- esta parte no es correcta, de hecho, es equivalente al ANSELbits.ADCS = 0b001; que usas luego.
    ANSEL = 0x1; //los bits 3:0 seleccionan la entrada análoga, con 0x01 se establece AN0 como entrada análoga. Todo como analógico sería 0x0F
    ANSELbits.ADCS = 0b001;       // Seleccion de reloj para ADC
    ADCON0bits.VCFG = 0;        
    //ADCON0bits.ADCS1 = 0;       // debe ser mayor a 1.6us
    //ADCON0bits.ADCS0 = 1; 
    //Las dos líneas anteriores están incorrectas.
    ADCON0bits.ADON = 1;        //ADC on
}
 
Gracias, me sigue botando el error, en este caso en la simulación. se adjunta el archivo.

A las preguntas/respuestas tenés que acompañarlas de descripciones. Con tu "no me anda, investiguen" lo único que conseguís es cansar a quien te lee.

Acá al código que tenías le corregiste lo que se marcaba, pero seguiste haciendo modificaciones.
Modificaciones donde el propio compilador te marca las líneas de error
Código:
ADC.h: ADC_init()
    27: ADCON0bits.ADCS1 = 0;
                         ^ (255) not a member of the struct/union ""
                            ^ (182) illegal conversion between types
int -> volatile union S41
    28: ADCON0bits.ADCS0 = 1;
                         ^ (255) not a member of the struct/union ""
                            ^ (182) illegal conversion between types

Y también están los otros errores que marca Nuyel.
 
Por todo esto prefiero el Assembler .

Jamás uso (#include) de ningun tipo.
Me arreglo con el código que yo mismo escribo, así no tengo que andar adivinando en solitario lo que escribió otro. :unsure: :rolleyes: :ROFLMAO:
 
Por todo esto prefiero el Assembler .

Jamás uso (#include) de ningun tipo.
Me arreglo con el código que yo mismo escribo, así no tengo que andar adivinando en solitario lo que escribió otro. :unsure: :rolleyes: :ROFLMAO:
Pues tampoco es que esté usando librerías, solo envió las funciones a otro archivo, lo que sí dudo es que haya leído los registros del PIC para ver que hacía cada uno ya que los errores son de nombres o que está poniendo una declaración que es para un registro en el incorrecto.
 
Atrás
Arriba