Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

16/08/2017 #3121


banistelrroy dijo: Ver Mensaje
creo que es hora de migrar a proton.......
No te desalientes solo te falta perseverancia y seguir buscando las alternativas o soluciones que le encuentres.
Yo uso Proton por costumbre ya que lo hago desde hace bastante tiempo pero la herramienta no lo es todo en esto.
Debes ponerte en el "lugar" del micro controlador y realizar mentalmente los pasos uno a uno que tu mismo le propones con tu programa.
Revisa programas desarrollados por otros(incluyendo los de la ayuda de los compiladores) en la tematica para así tener otras miradas/alternativas de resolución del mismo problema de distinta forma y evalúa las ventajas y desventajas de hacerlo de esa forma u otra.
Saca tus propias conclusiones y prueba las. Tienes una herramienta invaluable que son los simuladores para tener una idea de por donde va la cosa sin quemar, romper, etc. nada.
Si un programa es complejo, divídelo en pequeñas rutinas y después trata de compatibilizarlas todas.
Recuerda que en realidad solo tu resolverás esto a lo que estas abocado, nosotros solo podemos aconsejarte en base a nuestros saberes.

Ric.
16/08/2017 #3122

Avatar de banistelrroy

Tienes razón gracias por el consejo
16/08/2017 #3123

Avatar de banistelrroy

hola antes de pasar a la codificacion manchester, quiero mostrarles el avance, pues el programa es para un control remoto a distancia, y la idea es que el microcontrolador solo este en trabajo o lo que quiero conseguir esque tenga consumo solo cuando este pulsada una tecla o mas de no haber nada pulsado los pic entres en modo sleep para ahorrar el consumo de labateria. antes de entrar a reposo en el programa principal el led parpadea 10 veces, de no haber nada pulsado durante esos 10 parpadeos intermitentes, los pic entran a sleep.

pues bien segui los consejos y use interrupciones en el trasmisor la del cambio de estado RBIE: RB Port Change Interrupt Enable bit junto con RBIF: RB Port Change Interrupt Flag bit, y en el receptor INTE: RB0/INT External Interrupt Enable bit y para ambos GIE: Global Interrupt Enable bit, el tema es que sin sleep funciona bien y con el sleep no funciona como debe de ser, aver si aqui me dan una ayuda porfabor.

Pregunta: tiene algo que ver los pines usados para el RX en el receptor ya que antes usaba RB1/RX ahora uso RB0/INT para poder usar la interrupcion al recepcionar un cualquier dato.
Archivos Adjuntos
Tipo de Archivo: rar RF 4 bits probado_2.rar (84,2 KB (Kilobytes), 11 visitas)
17/08/2017 #3124

Avatar de banistelrroy

Bueno, a todos quiero decirles que les presento un programa de comunicación RF de 4 bits, usando 2 PIC16F628A, uno como transmisor y otro como receptor.

En la simulación la conexión es de pic a pic, pero físicamente hay una interfaz con módulos rf para hacer la trasmisión inalámbrica.

¿Alguien puede revisar el código y dar sugerencias si el código es muy extenso, redundante o se tiene que mejorar?

El código lo realicé en Microcode Studio, la simulación en proteus y lo hice siguiendo mi criterio, agregando unas sugerencias de colaboradores de este foro.

El funcionamiento que se quiere y que aparentemente se consiguió, queda así:
  1. El proyecto es de control a distancia de 4 pulsadores.
  2. Cualquier botón pulsado. 1, 2 o los 4 se verá en el receptor.
  3. Se usarán baterías recargables de 9V, por lo que es importante el consumo del circuito.
  4. Cuando no se esté pulsando ningún botón, ambos circuitos deberán estar dormidos modo sleep o similar.
  5. Se usan interrupciones, tanto en el emisor, como en el receptor.
  6. Existen 1 led en el trasmisor que parpadea por lapso de tiempo al encender el circuito y después de del envío del último dato, para luego pasar a bajo consumo. Igual en el receptor
