PIC12F675 y módulo de R.F, no recibe datos

Yo hice ese proyecto y funciona muy bien. Use pic 12f675 TX y un entrenador con PIC16F88 como RX, aunque se puede usar también otro 12f675 como RX. El lenguaje es PROTON , pero no utilice ninguna interrupción.

Le puse antena de 16cm a los modulos de RF y el alcance a campo abierto es de unos 80 mts. Ahora intento enviar datos flotantes para hacer un termómetro inalambrico.

Saludos.

Hola amigos.. alguna novedad sobre el Termometro inalambrico que comenta el compañero Gerson
es justo lo que estoy necesitando
saludoos



Estoy trabajando en mi proyecto final para Mecatronica y este se trata de un sensor inalambrico por RF..!!
en el cual utilizo un LM35 , 2 PIC 16F877a , una pantalla LCD 16x2 y los modulos RF 418 MHz.
 
Última edición:
Hola amigos.. alguna novedad sobre el Termometro inalambrico que comenta el compañero Gerson
es justo lo que estoy necesitando
saludoos



Estoy trabajando en mi proyecto final para Mecatronica y este se trata de un sensor inalambrico por RF..!!
en el cual utilizo un LM35 , 2 PIC 16F877a , una pantalla LCD 16x2 y los modulos RF 418 MHz.

¿Y puedes mostrar lo que has hecho hasta ahora?.
 
Hola Gerson.. gracias por responder!!

El proyecto es algo simple.

TRANSMISOR
Con un sensor LM35 mido la temperatura ambiente, este esta conectado a una entrada analogica del ADC del PIC 16F877a, luego envio los datos de manera serial al modulo RF TX.

RECEPTOR
El modulo RF RX recibe la transmision, aqui el segundo PIC 16F877a recibe los datos y completa el acondicionado de las variables de lectura e imprime la temperatura sensada en una pantalla LCD 16x2. Tambien se incluye el control de un rango de trabajo manipulando 2 salidas del puerto B, las cuales se conectan y simulan con un LED ROJO y un LED AZUL para subir o bajar la temperatura segun lo requieran los limites definidos en el rango.

Hasta el momento he avanzando al punto de hacer funcionar el proyecto pero transmitiendo mediante un cable, al conectar los modulos RF la lectura toma valores aleatorios.

Segun entiendo esto se soluciona con la programacion adecuada de la transmision serial (lo que he hecho es muy basico) donde me estaria faltando implementar un encabezado para una lectura correcta del RX y un protocolo de comunicacion. En este punto seria donde necesito ayuda y alguno consejos ya que me ha costado un poco la codificacion de ellos.

P/D. Es una condicion del Profesor realizar la programacion en Proton IDE

A continuacion dejo los programas que he elaborado e imagen del circuito en Proteus con los cuales he logrado que funcione la transmicion mediante un cable tanto en la simulacion como en la protoboard.

vengo trabajando hace un tiempo en el proyecto y aqui estoy algo estancado.. jeje
Desde ya agradezco cualquier ayuda ya que no soy experto en el tema.

Mi nombre es Alejandro.. Saludos amigos!!

TRANSMISOR

Código:
Device = 16F877A                'DESIGNAMOS EL PIC A USAR
Xtal = 4                        'CRYSTAL A USAR
    
        'PARAMETROS DEL ADC
    
Declare Adin_Res = 10           '10-BITS DE RESOLUCION.
Declare Adin_Tad = FRC          'RC OSC ELEGIDO
Declare Adin_Stime = 50         'TIEMPO DE MUESTREO CADA 50 uS

        'CONFIGURACION DEL PUERTO SE COMUNICACION SERIAL
        
Hserial_Baud = 2400         ' VELOCIDAD DE SISTEMA A 2400 BAUDIOS
Hserial_RCSTA = %10010000   ' HABILITAR LA RECEPCION CONTINUA
Hserial_TXSTA = %00100000   ' PERMITE TRANSMITIR Y MODO ASINCRONO 
Hserial_Clear = On          ' BORRA EL BUFFER ANTES DE RECIBIR

        'DEFINO PUERTOS 

