Curso de programación de PIC en PICBasic Pro

Suerte.
Buenas tardes amigo D@rkbytes. Gracias por este circuito.
Me tome el atrevimiento y lo monte en PROTEUS con un 16F628A y 3 displays.
Con un poco más de exactitud en el tiempo con respecto al reloj de PROTEUS en el ejemplo.
Arranca desde 180 y el reloj marca 3 minutos cuando llega a 000 el timer.
Adjunto carpeta con archivos y sigo en el proceso de poder programarlo con pulsadores.
Cualquier ayuda será bien recibida.
Si lo que quieres es hacer un contador programable, es mejor que realices otro código.
Ese no está diseñado para eso y tardarás más en modificar el código que en hacer un nuevo programa.

Saludos.
 
Pues no sé si serán los módulos rf los que presenten problema (FSI000A-CDR03A), hasta ahora los veo funcionando bien y como te comenté anteriormente, cuando programo para un solo pin parece funcionar bien por lo que creo que el problema no es tan trivial como parece. Voy a probar con un solo pin durante todo el día a ver si se mantiene y lo estoy comentando aquí nuevamente esta noche, de lo contrario, pues me tocaría desechar la idea del bloqueo con rf y pensarlo con teclado directamente en la moto para mayor seguridad.

Gracias.

Hola compañero, soy nuevo en cuestiones de módulos RF y tengo receptor y emisor como los suyos, la verdad no se como los puedo hacer funcionar y ya he buscado en google pero no hay mucha información para ellos podrías darme una mano con algo de info para este módulo?
 
Pues eso, que gracias a todos ustedes y sin conocimientos de electrónica, pude armarme un controlador que me regula la temperatura del agua (frío y calor) con simulación de amanecer-anochecer por Hwpm y , mediante el motor de una unidad de Cd rota con un tornillo sinfin metida en un bote de comida para peces, les dá de comer 3 veces al día programables. Gracias en particular a reyvilla, por atender a mis cuestiones sobre el módulo CCP.

A quien le pueda interesar le dejo el hex, el archivo pbp y la simulacíon en proteus ( todo un poco caótico y todavía muy mejorable ,pero yo lo tengo funcionando y vá de mil amores ).

Comentar que todo el programa lo hice sobre la base del termostato y el reloj rtc del libro de Carlos A. Reyes y que en la simulación falta un pulsador cuya única función es encender y apagar la luz del Lcd
 

Adjuntos

  • Acuario.rar
    36.8 KB · Visitas: 104
holas una consulta.
Estoy haciendo un proyecto q es mensaje a celular usando un sim900 y el pic 16f873
El sim fundiona con comandos at en el cual no tengo problema alguno, el problema es en el pic cuando hago el programa en pic basic
el programa es:

CONEC VAR BYTE

TESTEO:
SEROUT PORTC.6,N9600,["AT"]
SERIN PORTC.7,N9600,CONEC ;ALMACENADO EN CONEC
IF CONEC ="OK" THEN PASO2 ; COMPARACION SI ESTA OK VA A OTRA FUNC
GOTO TESTEO

El error radica en que en el momento de comparar if CONEC ="OK" me da error
pregunta :cuando yo le envio AT al sim me responde "OK"¿como ago que CONEC me almacen esos dos caracteres?¿como puedo hacer la comparacion en if?
os agradecere en el alma si alguien me ayuda
 
holas una consulta.
Estoy haciendo un proyecto q es mensaje a celular usando un sim900 y el pic 16f873
El sim fundiona con comandos at en el cual no tengo problema alguno, el problema es en el pic cuando hago el programa en pic basic
el programa es:

CONEC VAR BYTE

TESTEO:
SEROUT PORTC.6,N9600,["AT"]
SERIN PORTC.7,N9600,CONEC ;ALMACENADO EN CONEC
IF CONEC ="OK" THEN PASO2 ; COMPARACION SI ESTA OK VA A OTRA FUNC
GOTO TESTEO

El error radica en que en el momento de comparar if CONEC ="OK" me da error
pregunta :cuando yo le envio AT al sim me responde "OK"¿como ago que CONEC me almacen esos dos caracteres?¿como puedo hacer la comparacion en if?
os agradecere en el alma si alguien me ayuda