¿Si alguien pudiera revisar y decirme alguna sugerencia para mejorar el proyecto?
Adjunto los archivos necesarios

Programa transmisor :
Código PHP:
include "modedefs.bas"
DEFINE OSC 4
CMCON 
;convierte en digitales el puerto A

trisb.4 
1
trisb.5 
1
trisb.6 
1
trisb.7 
1
led_rojo 
var portb.3
botona 
var portb.4
botonb 
var portb.5
botonc 
var portb.6
botond 
var portb.7
flat1 
var bit
flat2 
var bit
flat3 
var bit
flat4 
var bit
var byte
var byte
numero 
var byte

on interrupt 
goto inicio
INTCON 
= %10001000
numero 
0

programa
:
for 
1 to 100
low led_rojo
next
for 1 to 100
high led_rojo
next
numero 
numero +1
if numero 250 then
sleep 5
endif
goto 
programa

inicio
:
disable
if botona=0 then 
gosub led1_on
flat1 
1
else
gosub led1_ofF
flat1 
0
endif

if 
botonb=0 then 
gosub led2_on
flat2 
1
else
gosub led2_ofF
flat2 
0
endif

if 
botonc=0 then 
gosub led3_on
flat3 
1
else
gosub led3_ofF
flat3 
0
endif

if 
botond=0 then 
gosub led4_on
flat4 
1
else
gosub led4_ofF
flat4 
0
endif

if 
flat1 flat2=and flat3 flat4=0 then programa2
high led_rojo
goto inicio

led1_on
:
serout portb.2,n2400,[$FF,$FF,"OK","A"]
return
led1_off:
serout portb.2,n2400,[$FF,$FF,"OK","B"]
return
led2_on:
serout portb.2,n2400,[$FF,$FF,"OK","C"]
return
led2_off:
serout portb.2,n2400,[$FF,$FF,"OK","D"]
return

led3_on:
serout portb.2,n2400,[$FF,$FF,"OK","E"]
return
led3_off:
serout portb.2,n2400,[$FF,$FF,"OK","F"]
return
led4_on:
serout portb.2,n2400,[$FF,$FF,"OK","G"]
return
led4_off:
serout portb.2,n2400,[$FF,$FF,"OK","H"]
return
GOTO 
INICIO

programa2
:
INTCON = %10001000
resume
enable

end 
Programa del receptor:
Código PHP:
include "modedefs.bas"
DEFINE OSC 4
datos 
var byte
led_1 
var portb.1
led_2 
var portb.2
led_3 
var portb.3
led_4 
var portb.4
led_rojo 
var portb.6
flat1 
var byte
flat2 
var byte
flat3 
var byte
flat4 
var byte
var byte
var byte
numero 
var byte

on interrupt 
goto lop
INTCON 
= %10010000
numero 
0

programa
:
for 
1 to 100
low led_rojo
next
for 1 to 100
high led_rojo
next
numero 
numero +1
if numero 250 then
sleep 5
endif
goto 
programa

disable
Lop
:
serin portb.0,n2400,["OK"],datos

If datos="A" then
flat1
=1
endif 
if 
datos="B" then 
flat1
=0
endif

If 
datos="C" then
flat2
=1
endif 
if 
datos="D" then 
flat2
=0
endif

If 
datos="E" then
flat3
=1
endif
if 
datos="F" then 
flat3
=0
endif

If 
datos="G" then
flat4
=1
endif
if 
datos="H" then 
flat4
=0
endif

if 
flat1=1 then low led_1
if flat1=0 then high led_1
if flat2=1 then low led_2
if flat2=0 then high led_2
if flat3=1 then low led_3
if flat3=0 then high led_3
if flat4=1 then low led_4
if flat4=0 then high led_4
if flat1 flat2=and flat3 flat4=0 then programa2
high led_rojo
goto Lop
programa2
:
INTCON = %10010000
resume
enable
end 
Archivos Adjuntos
Tipo de Archivo: rar RF 4 bits probando_2.rar (123,4 KB (Kilobytes), 4 visitas)
17/08/2017 #3125