TRISA.0 = 1                      'PIN A0 COMO ENTRADA
TRISC = 0                        'PUERTO C COMO SALIDA
TRISC.6 = 0                      'PIN C6 COMO SALIDA TX
ADCON1 = %10000000               'DEFINO LA ENTRADA ANALOGICA

Clear PORTA                     'LIMPIA EL PUERTO A
Clear PORTB                     'LIMPIA EL PUERTO B
Clear PORTC                     'LIMPIA EL PUERTO C
Clear PORTD                     'LIMPIA EL PUERTO D
Clear PORTE                     'LIMPIA EL PUERTO E

        'DECLARO VARIABLES Y ALIAS
        
Dim MEDICION As Word     

DelayMS 10

INICIO:
         
        MEDICION = ADIn 0       'LECTURA DE LA ENTRADA ANALOGICA 
        DelayMS 100
                     
        HSerOut [MEDICION]      'ENVIO DATOS    
        DelayMS 100
                
GoTo INICIO

End


RECEPTOR

Código:
Device = 16F877A                'DESIGNAMOS EL PIC A USAR
Xtal = 4                        'CRYSTAL A USAR
    
        'DECLARACION DEL LCD
        
Declare LCD_Type 0              'DECLARAR TIPO DE LCD ALFANUMERICO.
Declare LCD_DTPin PORTD.4       'DECLARAR EL CONTROL EN PINES D4; D5; D6; D7.
Declare LCD_RSPin PORTD.0       'DECLARAR RS EN PIN D0.
Declare LCD_ENPin PORTD.1       'DECLARAR E EN PIN D1.
Declare LCD_Interface 4         'INTERFAZ DE 4 LINEAS 
Declare LCD_Lines 2             '2 LINEAS DE ESCRITURA DEL LDC

        'CONFIGURACION DEL PUERTO SE COMUNICACION SERIAL

Hserial_Baud = 2400         ' VELOCIDAD DE SISTEMA A 2400 BAUDIOS
Hserial_RCSTA = %10010000   ' HABILITAR LA RECEPCION CONTINUA
Hserial_TXSTA = %00100000   ' PERMITE TRANSMITIR Y MODO ASINCRONO 
Hserial_Clear = On          ' BORRA EL BUFFER ANTES DE RECIBIR

         'DEFINO PUERTOS 

TRISB = 0                        'PUERTO B COMO SALIDAS
TRISD = 0                        'PUERTO D COMO SALIDAS
TRISC.7 = 1                      'PIN C.7 COMO ENTRADA RX

Clear PORTA                     'LIMPIA EL PUERTO A
Clear PORTB                     'LIMPIA EL PUERTO B
Clear PORTC                     'LIMPIA EL PUERTO C
Clear PORTD                     'LIMPIA EL PUERTO D
Clear PORTE                     'LIMPIA EL PUERTO E
        
        'DECLARO VARIABLES Y ALIAS

Dim MEDICION As Word        
Dim TEMP As Float 
 
Symbol BLUE = PORTB.2
Symbol RED = PORTB.1

Print 254,64,%00000110,%00001001,%00001001,%00000110,0,0 ,0,0   'DETERMINO EL SIMBOLO GRADOS   


Cls                                'LIMPIO LCD

        'TEXTO DE PRESENTACION 

      Print At 1,1,"    PROYECTO    "    'PRIMERA FILA (MAXIMO DE LETRAS 16)
      Print At 2,1,"  MECATRONICO   "    'SEGUNDA FILA (MAXIMO DE LETRAS 16)
      DelayMS 2000

      Cls                                
      DelayMS 500
      
      Print At 1,1,"   CONTROL DE   "
      Print At 2,1,"   TEMPERATURA  "
      DelayMS 2000

      Cls
      DelayMS 500
     
INICIO:
        HSerIn [MEDICION]                   'RECIBE DATOS RS 232
        
        TEMP = MEDICION * 5/1024            'ACONDICIONADO DE LAS VARIABLES
        TEMP = TEMP * 100

        Print At 1,1, "   TEMPERATURA  "    'IMPRIME TEXTO BASE
        Print At 2,1, "ACTUAL"

                    
        Print At 2,8,Dec1,TEMP,0            'IMPRIME VALOR ACONDICIONADO DE LA MEDICION
        Print "C" 
        
        If TEMP <= 25 Then                  'RANGO PARA EL CONTROL DE TEMPERATURA ENTRE 25 Y 30 GRADOS
        
            RED = 1  
            BLUE = 0
            
        End If
      
        If TEMP > 25 And TEMP < 30 Then
        
            RED = 0
            BLUE = 0
            
        End If
     
        If TEMP >= 30 Then
        
            RED = 0
            BLUE = 1
     
        End If 
        
        DelayMS 1000 
        
        
