Autor Tema: PIC Control IR [SOLVED]  (Leído 3653 veces)

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

Desconectado churrinfunflais

  • PIC12
  • **
  • Mensajes: 68
PIC Control IR [SOLVED]
« en: 17 de Diciembre de 2012, 21:04:18 »
Hola amigos!!

Estoy atorado con un proyecto pequeño que requiere sustituir el control remoto de un foco de colores con un PIC + IRtx, el objetivo es automatizar el cambio de colores de 50 focos que utilizan el mismo control remoto el cual utiliza un protocolo CR5.

El protocolo RC5 es un protocolo común de transmisión IR. Se utiliza una transmisión de 14-bits que consta de 2 bits de inicio, 1 bit de conmutación, 5 bits de dirección, y 6 bits de datos. Esta transmisión de 14-bit forma un paquete y se repite cada 114 ms, mientras que el botón para iniciar la transmisión se lleva a cabo hacia abajo. Una vez liberado, una última transmisión sea enviada indicando liberación de un botón.

Estoy utilizando un PIC18f4550 + xtal 12Mhz + C18 tratando de sacar la señal por el pwm.

Código: [Seleccionar]
/*
 * File:   main.c
 * Author: Rodrigo
 *
 * Created on 17 de diciembre de 2012, 12:05
 */

#include <stdio.h>
#include <stdlib.h>

#include <p18f4550.h> // Processor specific
#include <pwm.h> // Located in the h folder of MCC18
#include <timers.h> // Located in the h folder of MCC18

        #pragma config PLLDIV   = 3         // (20 MHz crystal on PICDEM FS USB board)
        #pragma config CPUDIV   = OSC1_PLL2
        #pragma config USBDIV   = 2         // Clock source from 96MHz PLL/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      //USB Voltage Regulator
        #pragma config WDT      = OFF
        #pragma config WDTPS    = 32768
        #pragma config MCLRE    = ON
        #pragma config LPT1OSC  = OFF
        #pragma config PBADEN   = OFF
//      #pragma config CCP2MX   = ON
        #pragma config STVREN   = ON
        #pragma config LVP      = OFF
//      #pragma config ICPRT    = OFF       // Dedicated In-Circuit Debug/Programming
        #pragma config XINST    = OFF       // Extended Instruction Set
        #pragma config CP0      = OFF
        #pragma config CP1      = OFF
//      #pragma config CP2      = OFF
//      #pragma config CP3      = OFF
        #pragma config CPB      = OFF
//      #pragma config CPD      = OFF
        #pragma config WRT0     = OFF
        #pragma config WRT1     = OFF
//      #pragma config WRT2     = OFF
//      #pragma config WRT3     = OFF
        #pragma config WRTB     = OFF       // Boot Block Write Protection
        #pragma config WRTC     = OFF
//      #pragma config WRTD     = OFF
        #pragma config EBTR0    = OFF
        #pragma config EBTR1    = OFF
//      #pragma config EBTR2    = OFF
//      #pragma config EBTR3    = OFF
        #pragma config EBTRB    = OFF


void main(void) {

    TRISC = 0;

    OpenTimer2(TIMER_INT_ON & T2_PS_1_1 & T2_POST_1_1);

    OpenPWM1(0x32); // Period - frequency
    while (1) {
        SetDCPWM1(127);
    }
}

Como puedo mandar correctamente una trama de CR5 por el PWM?? cualquier ayuda es bienvenida...
« Última modificación: 26 de Diciembre de 2012, 14:11:01 por churrinfunflais »

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: PIC Control IR
« Respuesta #1 en: 17 de Diciembre de 2012, 21:08:11 »
Y ¿Cual es tu duda?
[/b]
También estoy trabajando con estre protocolo ,transmisor y receptor.

Saludos!

* XD ya vi tu duda ,actualizaste el post  :mrgreen:

Configura el pin como salida.
Ajusta el periodo.
Activa la salida PWM.
periodo medio bit
apaga PWM .

Te dejo este link , esta hecho en CCS pero tu propblema solo es como activar bien el PWM.

http://www.todopic.com.ar/foros/index.php?topic=37816.0

Por ahora estoy pasando el proyecto a xc8
« Última modificación: 17 de Diciembre de 2012, 21:12:00 por AKENAFAB »

Desconectado churrinfunflais

  • PIC12
  • **
  • Mensajes: 68
Re: PIC Control IR
« Respuesta #2 en: 17 de Diciembre de 2012, 21:10:35 »
Y ¿Cual es tu duda?
[/b]
También estoy trabajando con estre protocolo ,transmisor y receptor.

Saludos!

* XD ya vi tu duda ,actualizaste el post  :mrgreen:

Gracias por tu ayuda...

Estoy tratando de sacar la señal por el PWM,,, como puedo mandar por el puerto una trama CR5 correctamente...

esto es lo que estoy intentando...
Código: [Seleccionar]
/*
 * File:   main.c
 * Author: Rodrigo
 *
 * Created on 17 de diciembre de 2012, 12:05
 */

#include <stdio.h>
#include <stdlib.h>

#include <p18f4550.h> // Processor specific
#include <pwm.h> // Located in the h folder of MCC18
#include <timers.h> // Located in the h folder of MCC18

        #pragma config PLLDIV   = 3         // (20 MHz crystal on PICDEM FS USB board)
        #pragma config CPUDIV   = OSC1_PLL2
        #pragma config USBDIV   = 2         // Clock source from 96MHz PLL/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      //USB Voltage Regulator
        #pragma config WDT      = OFF
        #pragma config WDTPS    = 32768
        #pragma config MCLRE    = ON
        #pragma config LPT1OSC  = OFF
        #pragma config PBADEN   = OFF
//      #pragma config CCP2MX   = ON
        #pragma config STVREN   = ON
        #pragma config LVP      = OFF
//      #pragma config ICPRT    = OFF       // Dedicated In-Circuit Debug/Programming
        #pragma config XINST    = OFF       // Extended Instruction Set
        #pragma config CP0      = OFF
        #pragma config CP1      = OFF
//      #pragma config CP2      = OFF
//      #pragma config CP3      = OFF
        #pragma config CPB      = OFF
//      #pragma config CPD      = OFF
        #pragma config WRT0     = OFF
        #pragma config WRT1     = OFF
//      #pragma config WRT2     = OFF
//      #pragma config WRT3     = OFF
        #pragma config WRTB     = OFF       // Boot Block Write Protection
        #pragma config WRTC     = OFF
//      #pragma config WRTD     = OFF
        #pragma config EBTR0    = OFF
        #pragma config EBTR1    = OFF
//      #pragma config EBTR2    = OFF
//      #pragma config EBTR3    = OFF
        #pragma config EBTRB    = OFF


void main(void) {

    TRISC = 0;

    OpenTimer2(TIMER_INT_ON & T2_PS_1_1 & T2_POST_1_1);

    OpenPWM1(0x); // Period - frequency
    while (1) {
        SetDCPWM1(127);
    }
}

Saludos...

Desconectado churrinfunflais

  • PIC12
  • **
  • Mensajes: 68
Re: PIC Control IR
« Respuesta #3 en: 18 de Diciembre de 2012, 20:03:46 »
Como puedo el PWM para alcanzar una frecuencia de 36KHz en el PIC18f4550 con un cristal de 12MHz??

Actualmente solo logro alcanzar una frecuencia de 46.8KHz....

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

#include <p18f4550.h> // Processor specific
#include <pwm.h> // Located in the h folder of MCC18
#include <timers.h> // Located in the h folder of MCC18
#include <delays.h>