banistelrroy dijo: Ver Mensaje
hola antes de pasar a la codificacion manchester, quiero mostrarles el avance, pues el programa es para un control remoto a distancia, y la idea es que el microcontrolador solo este en trabajo o lo que quiero conseguir esque tenga consumo solo cuando este pulsada una tecla o mas de no haber nada pulsado los pic entres en modo sleep para ahorrar el consumo de labateria. antes de entrar a reposo en el programa principal el led parpadea 10 veces, de no haber nada pulsado durante esos 10 parpadeos intermitentes, los pic entran a sleep.

pues bien segui los consejos y use interrupciones en el trasmisor la del cambio de estado RBIE: RB Port Change Interrupt Enable bit junto con RBIF: RB Port Change Interrupt Flag bit, y en el receptor INTE: RB0/INT External Interrupt Enable bit y para ambos GIE: Global Interrupt Enable bit, el tema es que sin sleep funciona bien y con el sleep no funciona como debe de ser, aver si aqui me dan una ayuda porfabor.

Pregunta: tiene algo que ver los pines usados para el RX en el receptor ya que antes usaba RB1/RX ahora uso RB0/INT para poder usar la interrupcion al recepcionar un cualquier dato.

Te envió los archivos para simular en proteus los módulos de RF
Archivos Adjuntos
Tipo de Archivo: rar MODULO RF(PROTEUS).rar (3,5 KB (Kilobytes), 9 visitas)
17/08/2017 #3126

Avatar de banistelrroy

gracias astroloco
17/08/2017 #3127

Avatar de banistelrroy

lo probe fisicamente y me doy con la sorpresa que la rutina programa en ambos pic tiene la misma logica que corresponden al parpadeo del led en simulacion duran lo mismo pero fisicamente el receptor dura mas y al volver de la rutina dura menos al parecer solo trasmisor trabaja correctamente, necesito una mano
21/08/2017 #3128


banistelrroy dijo: Ver Mensaje
lo probe fisicamente y me doy con la sorpresa que la rutina programa en ambos pic tiene la misma logica que corresponden al parpadeo del led en simulacion duran lo mismo pero fisicamente el receptor dura mas y al volver de la rutina dura menos al parecer solo trasmisor trabaja correctamente, necesito una mano
Hola en el programa del receptor te falta habilitar el bit6 del registro INTCON, el bit7 activa interrupciones globales, el bit6 activa las interrupciones externas, si no activas el bit6 no funcionara las interrupciones externas. El bit 1 de INTCON es el indicador de interrupción externa en RB0, al a ver una interrupción se ponen alto. Hay que que volver a poner en bajo a tras de software.
22/08/2017 #3129

Avatar de banistelrroy

entonces al inicio quedaria mas o menos asi:

on interrupt goto programa_2
INTCON = %11010000

programa_1:
..................
..................
goto programa_1


disable
programa_2:
.......................
.......................
......................
INTCON = %11010010
disable
resume
23/08/2017 #3130


banistelrroy dijo: Ver Mensaje
entonces al inicio quedaria mas o menos asi:

on interrupt goto programa_2
INTCON = %11010000

programa_1:
..................
..................
goto programa_1


disable
programa_2:
.......................
.......................
......................
INTCON = %11010010
disable
resume
Hola, debe ir asi INTCON = %11010000, ya el bit7 activa interrupciones globales, el bit6 activa interrupciones externas, el bit 4 activa interrupciones por RB0, el detalle seria que el bit1 es el indicador de interrupción externa en RB0, no lo debes tu poner en 1, el bit1 se ponen el solo en alto cuando detecta una interrupción en RB0, lo que necesitas hacer tú sería,es volver a poner a bajo el bit1, para que pueda volver al detectar otra interrupción volver a poner ese en alto.

seria algo asi



programa_2:

Disable ; Desactivar interrupciones.

If INTCON.1 = 1 Then INTCON.1 = 0 ;si el bit.1 de INTCON está en uno, ponerlo a cero

