desktop

Curso de programación de PIC en PICBasic Pro

Hola...Aunque no es un ejemplo de PBP ya que no lo tengo instalado, es en Proton Basic.
Enciende un led después de 100 mili segundos y cuando cualquiera de los botones del puerto B desde 4 a 7 cambie de estado(de alto a bajo o de bajo a alto) durante 1 segundo lo mantiene encendido para después mandar a dormir al micro controlador hasta que ocurra el próximo cambio de estado en dichos pines.
No lo probé en físico pero en el simulador funciona y a fin de tener una ejemplo(era lo que buscabas) te servirá.
Saludos.

Ric.
 

Adjuntos

  • TestSleep.rar
    142 KB · Visitas: 42
gracias, si lo estoy haciendo sabia que mi programa estaba muy mal elaborado es uno de los primeros que realizo siguiendo mi propio criterio, es muy dificil para mi ya tengo problemas con el ingles estoy leendo el manual y tratando de entender como activar las interrupciones usar la interrupcion RCIE: USART Receive Interrupt Enable bit, y la otra TXIE: USART Transmit Interrupt Enable bit, del registro PIE, voy realizar la activacion, hacer la declaracion en microcode, y tratar de acomodar el programa, para este en reposo el RX/TX cuando no se este pulsando nada, y que solo trasmita cuando se pulse cualquiera de las 4 entradas.

El tema del alto consumo tambien creo que pasa por usar el regulador 7805 con bateria de 9V, mucha enerjia se pierde en calor, optare por usar los modulos reguladores de voltaje step down, no se si sera la mejor opcion.
 
Última edición:
Si continuas así, vas por muy buen camino. Porque usar las interrupciones es algo imprescindible.
Mejoran bastante el desempeño de un programa.

En cuanto al consumo de un PIC, es mínimo, lo que consume energía son los dispositivos que controla.
Y puedes controlar cargas de la potencia que requieras. (Previa Interfaz)
Un PIC puede funcionar correctamente con un regulador 78L05 (100 mA Max)
Pero lo que debes ver, es el consumo externo requerido y optar por una fuente de poder bien diseñada.
Puede ser, Step-Up "Boost Converter" o Step-Down "Buck Converter"
Ambos métodos son aceptables y son mucho mejor que una fuente de poder con transformador.
Reducen tamaño y consumo, por ende, mejor rendimiento. Y si es Off-Line, mejor, pero depende el tipo de sistema.
 
el problema fue que el programa como esta lo deje conectado un dia entero en el receptor solo tengo leds conectados, pero durante el dia no pulse nada y la bateria de 9v recargable se me descargo en un solo dia, lo cual me parece que es muy poco tiempo. Estoy usando bateria recargable de 9v en trasmisor y receptor igual. teniendo en cuenta lo que dices en cuanto al consumo del pic es muy poco no entiendo porque me duro tan poco la bateria.
 
consulta talves sea elemental para ustedes pero a mi esta dando unos problemas esta duda:

realizando el codigo del pic en microcode studio especificamente del 16F628A.
1. Sino hago uso del las declaraciones de los puertos para que sean entradas ni saldidas en los 2 puertos
osea no hago uso de TRISA ni TRISB como lo asume el programa.
2.Si declaro TRISB = %00000000 enque estado se pone los pines que no se les programa tarea alguna, osea que quedaran libres.
3.Los pines libres como es combeniente dejarlos, en cuanto a consumo, ruidos, interferencias o falsos.
 
Al usar las instrucciones TRISX = %00000000 (Todo el puerto será configurado como salidas)
Y con TRISX = %11111111 (Todo el puerto será configurado como entradas)
Un 1 establece entrada y un 0, salida.

El valor que tomen si no se establece alguno, se puede ver en la hoja de datos, y se da en el POR (Power On Reset)

Ahora, cuando se usan las instrucciones Low Pin y High Pin, no tiene caso hacer uso de TRIS.
Porque esas instrucciones hacen al pin indicado, salida.

PD: El programa de Ricbevi está más orientado al PBP que a Proton.
Porque en Proton Basic no hay motivo de declarar los bits de los registros, ya que se pueden usar directamente.
Por ejemplo:
INTCONbits_GIE = 1

Y ya orientado al Basic de Proton...
PHP:
    INTCONbits_GIE = 1      ' Activar las interrupciones globales
    INTCONbits_PEIE = 1     ; Activar la interrupción de los periféricos.
    OPTION_REGbits_RBPU = 0 ' Habilita las resistencias Pull-up del puerto B
    INTCONbits_RBIE = 1     ' Habilta las interrupciones por cambio de estado PORTB[4..7]
 
El programita que subí esta basado en el ejemplo que trae el mismo Proton en su instalación.
Efectivamente si Proton reconoce el nombre puesto como el de un registro, cambia de color en el editor y no sería necesaria su declaración previa ya que fue reconocido.
Al mismo pin lo puedes usar como entrada y salida (si el micro lo permite y depende de la función que le darás).
Generalmente el compilador cambia solo el estatus del registro TRIS según interprete que lo estas usando como entrada o salida.
Para no dejar dudas al respecto a mi personalmente me gusta declara todo y dejar lo menos posible a la libre interpretación.


Ric.
 
Para no dejar dudas al respecto, a mi personalmente me gusta declarar todo y dejar lo menos posible a la libre interpretación.
Lo cual es muy correcto sin entrar en redundancias que a final de cuentas nada más nos hacen escribir código extra sin función útil.
Es correcto que se declaren cosas que no están definidas, pero las que ya son nativas, ni al caso, se usan y se ejecutan directamente.

Y te voy a ser sincero al hablar de PBP a Proton, Proton es mucho mejor al PBP.
Proton cuenta con una optimización de código superior a PBP. (Y hasta permite el uso de variables Float)
Tiene muchas más instrucciones, porque su estructura está orientada al Visual Basic.
Ambos disponen el uso directo de los registros y también se puede agregar lenguaje ensamblador.
Pero, Proton es más amigable es éste aspecto, porque ya los tiene declarados como algo nativo.
Al igual que usar XC o al mismo ensamblador.

Ventajas entre los varios lenguajes hay muchas, lo que se debe tener en cuenta es saber usar lo que se tiene o se sabe.
 
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.
 
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.
 

Adjuntos

  • RF 4 bits probado_2.rar
    84.2 KB · Visitas: 44
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 :
PHP:
include "modedefs.bas"
DEFINE OSC 4
CMCON = 7 ;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
x var byte
y var byte
numero var byte

on interrupt goto inicio
INTCON = %10001000
numero = 0

programa:
for x = 1 to 100
low led_rojo
next
for y = 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=0 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:
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
x var byte
y var byte
numero var byte

on interrupt goto lop
INTCON = %10010000
numero = 0

programa:
for x = 1 to 100
low led_rojo
next
for y = 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=0 and flat3 + flat4=0 then programa2
high led_rojo
goto Lop
programa2:
INTCON = %10010000
resume
enable
end
 

Adjuntos

  • RF 4 bits probando_2.rar
    123.4 KB · Visitas: 27
Última edición por un moderador:
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
 

Adjuntos

  • MODULO RF(PROTEUS).rar
    3.5 KB · Visitas: 49
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
 
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.
 
Última edición:
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
 
Última edición:
Atrás
Arriba