Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
Y has logrado algún avance con el programa o el proyecto Arsenic?
Hola que tal soy nuevo en el foro y en la electrónica, trato de realizar un modulo de radio frecuencia pero este no funciona.
-Tengo un modulo de envio con un chip ht12e se alimenta de una batería 9v con un regulador de voltaje a 5v (l7805) regulo el voltaje a 5v, alimento el chip en el pin 18 con 5v el pin 8 lo conecto a tierra con el pin 9 y con eso fijo la dirección de conexión entre los dos encapsulados.
-El modulo de recepción lo conecto con un cable usb que le da corriente 5v directamente al encapsulado ht12d el pin 8 lo conecto con el pin 9 para fijar la dirección igual a la del modulo de envío, solo trato de hacer funcionar los dos encapsulados no he puesto el rx y tx, solo trato de revisar que los dos chip funcionen entre si pero no lo logro.
-Conecte el pin 17 del ht12d con un led en la pata positiva la pata negativa del led va a una resistencia de 220 ohm y la otra pata de la resistencia esta conectada a tierra, el led debería de prender al conectar el pin 17 del ht12e lo conecto con el 14 del pin ht12d debería de prender el led ¿CORRECTO?
Que opinan que puede estar mal? algún consejo por favor
Podrías subir un video para ver bien que es lo que te hace, ya que de esa forma me voy a dar cuenta más facil de por donde puede venir el problema, saludos.frankko dijo:hola Juanma,
Probé el código que amablemente me adjuntaste y solo funciona con el simulador Proteus, almacena el código, elimina etc., pero una vez que se activa la salida, no se desactivará al soltar el botón. En el prototipo físico que monté portando el puerto 16f886 del que adjunto el archivo, consigo 'encender solo dos flashes del LED, y no voy más allá. Tal vez tienes que cambiar la tolerancia? ¿Puedes ayudarme a resolverlo? De lo contrario, no puedo continuar. Gracias, saludos a todos y Feliz Navidad.
Podrías subir un video para ver bien que es lo que te hace, ya que de esa forma me voy a dar cuenta más facil de por donde puede venir el problema, saludos.
#include <18F26K22.h>
#Device PASS_STRINGS=IN_RAM
#ZERO_RAM
#FUSES INTRC_IO, NOWDT, BROWNOUT, PUT, NOPBADEN, NOHFOFST
#fuses NOPLLEN //HW PLL disabled, PLL enabled in software
#fuses MCLR //Master Clear pin enabled
#fuses PROTECT //Code protected from reads
#use delay(internal=8MHz) //CCS
#use rs232(baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7,ERRORS,stream=uart1) // Configuración UART1 (Hardware)
#use rs232(baud=9600,bits=8,parity=N,xmit=PIN_B6,rcv=PIN_B7,ERRORS,stream=uart2) // Configuración UART2 (Hardware)
//#use rs232(baud=9600,bits=8,parity=N,xmit=PIN_C3,rcv=PIN_C2,ERRORS,stream=debug) // Configuración debug (Software) (Invertido, para el cable RX=C2, TX=C3)
#use fast_io(B)
//#use fast_io(C)
// Definiciones del puerto A
#define Led PIN_B0
#define Led_Ok PIN_B1
#define Pulsador PIN_B2
#define Datos PIN_B4
// Definiciones globales
int i,j,l;
int Salto,Aux,Activado;
#byte IOCA = 0x096
enum
{
RX_Ocupado = 0,
RX_Libre,
RX_Espacio_Tramas,
RX_Contar_Bits,
RX_Medicion_Tiempo_Bits,
RX_Sincronizar,
RX_Decodificar,
RX_Codigo_Ok,
RX_Codigo_Error,
};
typedef struct {
unsigned int Codigo[3];
unsigned int Estado;
unsigned int Resultado;
unsigned int Grabar;
unsigned int Contador;
unsigned int Contador_Bits;
unsigned int Buscar_Tiempo_ET;
unsigned int Nuevo_Bit;
unsigned long Tiempo_Entre_Tramas;
unsigned long Aux_Tiempo_Entre_Tramas;
unsigned long PulsoBajo;
unsigned long PulsoAlto;
unsigned long Tiempo_ET_delta_neg;
unsigned long Tiempo_ET_delta_pos;
unsigned long Tiempo_Bit[2];
unsigned long Bit;
} RXInfo;
RXInfo RX;
#define Tolerancia (int) 200 // Tiempo = Tolerancia*1useg
void Parpadeo_led (int j){
for (l=0;l<j;l++) {
output_high (Led);
delay_ms (200);
output_low (Led);
delay_ms (200);
}
}
#INT_RB
void Ingreso_de_codigo (void) //Maquina para la lectura de bits
{
switch (RX.Estado) {
case RX_Libre:
{
if(input(Datos) == 0) // Entro solo si esta en bajo
{
set_timer1(0); //Inicializo el timer1
RX.Tiempo_Entre_Tramas = 0; //Inicializo el valor de Tiempo_Entre_Tramas con 0
RX.Aux_Tiempo_Entre_Tramas = 0;
RX.Contador = 0;
RX.Estado = RX_Espacio_Tramas;//Siguiente paso
}
}break;
case RX_Espacio_Tramas:
{
if(input(Datos) == 1)
{
RX.Aux_Tiempo_Entre_Tramas = get_timer1();
RX.Contador++;
}
else
{
set_timer1(0);
}
}break;
case RX_Contar_bits:
{
if(input(Datos) == 0) // Entro solo si esta en bajo
set_timer1(0); //Inicializo el timer1
else
{
RX.Tiempo_Entre_Tramas = get_timer1();
set_timer1(0);
RX.Contador_Bits++;
}
}break;
case RX_Medicion_Tiempo_Bits:
{
if (input(Datos) == 1)
{
RX.PulsoBajo = get_timer1();
set_timer1(0);
}
else
{
RX.PulsoAlto = get_timer1();
set_timer1(0);
}
}break;
case RX_Sincronizar:
{
RX.Contador++;
}break;
case RX_Decodificar:
{
if (input(Datos) == 1) {
RX.Bit = get_timer1();
RX.Contador++;
RX.Nuevo_Bit = true;
}
else
set_timer1(0);
}break;
}
clear_interrupt(int_rb);
}
void main(){
set_tris_b (0b10111100); // Entradas:A2,A3,A4,A5 - Salidas:A0,A1
output_b (0);
IOCA = 32;
Salto = read_eeprom (252);
if (Salto==255) Salto = 0;
setup_timer_1 (T1_INTERNAL|T1_DIV_BY_2); // Base de tiempo de 1 useg
RX.Estado = RX_Libre;
enable_interrupts (int_rb);
enable_interrupts (global);
output_high (Led);
///////////////////////////////////////////////////////////////////////////
for (;;) {
// Rutina para grabar controles remotos y configurar
if (input(Pulsador)==1) {
disable_interrupts (int_rb);
output_low (Led);
delay_ms (1000);
// Rutina para grabar controles remotos
if (input(Pulsador) == 0) {
if (Salto < 240)// Puedo grabar hasta 80 codigos de 24 bits
{
RX.Grabar = 1;
RX.Buscar_Tiempo_ET = False;
RX.Tiempo_ET_delta_neg = 0;
RX.Tiempo_ET_delta_pos = 0;
RX.Contador_Bits = 0;
RX.Tiempo_Bit[0] = 0;
RX.Tiempo_Bit[1] = 0;
RX.Estado = RX_Libre;
}
else
{
Parpadeo_led (4);
output_high (Led);
delay_ms(500);
}
}
else
{// Borro la memoria
output_high (Led);
while (input(Pulsador) == 1);
for (i=0;i<255;i++)
write_eeprom(i,0xFF);
Salto = 0;
Parpadeo_led (5);
output_high (Led);
}
output_high (Led);
enable_interrupts (int_rb);
}
// Rutina de lectura de código
switch (RX.Estado)
{
case RX_Ocupado:
{
RX.Bit = 0;
if (RX.Grabar == 1)
{
disable_interrupts (int_rb);
RX.Grabar = 0;
for (i=0;i<3;i++)
{
Aux = RX.Codigo[i];
write_eeprom(i+Salto,Aux);
}
Salto+=3;
write_eeprom(252,Salto);
Parpadeo_led (10);
output_high (Led);
RX.Estado = RX_Codigo_Error;
}
else
{
if (Salto != 0)
{
for (i=0;i<Salto;i+=3)
{
if (read_eeprom(0+i) == RX.Codigo[0])
{
if (read_eeprom(1+i) == RX.Codigo[1])
{
if (read_eeprom(2+i) == RX.Codigo[2])
{
RX.Estado = RX_Codigo_Ok;
i = Salto;
}
else
RX.Estado = RX_Codigo_Error;
}
else
RX.Estado = RX_Codigo_Error;
}
else
RX.Estado = RX_Codigo_Error;
}
}
else
RX.Estado = RX_Codigo_Error;
for (i=0;i<3;i++)
RX.Codigo[i] = 0;
}
}break;
case RX_Espacio_Tramas:
{
if (RX.Buscar_Tiempo_ET == False)
{
if (RX.Contador < 26)
{
if (RX.Tiempo_entre_tramas < RX.Aux_tiempo_entre_tramas)
RX.Tiempo_entre_tramas = RX.Aux_tiempo_entre_tramas;
}
else
{
RX.Tiempo_ET_delta_neg = RX.Tiempo_entre_tramas-Tolerancia;
RX.Tiempo_ET_delta_pos = RX.Tiempo_entre_tramas+Tolerancia;
RX.Contador = 0;
RX.Buscar_Tiempo_ET = True;
RX.Estado = RX_Libre;
}
}
else
{
if (RX.Contador < 26)
{
if ((RX.Tiempo_ET_delta_neg < RX.Aux_Tiempo_entre_tramas)&(RX.Aux_Tiempo_entre_tramas < RX.Tiempo_ET_delta_pos))
{
RX.Buscar_Tiempo_ET = False;
RX.Tiempo_Entre_Tramas = 0;
RX.Estado = RX_Contar_Bits;
}
}
else
RX.Estado = RX_Codigo_Error;
}
}break;
case RX_Contar_Bits:
{
if (RX.Contador_Bits < 26)
{
if ((RX.Tiempo_ET_delta_neg < RX.Tiempo_entre_tramas)&(RX.Tiempo_entre_tramas < RX.Tiempo_ET_delta_pos))
{
if ((RX.Contador_Bits == 13)|(RX.Contador_Bits == 25))
{
RX.Estado = RX_Medicion_Tiempo_Bits;
}
else
RX.Estado = RX_Codigo_Error;
}
}
else
RX.Estado = RX_Codigo_Error;
}break;
case RX_Medicion_Tiempo_Bits:
{
if ((RX.PulsoBajo > 0)&&(RX.PulsoAlto > 0))
{
if (RX.Tiempo_Bit[0] == 0)
RX.Tiempo_Bit[0] = RX.PulsoBajo + RX.PulsoAlto;
else
{
RX.Tiempo_Bit[1] = RX.PulsoBajo + RX.PulsoAlto;
if ((RX.Tiempo_Bit[0] < 5000)&&(RX.Tiempo_Bit[1] < 5000))
{
if (((RX.Tiempo_Bit[0] - Tolerancia) > RX.Tiempo_Bit[1])|(RX.Tiempo_Bit[1] > (RX.Tiempo_Bit[0] + Tolerancia)))
{
if (RX.Tiempo_Bit[1] < RX.Tiempo_Bit[0])
RX.Tiempo_Bit[0] = RX.Tiempo_Bit[0]/2;
else
RX.Tiempo_Bit[0] = RX.Tiempo_Bit[1]/2;
}
else
RX.Tiempo_Bit[0] = RX.Tiempo_Bit[0]/2;
RX.Contador = 0;
RX.Estado = RX_Sincronizar;
}
}
RX.PulsoBajo = 0;
RX.PulsoAlto = 0;
}
}break;
case RX_Sincronizar:
{
if (RX.Contador_Bits == 13)
{
if (RX.Contador == 22)
{
RX.Estado = RX_Decodificar;
RX.Contador = 0;
}
}
if (RX.Contador_Bits == 25)
{
if (RX.Contador == 46)
{
RX.Estado = RX_Decodificar;
RX.Contador = 0;
}
}
}break;
case RX_Decodificar:
{
if (RX.Nuevo_Bit == True)
{
RX.Nuevo_Bit = False;
if (RX.Contador < RX.Contador_Bits)
{
if (RX.Bit < 2000)
{
if (RX.Bit < RX.Tiempo_bit[0])
shift_left(RX.Codigo,3,1);
else
shift_left(RX.Codigo,3,0);
}
else
RX.Estado = RX_Codigo_Error;
}
else
{
RX.Estado = RX_Ocupado;
}
}
}break;
case RX_Codigo_Ok:
{
if (Activado == false)
Activado = true;
else
Activado = false;
RX.Estado = RX_Codigo_Error;
}break;
case RX_Codigo_Error:
{
if (RX.Grabar == 1)
{
RX.Grabar = 0;
Parpadeo_Led (2);
output_high (Led);
}
RX.Buscar_Tiempo_ET = False;
RX.Tiempo_ET_delta_neg = 0;
RX.Tiempo_ET_delta_pos = 0;
RX.Contador_Bits = 0;
RX.Tiempo_Bit[0] = 0;
RX.Tiempo_Bit[1] = 0;
RX.Estado = RX_Libre;
}break;
}
// Rutina de funcionamiento
if (Activado == true)
output_high (Led_Ok);
else
output_low (Led_Ok);
// Rutina de borrado de controles remotos
enable_interrupts (int_rb);
}
}
Hola Juanma, Estuve trabajando con estos códigos, y los que has pasado previamente. Estoy haciendo un proyecto para la facultad. Básicamente tengo que hacer una receptora para hacer funcionar un relé. En simulación funciona bastante bien, el tema es que en la placa que arme, a veces anda, a veces no. Mi emisor se basa en el HT12E. Trabajo con el PIC16f630 con un osc interno de 4M. al intentar compilar este código precisamente me sobran variables. Has podido avanzar en algo con esto?Hola frankko, te adjunto la ultima versión de código que tengo totalmente funcional. Lo que te paso es el código para registrar un código en la memoria eeprom del pic 16F684 para luego poder reconocerlo y asi poder activar/desactivar la salida. Como hice un recorte y pego, puede que tengas algunas variables de más dando vuelta, cualquier problema me avisas pegandome el log de los errores que te de al compilar. También te adjunto el esquemático para que sepas como van conectado las cosas. Para grabar el código lo que tenes que hacer es apretar el pulsador hasta que se apaga el led, cuando lo hace soltas el pulsador y precionas el botón del control a registrar (esto miestras el led está apagado), si lo toma y registra el led parpadeará unas 10 veces rápidamente, luego vuelve a prenderse. Después de eso ya podrás usar el receptor. Cualquier duda me avisa, saludos.
FE de erratas.
En la parte de código donde dice
If (Activacion==true)
{
If (input(salida)==0)
Salida=1;
Else
Salida=0;
}
En realidad tendría que ser
If (Activacion==true)
Salida=1;
Else
Salida=0;