Resume ; Retornar al programa

Enable ; Volver a activar interrupciones.

De este modo vuelve a quedar listo para recibir otra interrupción por RB0
24/08/2017 #3131

Avatar de banistelrroy

muchachos saben como puedo declarar para hacer el envio del resultado de una variable, ya sea en binario decimal o hexadecimal.

ejemplo: tengo declarado esto

numero var byte
NUMERO1 VAR BYTE
NUMERO2 VAR BYTE
NUMERO3 VAR BYTE
NUMERO4 VAR BYTE
-----------------------------
-----------------------------
-----------------------------
-----------------------------
despues de toda la logica me queda:
numero = NUMERO1 + NUMERO2 + NUMERO3 + NUMERO4

estoy tratando de enviar asi:

serout portb.2,n2400,["numero"]

pero nunca logro que llegue el dato, en cambio si envio una letra cualquiera llega.
25/08/2017 #3132
Moderador

Avatar de D@rkbytes

¿Y con qué y cómo recibes el dato?
Si dato es superior a 255 no lo podrás ver completo, necesitas separarlo y enviar MSB y LSB
En RS-232 nada más puedes enviar un Byte, o sea, de 0 a 255.
Y también es importante la forma en que se envía, porque no es lo mismo enviarlo como texto usando Dec, que enviarlo en ASCII. O sea, enviarlo directamente sin conversiones.

Así que... Aunque el dato se envié, nunca lo verás en una interfaz común.
25/08/2017 #3133

Avatar de banistelrroy

El dato es el resultado de una variable del tamaño byte pero quiero saber la forma de enviar en decimal binario o hexa osea si el dato fuera 15 como lo enviaría
25/08/2017 #3134
Moderador

Avatar de D@rkbytes

Envíalo sin formato, ya después de recibirlo le puedes dar el formato quieras.
Por ejemplo, caso 1 sin formato:
Código PHP:
    If PORTA.2 0 Then
        Numero 
50
        SerOut PORTB.2
T9600, [Numero]
        
        While 
PORTA.2 0Wend
    
    
EndIf 
Verás lo siguiente:

O sea, un 2, que corresponde al decimal 50 de la tabla ASCII.
Eso es enviar un número sin formato y de esa forma habrá números que no se podrán ver si la interfaz va a mostrar lo que reciba cómo texto.

Caso 2, con formato:
Código PHP:
    If PORTA.2 0 Then
        Numero 
50
        SerOut PORTB.2
