Transmisión serial modulada a 38khz con 12f683 en Proton

Hola tengo un problemita tengo todo el circuito echo y funciona, ahora lo tengo con un transmisor RF, tambien funciona con leds infrarrojos pero sin modular, ahora lo unico que me falta es modular la salida a 38khz para usar un TSOP1738 de receptor y tener mas alcanse y meno ruido.

Estuve leyendo sobre usar el CCP pero la verdad no logre hacerlo andar. Se usar interrupciones, pero no se si mientras se ejecutan me corta la transmision. Y creo que tendria que usar el UART para enviar.

Dejo el programa como esta ahora:

Device 12F683
Config INTRC_OSC_NOCLKOUT
All_Digital=True ' Coloca todo los pines como digitales (PBP alldigital)

;############## TRANSMISOR #################
Include "modedefs.bas"
TRISIO = %00000000 ;Pongo todo como salida
CMCON0 = 7 ;12f683 Analog comparators off (en 12f629 es CMCON = 7)
GPIO = 0 ;apaga todas las salidas


start:
DelayMS 500
;Sleep 1
SerOut GPIO.0,N1200,[$FF,$FF,"12345","H"] ;Envia con la clave 12345 y el dato H
DelayMS 200
SerOut GPIO.0,N1200,[$FF,$FF,"12345","H"] ;Envia con la clave 12345 y el dato H
GoTo start
 
Hola, biker2k3, yo hice un mando en código RC5 a 36Khz con pic 16F628, esta es la parte del código de transmisión y modulación, espero que te sea de ayuda:
Código:
/* 
Creative Commons 3.0 Reconocimiento, No Comercial, Compartir Igual (CC BY-NC-SA 3.0) 
Autor: Heli
========================================================================*/
// Envia una rafaga 36Khz o pausa de 889us+889us 
// Con 8/10us y 1/1nop da 35,42Khz Con 8/10us y 0/1nop da 36,74Khz
// A 4Mhz que son 0,5us por instruccion no se puede afinar mas
void BurstBIT(bool Bit)
{
   byte Cont;
      
   if (Bit) delay_us(889);         // Esperar 889us             
   else 
     for (Cont=30; Cont; Cont--)   // Ajustar duracion a 889us
     {                             // Ajustado a 35,5Khz
       output_high (IRLed);        // Enciende el LED
       delay_us(8);                // Retardo de 8us         
       delay_cycles(1);            // Esto es un solo NOP de 0,5us
       output_low (IRLed);         // Apaga el LED 
       delay_us(10);               // Retardo de 10us 
       delay_cycles(1);            // Esto es un solo NOP de 0,5us
     }
}

/* ========================================================================*/
// // Envia un bit bifase: 1 NO RAFAGA, RAFAGA. 0=RAFAGA, NO RAFAGA
void SendBIT(bool Bit)
{
   BurstBIT(Bit);
   BurstBIT(!Bit);
}

/* ========================================================================*/
// Envia un bit bifase: 1 NO RAFAGA, RAFAGA. 0=RAFAGA, NO RAFAGA
// Para usar con oscilador de 36Khz externo
#define AnchoBit 852 // 889 teorico
void SendOLD(bool Bit)
{
   output_bit (IRLed, !Bit);
   delay_us (AnchoBIT);
   output_bit (IRLed, Bit);
   delay_us (AnchoBIT);
}

/* ========================================================================*/
// Envia los 14 bits bifase de un mensaje RC5, usa globales Toogle, DirRC5 y DatoRC5 
void SendRC5 (void)
{
   byte Cont;
   
   disable_interrupts(GLOBAL);         // Necesario para los tiempos exactos
   SendBIT(1);                         // Bit de start a 1
   SendBIT (!bit_test (DatoRC5,6));    // a 0 si bit 6 comando = 1 
   SendBIT (ToogleRC5);                // Bit que cambia a cada pulsacion   
   for (Cont=5; Cont; Cont--)          // La Direccion son 5 bits
   {
      SendBIT (bit_test (DirRC5,4));   // Envia direccion empezando por el bit 4 
      DirRC5<<=1;
   }
   for (Cont=6; Cont; Cont--)          // El comando son 6 bits   
   {
      SendBIT (bit_test (DatoRC5,5));  // Envia comando empezando por el bit 5 
      DatoRC5<<=1;
   }
   output_low (IRLed);                 // Desconectar salida al terminar
   enable_interrupts(GLOBAL);          // PErmitir las interrupciones
}
Originalmente iba a 4Mhz con RC interno (1us por instrucción), peor no recuerdo si lo subí a 8Mhz (0,5us instrucción), no te fíes mucho de los comentarios de los ciclos
 
Si usas la UART interna debes usar un modulador externo.
También puedes lanzar el dato a la UART, que lo sacará sin modular, y luego repetirlo mediante un programa similar al que pongo por otro pin ya modulado. Como la UART es automática mandará el dato sin modular mientras el programa manda el otro modulado.
 
Malas noticias, mi pic no tiene UART (12f683) hice esto pero tampoco anda..



Device 12F683
Config INTRC_OSC_NOCLKOUT

All_Digital=True ' Coloca todo los pines como digitales (PBP alldigital)

;############### TRANSMISOR ###############
Include "modedefs.bas"
TRISIO = %00000000 ;Pongo todo como salida
CMCON0 = 7 ;12f683 Analog comparators off (en 12f629 es CMCON = 7)
GPIO = 0 ;apaga todas las salidas


TRISIO.2 = 0 ' CCP1 (GPIO.2 = Output)
PR2 = 0x33; // freq 0x33 for 38kHz
CCPR1L = 13 ' Set PWM Duty-Cycle to 50%
CCP1CON = %00001100 ' Mode select = PWM
T2CON = %00000100 ' Timer2 ON + 1:1 prescale


start:
DelayMS 500

SerOut GPIO.0,N1200,[$FF,$FF,"12345","H"] ;Envia con la clave 12345 y el dato H
DelayMS 200
SerOut GPIO.0,N1200,[$FF,$FF,"12345","H"] ;Envia con la clave 12345 y el dato H
GoTo start
 
Hola ya resolvi todo pero me quedo un pequeño problema, el led IR lo tengo conectado entre la salida serial y la salida CPP a 38khz, lo uso con una bateria de celular y anda perfecto, pero en el control remoto lo queria usar con una CR2032 de 3v y se ve que no le da suficiente corriente y no prende bien el emisor, probe una pilita de 12v con un 78L05 pero el 7805 me comio la bateria en unas pocas horas.

Como puedo hacer
 
Atrás
Arriba