Hola...Debes leer la ayuda(Help) del PBP en el que explica el alcance y la forma de usar del comando SERIN2 y la forma de "esperar" una cadena. De todas formas NUNCA una variable del tipo BYTE(0-255) como tienes definido a CONEC puede almacenar una cadena de caracteres pero si el valor numérico de uno solo a la vez( o la "O(79)" o "o(111)" o la "K(75)" o la "k(107)").
Saludos.

Ric.
 
Hola compañeros de nuevo por acá con mis curiosidades, estuve hace un tiempo experimentando con el modulo PWM del PIC16F877A y me fue muy bien probando lo con un led variando su intensidad. En su momento me entero que la minima frecuencia a 20MHZ es de 1.22khz y a 4mhz es de 245hz lo cual es mucho para controlar un motor dc. A mi parecer esto es por la capacidad en si del microcontrolador ya que no es practico si se quiere independizar del manejo, a esto me refiero poder mantener un motor a una velocidad a través del PWM y poder hacer otras cosas sin tener que depender del una interrupción adicional para el control del motor. Esto ya que la única forma de poder bajar esa frecuencia es con un contador a través del timer1. Entonces llego a una conclusión que es preferible manejar un pwm directo por interrupción que el físico del microcontrolador ya que seria como mas eficiente el manejo del mismo y menos complicado que usando el modulo PWM propio del micro ya que no dependería de dos pines si no que podría aplicarlo a cualquier pin I/O.
Me gustaría saber sus opiniones y análisis al respecto.
A ustedes que les parece mejor...?
 
Exacto eso es lo que venden del micro y lo que entusiasma a utilizar el modulo PWM que es independiente de las otras ejecuciones del código, pero limitado y esa limitación te obliga a utilizar una subrutina adicional para poder utilizarlo en un motor y por lo tanto ya allí ya pierdes ese aspecto de independiente. Es útil al 100% para situaciones en las cuales manejes frecuencias mayores a 245hz de lo contrario para frecuencias de 50hz por ejemplo no lo veo muy eficaz por lo de la subrutina, en ese caso creo que es preferible hacer una rutina por interrupción y ya.
 
Saludos reyvilla, leyendo tu pregunta (espero haber entendido bien) concuerdo con el amigo LaElectronicaMeodia, eso dependeria de tu proyecto, de la complejidad, o mas bien que tan grande con respecto a circuiteria quisieras hacerlo. Pero alguna vez en un proyecto utilice divisores de frecuencia, quizas podriar utilizar cualquiera de estos circuitos (existen muchos) para dividir tu frecuencia minima "245" y asi poder tener un rango mas amplio. De todas formas comenta por aqui cualquier cosa, o si lo haces de otra forma tambien podria interesarle a otros miembros del foro.
Saludos y Suerte!
 
Hola Volthor, probé el que me enviaste, pero al compilarlo me dá un error, (igual genera el archivo hex), lo simulo en proteus y se queda en el primer efecto, aún cuando vuelvo a presionar el pulsador, adjunto el .pbp y el .dsn, para que por favor lo observes (no sé si tal vez mi simulador está mal configurado), gracias, seguimos en contacto(y)

amigo, el problema que tienes es que esta mal definido el watchdog (wdt) si eliminas o colocas como corresponde la linea, compila sin problema, saludos
 
Amigos, necesito de su gran ayuda.

Tengo este código. ¿Me podrían ayudar? Está en pic basic.
¿Cómo puedo hacer una rutina de tiempo para cada pulsador?
Oséa que si presiono 5 segundos pulsador1, led1 encienda 30 minutos, si presiono 7 segundos pulsador 1,
el led1 se quede encendido 1 hora y si presiono 2 segundos pulsador1 que el led1 se apague solo al cumplirse un minuto.

Ojala me puedan ayudar. Muchas gracias por su aporte.
 

Adjuntos

  • control de relay.rar
    8 KB · Visitas: 71
Última edición por un moderador:
Amigos del foro logre implementar algo pero aun me falta anexo todo el circuito con el codigo que he podido avanzar espero me puedan ayudar lo incomodo es que no tengo internet en casa y no me dejan instalar ni el proteus ni el microcode en cabina alquilada jejeje espero su ayuda amigos