#pragma config PLLDIV   = 3         // (12 MHz crystal)
#pragma config CPUDIV   = OSC1_PLL2
#pragma config USBDIV   = 2         // Clock source from 96MHz PLL/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      //USB Voltage Regulator
#pragma config WDT      = OFF
#pragma config WDTPS    = 32768
#pragma config MCLRE    = ON
#pragma config LPT1OSC  = OFF
#pragma config PBADEN   = OFF
//      #pragma config CCP2MX   = ON
#pragma config STVREN   = ON
#pragma config LVP      = OFF
//      #pragma config ICPRT    = OFF       // Dedicated In-Circuit Debug/Programming
#pragma config XINST    = OFF       // Extended Instruction Set
#pragma config CP0      = OFF
#pragma config CP1      = OFF
//      #pragma config CP2      = OFF
//      #pragma config CP3      = OFF
#pragma config CPB      = OFF
//      #pragma config CPD      = OFF
#pragma config WRT0     = OFF
#pragma config WRT1     = OFF
//      #pragma config WRT2     = OFF
//      #pragma config WRT3     = OFF
#pragma config WRTB     = OFF       // Boot Block Write Protection
#pragma config WRTC     = OFF
//      #pragma config WRTD     = OFF
#pragma config EBTR0    = OFF
#pragma config EBTR1    = OFF
//      #pragma config EBTR2    = OFF
//      #pragma config EBTR3    = OFF
#pragma config EBTRB    = OFF

void main(void) {

    TRISC = 0;

    OpenTimer2(TIMER_INT_OFF & T2_PS_1_1);
    OpenPWM1(255); // Period - frequency
    SetDCPWM1(0b111110100);
    while (1);
    }

Desconectado churrinfunflais

  • PIC12
  • **
  • Mensajes: 68
Re: PIC Control IR
« Respuesta #4 en: 19 de Diciembre de 2012, 18:30:09 »
Hola amigos!!!

He solucionado el problema de la frecuencia del PWM,,, no se si de una forma correcta pero con esto logro sacar la frecuencia que necesite y con el Duty Cycle que quiera... ahora solo falta agregar las rutinas de paquetes CR5.

Aquí les dejo mi código,, espero no hacer malas practicas de programación... cualquier recomendación es bienvenida.
Código: [Seleccionar]
   #define Xtal    12000000    // 12MHz Xtal
    #define Freq    36000       // 36Khz PWM frequency
    #define Duty    0.50        // 50% Duty Cycle
    #define PS      1           // Prescaler 1:1

    #define PWM_Freq    (Xtal)/(Freq * 4 * PS)
    #define PWM_Duty    (Duty * Xtal)/(Freq * (1/PS))  

void main(void) {

    TRISC = 0;

    OpenTimer2(TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_1);
    OpenPWM1(PWM_Freq);         // PWM Frequency output
    SetDCPWM1(PWM_Duty);        // PWM Duty Cycle
    while (1);
}

Saludos...

Desconectado churrinfunflais

  • PIC12
  • **
  • Mensajes: 68
Re: PIC Control IR [SOLVED]
« Respuesta #5 en: 26 de Diciembre de 2012, 14:07:07 »
Bueno amigos...

Por fin logre enviar correctamente la trama IR a través del PWM,,, Estaba muy equivocado con el protocolo que estaba tratando de utilizar,,, no es RC5 sino JVC,,, aquí les dejo una pequeña librería que hice en C18 muy fácil de utilizar para mandar correctamente las tramas 33 bits del protocolo  JVC,,, para otros protocolos solo abría que ajustar las secuencias y frecuencias de la portadora....

saludos....
« Última modificación: 26 de Diciembre de 2012, 15:38:33 por churrinfunflais »

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: PIC Control IR [SOLVED]
« Respuesta #6 en: 26 de Diciembre de 2012, 16:09:48 »
Buen aporte churrinfunflais.