T9600, [#Numero]
        
        
While PORTA.2 0Wend
    
    
EndIf 

Aquí ya se ve el número 50, pero se enviaron dos bytes, porque fue enviado cómo texto.
Así que todo depende de la forma en que se manden e interpreten los datos.

No es nada complicado, pero muchas personas batallan con esto.

Edit: Si le quieres dar otro formato, PBP tiene instrucciones para eso.
Por ejemplo: SerOut2 PORTB.2, T9600, [Hex Numero]
O por Hardware: HSerOut [Hex Numero]
Pero por hardware, ya se tiene que configurar el módulo USART.
Con algo así por ejemplo:
Código PHP:
    Configuración USART: (9600 Bps 4 MHz9615 Bps Reales 0.16de error.)
    
SPBRG =    25    00011001
    TXSTA 
=    36    00100100
    RCSTA 
=    144   10010000 
A mi en lo personal me gusta usar los registros directamente, pero PBP tiene sus declaraciones.
Imágenes Adjuntas
Tipo de Archivo: jpg Caso 1.jpg (136,4 KB (Kilobytes), 115 visitas)
Tipo de Archivo: jpg Caso 2.jpg (137,1 KB (Kilobytes), 115 visitas)
26/08/2017 #3135

Avatar de banistelrroy

Ok entendido todo claro
30/08/2017 #3136

Avatar de banistelrroy

Buenas a todos, despues de tantas pruebas y batallar con la comunicacion rf con pic, obtuve muchas resultados y la mayoria no era lo que esperaba, se torna tedioso al trabajar con modulos rf y el pic, devido a que existe mucho ruido electrico en el ambiente señales de radio, etc que hicieron que el pic actue de forma erronea, segui los consejos y obtuve mejores resultados pero aun con error.

PRUEBAS Y RESULTADOS:

1. se establecio la conexion entre los 2 pic: TX usando las instrucciones SERIN, enviando datos todo el tiempo mientres se pulse o no, esto debido a que si se apaga el trasmisor el receptor se queda en 0 por mucho tiempo e ingresan datos erroneos.
2.con ambos circuitos TX/RX enlazados siempre, al cabo de unas horas el receptor recibe algun codigo producto del ruido lo cual activa las salidas cualquiera, sin aver enviado ningun dato.

lo que me llevo a deducir que aun sigue el ruido y confunde al pic e interpreta codigo y se queda enganchado con salidas activadas.

Ahora se que necesariamente tengo que codificar los datos a enviar y una de esas codificacion es manchester,que segun la teoria funcionaria asi:

dato = 17, sus equivalencias
decimal = 17
binario = 0001 0001
manchester=01010110 01010110

navegando por la red encontre un ejemplo de comunicacion rf con codificacion manchester, encontre una rutina para la codificacion:

Variables declaradas:


S_Byte Var Byte
D VAR BYTE
I var byte
ENCODED VAR WORD
ENCODED_LOW VAR ENCODED.LOWBYTE
ENCODED_H VAR ENCODED.HIGHBYTE
DECODED VAR BYTE
.............................................
............................................
.............................................

MAN_ENCODING:
FOR D = 0 TO 7
IF S_BYTE.0[D] = 0 THEN
ENCODED.0[D*2] = 0
ENCODED.0[D*2+1] = 1
ELSE
ENCODED.0[D*2] = 1
ENCODED.0[D*2+1] = 0
ENDIF
next D
return

El problema es que me da el resultado invertido po ejemplo en :
ENCODED_H: me queda asi 10101001
ENCODED_LOW: me queda asi 10101001

El codigo queda en 2 BYTES: BYTELOW y BYTEHIGH

no entiendo el motivo del resultado invertido ya que tenia realizar opearciones con la codificacion tal y como debe de ser.
31/08/2017 #3137
Moderador

Avatar de D@rkbytes

Dejo un ejemplo de codificación y decodificación Manchester.
En el receptor o decodificador existe un bug al cual no le encontré el motivo, pero si solución.
Lo dejo comentado en el código, tal vez alguien pueda encontrar el error.
Archivos Adjuntos
Tipo de Archivo: rar 16F628A Manchester CODEC.rar (63,4 KB (Kilobytes), 16 visitas)
31/08/2017 #3138

Avatar de roberttorres

D@rkbytes dijo: Ver Mensaje
Dejo un ejemplo de codificación y decodificación Manchester.
En el receptor o decodificador existe un bug al cual no le encontré el motivo, pero si solución.
Lo dejo comentado en el código, tal vez alguien pueda encontrar el error.
Buenas
En el receptor cuando comparas la variable Dato(tipo word) = $BB sin el 1 sencillamente no hace la comparación, pero si creas otra variable por ejemplo:
Comparar var byte
comparar = Dato
if comparar = $BB then portb.4 = 1, en ese caso si funciona, ahora no se porque al comparar una variable tipo word no funciona y si lo hace con una variable tipo byte(solo soy un hobbista).

PD: también dejo un ejemplo que encontré en el foro de picbasic con algunas modificaciones que hice, pero no lo probé en físico:
Archivos Adjuntos
Tipo de Archivo: rar RF pbp Manchester.rar (99,0 KB (Kilobytes), 12 visitas)
01/09/2017 #3139

Avatar de banistelrroy

roberttorres tus librerias de los modulos rf no funcionan tiene que estar conectado directo el tx - rx
02/09/2017 #3140

Avatar de banistelrroy

En físico tampoco funciona no cimunica
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.