GoTo INICIO

End

--espero haber etiquetado bien los codigos jaja--
 

Adjuntos

  • Proteus.jpg
    Proteus.jpg
    207.3 KB · Visitas: 20
Hola de nuevo Gerson..

Si, me faltaban los FUSES. Asique me puse a investigar y estudiar los mismos ya que mi conocimiento sobre ellos era muy pobre. Investigue en internet, revise la hoja de datos, el manual de proton y traduje algunos fragmentos, que estan en el PDF que adjunto abajo.!!

Los configure igual en ambos PIC de la siguiente manera.

Código:
Device = 16F877A                'DESIGNAMOS EL PIC A USAR
Xtal = 4                        'CRYSTAL A USAR

Config XT_OSC, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF, CPD_OFF, DEBUG_OFF, CP_OFF 'DEFINIMOS FUSES

En la simulacion funciona bien pero sigo sin tener buenos resultados en el circuito fisico, la lectura varia mucho.

Mi interpretacion del defecto (que cito abajo) en el programa es correcto??
Segun entiendo esto se soluciona con la programacion adecuada de la transmision serial (lo que he hecho es muy basico) donde me estaria faltando implementar un encabezado para una lectura correcta del RX y un protocolo de comunicacion. En este punto seria donde necesito ayuda y alguno consejos ya que me ha costado un poco la codificacion de ellos.
O deberia buscar solucionarlo desde otro aspecto??

Abajo adjunto un PDF con informacion basica sobre los FUSES (BITS DE CONFIGURACION) del PIC16F877a y su configuracion en PROTON IDE. Por si le sirve de ayuda a algun colega.!!

Desde ya Gracias por la ayuda brindada..!!
 

Adjuntos

  • FUSES-BITS DE CONFIGURACION PIC16F877a.pdf
    464.5 KB · Visitas: 13
Hay varias cosas....la temperatura no cambia tanto cada 200ms(salvo usos muy específicos pero yo no usaría el LM35 para eso habiendo sensores digitales como el DS18B20) por los que puedes tomar mas de una medición y enviar el valor sumado o hacer el promedio en emisor y enviar este.
Si no quieres medir cualquier cosa, las conexiones entre el LM35 y el micro controlador debe estar lo mas cerca posible para evitar "antenas" que capten interferencias electromagnéticas de todo tipo.
Saludos.

Ric.
 
En la simulación funciona bien pero sigo sin tener buenos resultados en el circuito físico, la lectura varia mucho.
Eso es por el ruido que recibe el módulo receptor.
Por eso durante el tema se ha hablado de usar una codificación y se trató el algoritmo Manchester.
Hace poco subí un ejemplo en PICBasic, el cual fácilmente podrás migrar a Proton Basic.
Manchester CODEC
 
Lo que yo haria es:

1- Usar un amplificador operacional en modo seguidor de tensión, entre el LM35 y el PIC.
2- En el programa del transmisor haria un promedio de las lecturas del ADC y toda la matemática, para enviar solo el resultado al receptor.
3- Para enviar usaría (ejemplo): RSOut "wolfbitt",Dec MEDICION en donde wolfbitt seria la "codificación".
4- Para recibir usaría (ejemplo): RSIn Wait("wolfbitt"),Dec MEDICION
5- Usar condensadores de desacoplo (100nf) en cada PIC, modulo de RF y LM35, lo mas cerca de la alimentación.

Así lo he hecho y siempre ha funcionado. ¡Buena suerte!.
 
Hola de nuevo, amigos. Aquí sigo en la búsqueda de hacer funcionar mi termómetro.

Muchas gracias a todos por sus consejos, gracias a cada uno de ellos voy avanzando un paso mas y aprendiendo muchísimo.

La precisión del proyecto no es muy importante ya que es de tipo didáctico, así que supongo que el LM35 funcionara bien.