la idea es que pueda darle diferentes tiempos presionando el mismo pulsador
ejemplo;
* PRIMER TIEMPO mantengo presionado botón por un mediosegundo y activa led_1 por 10 segundos si vuelvo a presionar el boton dentro de los 10 segundos le ordenare que se apague led_1 y si no es presionado el boton se apagara después de los 10 segundos automáticamente.

* SEGUNDO TIEMPO mantengo presionado botón por 2 segundos y activa led_1 por 1 minuto si dentro del minuto se vuelve a presionar el boton led_1 se apagara y si no es presionado el boton cumple el tiempo del minuto y el led_1 se apaga automaticamente.

* TERCER TIEMPO mantengo presionado el boton por 5 segundos y se activa led_1 por un tiempo de 2 horas si dentro de este tiempo de 2 horas se vuelve a presionar el boton led_1 se apaga y si no se presiona el boton led_1 se apagara automaticamente cuando se cumpla el tiempo adecuado amigo por favor he avanzado un poco del codigo pero aun no logro dar con el codigo o con la forma adecuada de hacer por favor es`pero me puedan ayudar con sus conocimientos.
Este es el codigo
Código:
@ DEVICE PIC16F628A         
@ DEVICE INTRC_OSC_CLKOUT    
@ DEVICE WDT_OFF             
@ DEVICE PWRT_OFF            
@ DEVICE LVP_OFF               
@ DEVICE CPD_ON             
@ DEVICE PROTECT_ON 
       
DEFINE OSC 4 

CMCON = 7

TRISB = %00000000 
TRISA = %11110000 
PORTA = %00000000
PORTB = %00000000

TLED1       VAR word  
TLED2       VAR word
TLED3       VAR WORD

MinutO      var byte   
Segundo     Var Byte     
MAS_TIEMPO  VAR BYTE
INITIO      VAR BYTE
I           var byte

FLAG0       VAR BIT
FLAG1       VAR BIT
FLAG2       VAR BIT


;******POTENCIA******///////****** 
LED         var PORTB.0  
LED_1       VAR PORTB.1 
LED_2       VAR PORTB.2 
LED_3       VAR PORTB.3
Trbuz       VAR PORTB.7
;********************///////******

;******PULSADORES****///////******                   
BOTON       VAR PortA.7 
BOTON1      VAR PortA.6
BOTON2      VAR PortA.4
;********************///////******


;gosub beeps
;pause 1000

OPTION_REG = %10000101
ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000

FLAG0=0
FLAG1=0
flag2=0
i=0

 INICIO:
   
     if boton then    ;como implementar los tiempos adecuadamente??????
      repeat
       pause 10
        i = i + 1      
      until not boton           
     if i =< 50 then         
       toggle led_1    
       toggle flag0    
       TLED1=0         
      else      
    if i=< 150 then 
     high led_1    
      high flag1    
       TLED2=0
     else
       toggle led_1   
       flag0=0
       flag1=0
       tled1=0
       tled2=0
      endif
     endif
    endif
   pause 10
     
GOTO INICIO

    DISABLE            
MI_INTERRUPCION: 
    MAS_TIEMPO = MAS_TIEMPO + 1
    IF MAS_TIEMPO => 61 THEN
    MAS_TIEMPO = 0
    TOGGLE LED
    if FLAG0 THEN 
    TLED1 = TLED1 + 1
    ENDIF
    IF FLAG1 THEN
    TLED2= TLED2 + 1
    ENDIF
    IF FLAG2=1 THEN
    TLED3= TLED3 + 1
    ENDIF

    IF LED_1 = 1 and TLED1 = 10 THEN  ; 10 segundos 
    flag0=0
    LED_1=0
    TLED1=0
    i=0
    ENDIF
    
    IF LED_1 = 1 and TLED2 = 60 tHEN ; 1 minuto ===> 60 segundos
    LED_1=0 
    FLAG1=0
    TLED2=0 
    i =0  
    endif
    ENDIF

    IF LED_1 = 1 and TLED3 = 7200 tHEN ; 2 horas ===> 7200 segundos
    LED_1=0 
    FLAG2=0
    TLED3=0 
    i =0  
    endif
    ENDIF
    
    INTCON = %10100000 
    Resume
    Enable
    END

Si quisiera que tenga un sonido buzzer para que me avise cuando active el tiempo de 1 minuto por decir bip bip tiempo de
for I = 0 to 1
high buzzer
pause 80
low buzzer
pause 80
next I
y cuando se cumpla el minuto vuelva a sonar bip bip afectaria esto en la rutina del conteo por interrupcion osea afectaria en algo. Ya que estuve haciendo pruebas y cuando le puse el buzzer se retrazaba un poco en contar los segundos o mejor dicho no eran exactos los segundos
 

Adjuntos

  • ckto.rar
    18.2 KB · Visitas: 60
Última edición:
mira estuve probando tu codigo agregue un par de lineas pero no trabaja no logro hallar la forma adecuada esperemos que puedan ayudar los amigos del foro o amigos moradores
lo estuve probando con segundos en cada tiempo
Código:
 INICIO:
   
     if boton then    
      repeat
       pause 10
        i = i + 1     
      until not boton           
     if i =< 30 then      
       high led_1    
       high flag0    
       TLED1=0         
      elseif 
        gosub Time1 
      ELSE   
    if i=< 150 then 
     high led_1  
      high flag1    
       TLED2=0
     else
      gosub Time1
      endif
     endif
    endif
   pause 10
     
GOTO INICIO

    DISABLE            
MI_INTERRUPCION: 
    MAS_TIEMPO = MAS_TIEMPO + 1
    IF MAS_TIEMPO => 61 THEN
    MAS_TIEMPO = 0
    TOGGLE LED
    if FLAG0 THEN 
    TLED1 = TLED1 + 1
    ENDIF
    IF FLAG1 THEN
    TLED2= TLED2 + 1
    ENDIF

    IF LED_1 = 1 and TLED1 = 8 THEN  ; 
    flag0=0
    LED_1=0
    TLED1=0
    i=0
    ENDIF
    
    IF LED_1 = 1 and TLED2 = 12 tHEN ; 
    LED_1=0 
    FLAG1=0
    TLED2=0 
    i =0  
    endif
    ENDIF
    
    INTCON = %10100000 
    Resume
    Enable
    
    Time1:
       toggle led_1  
       flag0=0
       flag1=0
       tled1=0
       tled2=0
    goto INICIO   
 END
 
mira estuve probando tu codigo agregue un par de lineas pero no trabaja no logro hallar la forma adecuada esperemos que puedan ayudar los amigos del foro o amigos moradores
lo estuve probando con segundos en cada tiempo
Código:
 INICIO:
   
     if boton then    
      repeat
       pause 10
        i = i + 1     
      until not boton           
     if i =< 30 then      
       high led_1    
       high flag0    
       TLED1=0         
      elseif 
        gosub Time1 
      ELSE   
    if i=< 150 then 
     high led_1  
      high flag1    
       TLED2=0
     else
      gosub Time1
      endif
     endif
    endif
   pause 10
     
GOTO INICIO

    DISABLE            
MI_INTERRUPCION: 
    MAS_TIEMPO = MAS_TIEMPO + 1
    IF MAS_TIEMPO => 61 THEN
    MAS_TIEMPO = 0
    TOGGLE LED
    if FLAG0 THEN 
    TLED1 = TLED1 + 1
    ENDIF
    IF FLAG1 THEN
    TLED2= TLED2 + 1
    ENDIF

    IF LED_1 = 1 and TLED1 = 8 THEN  ; 
    flag0=0
    LED_1=0
    TLED1=0
    i=0
    ENDIF
    
    IF LED_1 = 1 and TLED2 = 12 tHEN ; 
    LED_1=0 
    FLAG1=0
    TLED2=0 
    i =0  
    endif
    ENDIF
    
    INTCON = %10100000 
    Resume
    Enable
    
    Time1:
       toggle led_1  
       flag0=0
       flag1=0
       tled1=0
       tled2=0
    goto INICIO   
 END

Una pregunta en la instrucción Pause, el período es en milisegundos, según comentas quieres controlar medio segundo, por qué se pregunta por =< 50 ¿no debería ser => 500?
 
al ponerle PAUSE 10 estoy dando un tiempo de 10 ms por el tiempo de presionado del boton que es de 50 ms seria 500 msg o talvez me estoy confundiendo si podrian orientarme por favor les agradecederia inmensamente
Una pregunta en la instrucción Pause, el período es en milisegundos, según comentas quieres controlar medio segundo, por qué se pregunta por =< 50 ¿no debería ser => 500?
 
Última edición:
Atrás
Arriba