Dimmer Digital PIC12F675 2 Pulsadores - Página 3
Página 3 de 4 PrimerPrimer 1234 ÚltimoÚltimo
Resultados 21 al 30 de 34

Tema: Dimmer Digital PIC12F675 2 Pulsadores

  1. #21
    Usuario Avatar de Julian_03
    Ubicación
    Entre Rios, Argentina
    Mensajes
    1,492
    Gracias
    491
    Agradecido 523 veces en 373 posts
    Voy a ver si encuentro un codigo que use, para explicarte como configuras esto del PWM
    Saludos!

  2. #22
    Super Moderator Avatar de HJ.0X00
    Ubicación
    Tanti - Córdoba - Argentina
    Mensajes
    2,159
    Gracias
    1,902
    Agradecido 1,572 veces en 940 posts
    Cita Iniciado por Julian_03 Ver mensaje
    Voy a ver si encuentro un codigo que use, para explicarte como configuras esto del PWM
    Saludos!
    Ojo, que cuando se trabaja sobre la red eléctrica el "PWM" debe estar sincronizado con la frecuencia de red, es decir debes detectar el cruce por cero de la señal alterna, sino, el triac no se va ha apagar, y nunca vas ha lograr que funcione como debe ser.

    Saludos
    HJ
    "Cuando llegue la inspiración, que me encuentre trabajando."
    ​PICASSO, Pablo

    Consulta el Indice de Montajes NeoTeo

    Esta etapa concluyó, ahora estoy Por aquí...

    No soy mas Moderador aunque figure como tal.

  3. Los siguientes usuarios agradecen a HJ.0X00 por este post:

    RDBrot (02/07/2012)

  4. #23
    Usuario Avatar de Julian_03
    Ubicación
    Entre Rios, Argentina
    Mensajes
    1,492
    Gracias
    491
    Agradecido 523 veces en 373 posts
    Acá encontré el código comentado paso por paso y como se configura, lo demás es todo tuyo es decir tu encárgate de modificarlo a tu gusto

    #include <16f876.h>
    #fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
    #use delay(clock=4000000)
    void main(void){
    long duty_PWM1, duty_PWM2;
    // Para cristal de 4 mhz, frecuencia de 20 khz ,
    // T2DIV set to 1
    // Para calcular la frecuencia:
    // (4/frecuencia cristal)*T2_DIV*(periodo+1)
    // (4/4000000)*1*(49+1)=0.00005seg
    setup_timer_2(T2_DIV_BY_1, 49, 1);
    // seleccionamos PWM para los dos módulos CCP
    setup_ccp1 (CCP_PWM);
    setup_ccp2 (CCP_PWM);
    // cargamos el duty cicle para cada PWM. La frecuencia es igual para ambas, 20KHz.
    // Para calcular el tiempo en nivel alto, dado que usamos un LONG, sería:
    // Valor*T2_DIV*(1/frecuencia del cristal). Si se usa un valor tipo INT en lugar
    // de LONG se calcularía multiplicando la fórmula por 4: Valor*T2_DIV*(1/frecuencia del cristal)*4
    duty_PWM1 = 100; // 0.000025seg/(1*(1/4000000))=100, que es el valor a cargar. Duty 50%
    duty_PWM2 = 200; // 0.000050seg/(1*(1/4000000))=200. Si te fijas, con 20KHZ el T=50us,
    // que es lo que se ha puesto para el duty, osea, todo.
    // Por tanto la señal será continua a 5v. Duty cicle 100%
    set_pwm1_duty(duty_PWM1);
    set_pwm2_duty(duty_PWM2);
    while(1){ //bucle infinito.
    }
    }
    Saludos!

  5. #24
    Usuario Avatar de Julian_03
    Ubicación
    Entre Rios, Argentina
    Mensajes
    1,492
    Gracias
    491
    Agradecido 523 veces en 373 posts
    Ojo, que cuando se trabaja sobre la red eléctrica el "PWM" debe estar sincronizado con la frecuencia de red, es decir debes detectar el cruce por cero de la señal alterna, sino, el triac no se va ha apagar, y nunca vas ha lograr que funcione como debe ser.
    eso que lo haga en un circuito externo, no?
    la programación del pic aparte y que en un circuito externo que detecte el cruce
    en el video que pase en comentarios anteriores creo que tenia el circuito....
    Saludos!

  6. #25
    Super Moderator Avatar de HJ.0X00
    Ubicación
    Tanti - Córdoba - Argentina
    Mensajes
    2,159
    Gracias
    1,902
    Agradecido 1,572 veces en 940 posts
    Cita Iniciado por Julian_03 Ver mensaje
    eso que lo haga en un circuito externo, no?
    la programación del pic aparte y que en un circuito externo que detecte el cruce
    en el video que pase en comentarios anteriores creo que tenia el circuito....
    Saludos!
    Si no sincronizas el cruce por cero con el PWM, la cosa no anda.
    Si o si debes leer por un pin del micro el cruce por cero.

    Saludos
    HJ

    Edito: Insisto, no es lo mismo trabajar en DC que en AC.
    "Cuando llegue la inspiración, que me encuentre trabajando."
    ​PICASSO, Pablo

    Consulta el Indice de Montajes NeoTeo

    Esta etapa concluyó, ahora estoy Por aquí...

    No soy mas Moderador aunque figure como tal.

  7. Los siguientes usuarios agradecen a HJ.0X00 por este post:

    faiste (02/07/2012)

  8. #26
    Usuario Avatar de Julian_03
    Ubicación
    Entre Rios, Argentina
    Mensajes
    1,492
    Gracias
    491
    Agradecido 523 veces en 373 posts
    Insisto, no es lo mismo trabajar en DC que en AC.
    aaaaa perdon me olvide que era AC
    mis disculpas, bueno pero la programación le sirve para ver como configura el timer
    Saludos!

  9. #27
    Usuario Avatar de Barrero0717
    Ubicación
    Bogotá, Colombia
    Mensajes
    20
    Gracias
    20
    Agradecido 12 veces en 4 posts
    Por fin!!!! Después de mucho cacharreo el código por fin funciona...
    Gracias a Después por sus comentarios y ayudar a resolver este problema...
    Dejo el código por si alguien quiere verlo o lo necesita para una aplicación.

    Código:
    #include <12F675.h>
    
    
    #FUSES NOWDT                    //No Watch Dog Timer
    #FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
    #FUSES NOCPD                    //No EE protection
    #FUSES NOPROTECT                //Code not protected from reading
    #FUSES MCLR                     //Master Clear pin enabled
    #FUSES NOPUT                    //No Power Up Timer
    #FUSES BROWNOUT                 //Reset when brownout detected
    
    
    #use delay(int=4000000)
    
    
    #use FIXED_IO( A_outputs=PIN_A0 )
    #define GP0   PIN_A0   // TRIAC
    #define GP1   PIN_A1   // SIN USAR
    #define GP2   PIN_A2   // DETECTOR CRUCE POR CERO
    #define GP3   PIN_A3   // RESET - MASTER CLEAR
    #define GP4   PIN_A4   // UP
    #define GP5   PIN_A5   // DOWN
    
    
    int counter = 0;
    int retardo = 85;
    //int tmr0load;
    
    
    #int_EXT
    void  EXT_isr(void)
    {
       output_low(GP0);
       counter = 0;
       set_timer0(retardo);
       
       enable_interrupts(INT_TIMER0);
    }
    
    
    #int_TIMER0 
    void  TIMER0_isr(void) 
    {
       set_timer0(retardo);        
       counter = counter + 1;
       if (counter >= retardo){ 
          output_high(GP0);
          disable_interrupts(INT_TIMER0);
          }
       
    }
    
    
    
    
    
    
    void main()
    {
       enable_interrupts(GLOBAL);
       enable_interrupts(INT_EXT);
       setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1);
       enable_interrupts(INT_TIMER0);
          
       output_low(GP0);
    
    
       while(TRUE)
       {
          if (input(GP4)==1) {
             delay_ms(50);
             if (retardo > 2) {
                retardo--;
             }
             else{
                retardo = 1;
             }                        
          }
        
        if (input(GP5)==1) {
            delay_ms(50);
            if (retardo<85) {
                retardo++;
            }
            else{
                retardo = 85;
            }
        }
       }
    
    
    }
    Última edición por Mario; 02/07/2012 a las 13:56 Razón: Acomoda código para mejor visualización

  10. Los siguientes 2 usuarios agradecieron a Barrero0717 por este post:

    Daikataro (04/03/2013), Guerra (02/07/2012)

  11. #28
    Super Moderator Avatar de HJ.0X00
    Ubicación
    Tanti - Córdoba - Argentina
    Mensajes
    2,159
    Gracias
    1,902
    Agradecido 1,572 veces en 940 posts
    Hola Barrero0717, me alegro que lo hayas echo andar.

    Saludos
    HJ
    "Cuando llegue la inspiración, que me encuentre trabajando."
    ​PICASSO, Pablo

    Consulta el Indice de Montajes NeoTeo

    Esta etapa concluyó, ahora estoy Por aquí...

    No soy mas Moderador aunque figure como tal.

  12. #29
    Usuario
    Mensajes
    1
    Gracias
    0
    Agradecido 0 veces en 0 posts
    Código:
    #include <16F873A.h>    // busca en el directorio include del compilador
    
    
    #fuses HS,NOWDT,PUT,NODEBUG,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT
    
    
    #use delay(clock = 20M)     // CRISTAL DEL PIC = 20MHz
    
    
    // ======= DECLARACION DE PUERTOS Y REGISTROS ESPECIALES DEL PIC  (BK5) ========
    #BYTE pta = 0x5 // dirección en RAM
    #BYTE ptb = 0x6 // dirección en RAM
    #BYTE ptc = 0x7 // dirección en RAM
    //#BYTE ptd = 0x8 // dirección en RAM
    //#BYTE pte = 0x9 // dirección en RAM
    
    
    #BYTE trisa = 0x85 // dirección en RAM
    #BYTE trisb = 0x86 // dirección en RAM
    #BYTE trisc = 0x87 // dirección en RAM
    //#BYTE trisd = 0x88 // dirección en RAM
    //#BYTE trise = 0x89 // dirección en RAM
    
    
    #BYTE status = 0x3 // dirección en RAM
    #BYTE intcon = 0x0B // dirección en RAM
    #BYTE option = 0x81 // dirección en RAM
    #BYTE adcon0 = 0x1F // dirección en RAM
    #BYTE adcon1 = 0x9B // dirección en RAM
    #BYTE pir1 = 0x0C // dirección en RAM
    #BYTE pie1 = 0x8C // dirección en RAM
    #BYTE pir2 = 0x0D // dirección en RAM
    #BYTE pie2 = 0x8D // dirección en RAM
    
    
    
    
    //===== DECLARACION GLOBAL DE VARIABLES, VECTORES Y MATRICES EN RAM (BK3) ======
    int8 x=0,i=0;
    
    
    
    
    // ================ NOMINACION DE PINES DEL HARDWARE (BK2) ==============
    
    
    #BIT       D0         =  ptc.7          //bit 1 del puerto c
    #BIT       cambio     =  option.6
    
    
    // ============== DECLARACION DE INTERRUPCIONES DEL PIC  (BK8) =================
    
    
    
    
    #int_EXT  //ptb0
    void int_b0(void)
    {
    cambio=!cambio;
    
    
       if(x==1)
       {
          D0=0;
          delay_us(6200);
          D0=1;
          delay_us(2);
          D0=0;
       }
    
    
       if(x==2)
       {
          D0=0;
          delay_us(4000);
          D0=1;
          delay_us(2);
          D0=0;
       }
    
    
       if(x==3)
       {
          D0=0;
          delay_us(0);
          D0=1;
          delay_us(2);
          D0=0;
       }
    }
    
    
    
    
    #int_RB  //ptb4 A ptb7
    void RB_isr(void)
    {
    if (!bit_test(ptb,4))
    {
       if(x<3) x=x+1;
    
    
    
    
    }
    if (!bit_test(ptb,5))
    {
       if(x>1) x=x-1;
    
    
    }
    }
    
    
    
    
    
    
    
    
    void main()  // ========= INICIO FUNCION PRINCIPAL MAIN (BK5 A BK7) ============
    {
    
    
    // ------------ configuracion Puertos ---------------
       set_tris_a(0b00000000);    // dirección puerto C  0=out, 1=input
      // set_tris_d(0b00000000);    // dirección puerto C  0=out, 1=input
       set_tris_c(0b00000000);    // dirección puerto C  0=out, 1=input
       //set_tris_e(0b00000000);    // dirección puerto C  0=out, 1=input
       output_low(pin_c7);          // como salida e inicializado en 0
       port_b_pullups(true);          // habilito pull up portb
    
    
    // ------- configuracion interrupcion port b0 --------
    
    
     ext_int_edge(h_to_l);          // configuracion flanco ptb0 h_to_l ó l_to_h
     enable_interrupts(int_ext);      // habilito int ptb0
     output_float(pin_b0);            // ptb0 como entrada
    
    
    
    
      // ------- configuracion interrupcion port b4 a b7--------
    
    
       enable_interrupts(int_rb);       // habilito int ptb4ab7
       output_float(pin_b4);            // ptb4 como entrada
       output_float(pin_b5);            // ptb5 como entrada
    
    
    
    
      // ------- configuracion general del PIC --------
     enable_interrupts(global);       // ENABLE_INTERRUPTS(GLOBAL)
    
    
    do{
    
    
    
    
    }
    while(true);
    
    
    }
    //este codigo es muy censillo y funciona, sin necesidad de tmr0 esta con dos pulsadores y esta hecho para que el triac entregue tres diferentes niveles de potencia a la caarga q desees
    Última edición por Mario; 17/11/2012 a las 00:21 Razón: Incrustar el código correctamente

  13. #30
    Usuario Avatar de fer650
    Ubicación
    Buenos Aires, Argentina
    Mensajes
    142
    Gracias
    65
    Agradecido 91 veces en 52 posts
    Hola, se me ocurre probar de deshabilitar la interrupción externa antes de cambiar el flanco y luego habilitarla nuevamente.
    Saludos,

    Fernando