En cuanto a la Codificación Manchester, he estado leyendo, aprendiendo sobre ella e incluso la implementé en uno de los ejemplos y funciona muy bien, luego la subiré.

Abajo adjunto un PDF que descargué de aquí mismo pero traducido.
Codificación Manchester usando RS232
Como verán, no se me da muy bien el inglés y debo traducir todo. jejeje.

También he implementado los condensadores de desacoplo.

Ahora me surge otra pregunta y es sobre el uso de Rsout y Rsin.

Según encontré y entiendo que estas funciones necesitan que el WATCHDOG esté activado para funcionar.

Entonces al definir los FUSES, el problema: Si lo activo WDT_ON el dispositivo se reinicia constantemente.
Pero si no activo el WDT_OFF, las directivas Rsout y Rsin no funcionan, no se comunican.

¿Me podrían explicar el modo en el configurar estas directivas?

Como siempre, muchísimas gracias por su ayuda, amigos.

Saludos.
 

Adjuntos

  • Codificacion Manchester usando RS232.pdf
    223.3 KB · Visitas: 20
Última edición por un moderador:
Ahora me surge otra pregunta y es sobre el uso de Rsout y Rsin.

Según encontré y entiendo que estas funciones necesitan que el WATCHDOG esté activado para funcionar.

Entonces al definir los FUSES, el problema: Si lo activo WDT_ON el dispositivo se reinicia constantemente.
Pero si no activo el WDT_OFF, las directivas Rsout y Rsin no funcionan, no se comunican.
Saludos.

En mi caso funciona bien sin el WDT_ON. Hay que hacer algunas declaraciones para que funcione correctamente. Consulta el manual de PROTON; es lo que yo hago. ;)
 
Necesitas tener el WDT_OFF y no se para que usas el comando Rsin o Rsout(comunicación serie por software) si tienes un PIC con hardware para hacer Hrsin y Hrsout y ya estas usando los pines donde esta.
Recuerda que la ayuda que trae el "Proton" es tu mejor amiga!!!.
Saludos.

Ric.
 
Gracias por responder amigos..!!

He estado leyendo y estudiando sobre comunicacion serial por software y por hardware.. Con ello sigo en mi camino de aprendizaje..!! jeje
Desde luego siempre tengo en mano el manual de Proton y la hoja de datos de Pic.. Pero hay algunas cosas que me cuesta entenderlas, pero bueno, asi se aprende mas!!

Ahora queria contarles sobre algo muy extraño con mi trabajo..!!

Realice varias pruebas con distintos programas en los cuales incluyo Codificacion Manchester y encabezados en los envios!!

Al no incluir un encabezado las lecturas toman valores aleatorios, pero si lo hago la pantalla LCD se queda en blanco(no hay lectura), aqui es donde viene lo extraño para mi, cuando desconecto el emisor TX (lo des-energizo) en la pantalla LCD se muestra un valor exacto de temperatura ambiente, he realizado esto varias veces y corroborado con un multimetro..!!

P/D: las pruebas son en serie mediante un cable.

No comprendo porque se envia correctamente solo al "apagar" en emisor.
Las conclusiones que saco de esto son:
- La configuracion y matematica del ADC es correcta, pues en el momento que se logra enviar se lee un valor totalmente valido de temperatura.
- La Codificacion Manchester es correcta tambien, la probe individualmente y funciona (si no lo fuese el valor de temperatura se veria modificado).
- El encabezado cumple su función de filtrado, evita las lecturas erroneas hasta que llega el valor correcto y luego muestra un valor valido de Temperatura.

Lo que no comprendo es porque solo sucede esto al apagar el circuito emisor.. pienso que es algo simple pero vital..!!

He revisado toda mi programacion, Fuses, Declares de comunicacion Serial, comandos y directivas usadas. Pero aun sigo sin corregir ese defecto ni comprender porque sucede.

P/D: Supuse que podia estar dañado el Cristal pero lo remplace con uno de repuesto y nada..!!

Espero que alguien pueda brindarme algo de luz y orientarme hacia que aspecto enfocarme..!!

Como siempre Muchisimas Gracias por cualquier ayuda o consejo!!

Saludos Colegas
 
Atrás
Arriba