Yo estoy haciendo también un "experimento" con un emisor y receptor IR pero generando la frecuencia de 38 KHz mediante un timer y aún no soy capaz de hacerlo que vaya fino. Estoy intentando hacer una "barrera" IR y el mismo micro genera la señal de 38KHz, con un TSUS5400, y la recibe, con un TSOP1738, que es quien detecta que hay algo en medio al dejar de recibir.

Me he dado cuenta de que si hago que el timer me interrumpa cada 13,16 uS ( para alternar el Low y el High correspondiente a un semi-periodo de los 38KHz) ... todo lo demás de micro se me queda "tieso" y no hace nada mas que eso, deja de recibir por la UART y no me funciona la INT_EXT para detectar.

Voy a probar con tu método a ver si así el micro es capaz de enviar (generar los 38 KHz) y al mismo tiempo recibir tanto del TSOP1738 (vía #INT_EXT) como de la UART (vía #INT_RDA).

Ya os diré como me va.  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado churrinfunflais

  • PIC12
  • **
  • Mensajes: 68
Re: PIC Control IR [SOLVED]
« Respuesta #7 en: 26 de Diciembre de 2012, 16:26:08 »
Buen aporte churrinfunflais.

Yo estoy haciendo también un "experimento" con un emisor y receptor IR pero generando la frecuencia de 38 KHz mediante un timer y aún no soy capaz de hacerlo que vaya fino. Estoy intentando hacer una "barrera" IR y el mismo micro genera la señal de 38KHz, con un TSUS5400, y la recibe, con un TSOP1738, que es quien detecta que hay algo en medio al dejar de recibir.

Me he dado cuenta de que si hago que el timer me interrumpa cada 13,16 uS ( para alternar el Low y el High correspondiente a un semi-periodo de los 38KHz) ... todo lo demás de micro se me queda "tieso" y no hace nada mas que eso, deja de recibir por la UART y no me funciona la INT_EXT para detectar.

Voy a probar con tu método a ver si así el micro es capaz de enviar (generar los 38 KHz) y al mismo tiempo recibir tanto del TSOP1738 (vía #INT_EXT) como de la UART (vía #INT_RDA).

Ya os diré como me va.  :mrgreen:

Si alguna ves yo intente algo similar de utilizar el usart por interrupciones (un completo fracaso) ya que todo lo demas se me congelaba hasta que se completara la interrupcion y el programa continuase... lo que hice fue utilizar la adquisición de los datos por puling y resuelto... Te recomiendo que para generar una señal utilices el PWM es un modulo muy útil para sacar señales...

Saludos...

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: PIC Control IR [SOLVED]
« Respuesta #8 en: 26 de Diciembre de 2012, 20:05:12 »
Prueba esta configuracion REDPIC que a mi me ha servido!

Citar
setup_ccp2(ccp_pwm);
      setup_timer_2(t2_div_by_1,64,1);

Citar
set_pwm2_duty(0L);   // saca la señal de 38Khz
 
Citar
set_pwm2_duty(130L);  // apaga la señal de 38khz, creo ;)

Son fragmentos de lo que hice en mi programa, pero sirve para configurar los 38Khz

Saludos

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: PIC Control IR [SOLVED]
« Respuesta #9 en: 26 de Diciembre de 2012, 21:01:19 »
Gracias Ralf2 y churrinfunflais.

Ya está solucionado. Además me ha sido mucho más fácil de lo que creía, buscando información por ahí leí algo sobre el Wizard del CCS C. Lo utilicé dándole solo la frecuencia que deseaba, la velocidad de mi Clock y el Duty que quería y él me puso directamente los setups del PWM.

Lo compilé y programé en el PIC y con el osciloscopio he mirado la onda y es perfecta. Lo único es que he tenido que cambiarlo de pin para conectarlo al de la salida de ECCP.

Ya funciona perfectamente y el resto del programa también. Ea, otra cosa menos.  :mrgreen:
« Última modificación: 26 de Diciembre de 2012, 21:03:22 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania


 

anything