Página 3 de 4 PrimerPrimer 1234 ÚltimoÚltimo

Temas similares

  1. Interruptor y/o dimmer con PIC y sensible al tacto
    Por Constructor en el foro Electrónica Digital
    Respuestas: 28
    Último mensaje: 01/08/2012, 03:49
  2. Problemas con HSerin y Pulsadores en el Menú.
    Por CallerInf en el foro Electrónica Digital
    Respuestas: 4
    Último mensaje: 06/06/2012, 09:32
  3. Control pulsadores de un PIC
    Por Meta en el foro Electrónica Digital
    Respuestas: 12
    Último mensaje: 30/03/2012, 10:11
  4. LED Control: PWM, Servo y LED Dimmer
    Por Yesbond en el foro Electrónica Digital
    Respuestas: 13
    Último mensaje: 25/08/2011, 22:32
  5. Pic12f675 + Eeprom!
    Por AlanB en el foro Electrónica Digital
    Respuestas: 6
    Último mensaje: 31/08/2010, 04:45

Los visitantes encuentran esta página buscando por:

como hacer un dimmer digital

dimmer con pic

dimmer con pic12f675

dimmer pic ccs

clock variable por potenciometro pic16f628a

dimmer

pic12f675 ccs

microcontroladores pwm con pulsadores

dimmer digital pic 16f877a

hacer dimmer digital

dimmer digital

pic12f675 proyectos

dimmer 12f675

pic12f675 dimmerdimmer con pic12f ponteciometropwm con pulsadorespic12f675proyectos pic12f675como hacer un dimmerdimmer digital picdimmer con el 16f877aproyectos pic 12f67512f675 dimmer¿como hacer un dimmer digitaldimmer con cruce por cero

Etiquetas para este tema

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37