desktop

Curso de programación de PIC en PICBasic Pro

Hola a todos, es mi primera pregunta en este foro que sigo hace algún tiempo y me parece fenomenal por los aportes que hacen ustedes, desde ya muchas gracias, mi pregunta es la siguiente, como o que tengo que hacer pera que el siguiente proyecto que es muy básico después de hacer su su salto a la correspondiente función y mediante una pulsación en gpio.3 mas larga se apague el led.

Nota: soy muy novato :oops: :oops: :D
Código:
define osc 4
 @ DEVICE  PIC12F629,INTRC_OSC_NOCLKOUT'' si usas el oscilador interno.
 @ DEVICE pwrt_off,bod_on,protect_off,cpd_off,mclr_off

 cmcon = 7

 trisio = %00001000  'gpio.3 entrada,0,1,2,4,5 son salidas
 gpio = %00000000
 cnt var byte
 boton var gpio.3  ;pulsador pin 4 gpio.3
 led var gpio.0    ;led pin 7 gpio.0
 cnt =0
 
chequeo: if boton = 0 then tick          
         goto chequeo 
                  
                        
tick:    pause 100 

         cnt = cnt + 1                                             
         if cnt =1 then luz1       
         if cnt =2 then luz2       
         if cnt =3 then luz3
         if cnt =4 then led_on         
         if cnt =>5 then led_off
        
luz1:    pwm led,25,100                                                                      
         if boton =0 then tick                                 
         goto luz1

Aqui por ejemplo: si presiono el pulsador por mas tiempo digamos (x) que se apague el led y si hago solamente un toke que siga saltando a su rutina. Y asi con las demas funciones.  
                                                    
luz2:    pwm led,50,100                                                            
         if boton =0 then tick                           
         goto luz2 
                                             
luz3:    pwm led,75,100                                         
         if boton =0 then tick                           
         goto luz3
         
led_on:  HIGH LED
         pause 200               
         if boton =0 then tick  
         goto led_on         
                           
led_off:  low led                              
          pause 250                   
          cnt =0               
          goto chequeo                    
          end
Muchas gracias
 
Última edición por un moderador:
Una consulta D@rkbytes. Lo único que no entiendo de la función button es la parte de action, no-se cuando action se le debe poner uno o cuando a action se le debe poner cero.
Agradecería mucho tu respuesta.
 
Última edición por un moderador:
Saludos a todos,

Estoy diseñando una interface para una cnc casera versión Esteca55 pero utilizando un pic16f628 para evitar recalentamientos de los motores, el caso es que no he podido hacer funcionar la interrupción básica por el puerto b (b4-b7), francamente no sé cuál es el detalle, yo les agradecería mucho si pudieran echarme una mano con dicha interrupción.

Sé que hay que configurar el Intcon.3 y borrar la bandera Intcon.0 pero no sé que mas hacer.
Código:
' Programa en Pic Basic Pro
Define Osc 4 ' Define el Oscilador para un Cristal
' de 4 Mhz.
TRISA = %00000000 ' Configura el puerto A como salida.
TRISB = %11110000 ' Configura los 4 bits más significativos como
' entrada.
I VAR Byte ' Declaración de la variable "I" tipo Byte
Symbol LED1 = PORTA.0 ' Alias para el pin RA0
Symbol LED2 = PORTA.1 ' Alias para el pin RA1
On Interrupt GoTo Interrup ' Define el vector de interrupción
INTCON = %10001000 ' habilita la interrupción RB4-RB7
Inicio:
LED1 = 1 ' Enciende el Led 1
Pause 1000 ' Pausa de 1 segundo
LED1 = 0 ' Apaga el Led 1
Pause 1000 ' Pausa de 1 segundo
GoTo Inicio ' Salta a la etiqueta "Inicio"
Interrup:
Disable
For I = 1 To 6
LED2 = 1 ' Enciende el Led 2
Pause 1000 ' Pausa de 1 segundo
LED2 = 0 ' Apaga el Led 2
Pause 1000 ' Pausa de 1 segundo
Next I
INTCON = %10001000 ' habilita las interrupciones (GIE=1)
' habilita la interrupción RB4-RB7 (RBIE=1)
' Inicializa la interrupción (RBIF=0)
Resume
Enable
End
 
Saludos a todos,

Estoy diseñando una interface para una cnc casera versión Esteca55 pero utilizando un pic16f628 para evitar recalentamientos de los motores, el caso es que no he podido hacer funcionar la interrupción básica por el puerto b (b4-b7), francamente no sé cuál es el detalle, yo les agradecería mucho si pudieran echarme una mano con dicha interrupción.

Sé que hay que configurar el Intcon.3 y borrar la bandera Intcon.0 pero no sé que mas hacer.
Código:
' Programa en Pic Basic Pro
Define Osc 4 ' Define el Oscilador para un Cristal
' de 4 Mhz.
TRISA = %00000000 ' Configura el puerto A como salida.
TRISB = %11110000 ' Configura los 4 bits más significativos como
' entrada.
I VAR Byte ' Declaración de la variable "I" tipo Byte
Symbol LED1 = PORTA.0 ' Alias para el pin RA0
Symbol LED2 = PORTA.1 ' Alias para el pin RA1
On Interrupt GoTo Interrup ' Define el vector de interrupción
INTCON = %10001000 ' habilita la interrupción RB4-RB7
Inicio:
LED1 = 1 ' Enciende el Led 1
Pause 1000 ' Pausa de 1 segundo
LED1 = 0 ' Apaga el Led 1
Pause 1000 ' Pausa de 1 segundo
GoTo Inicio ' Salta a la etiqueta "Inicio"
Interrup:
Disable
For I = 1 To 6
LED2 = 1 ' Enciende el Led 2
Pause 1000 ' Pausa de 1 segundo
LED2 = 0 ' Apaga el Led 2
Pause 1000 ' Pausa de 1 segundo
Next I
INTCON = %10001000 ' habilita las interrupciones (GIE=1)
' habilita la interrupción RB4-RB7 (RBIE=1)
' Inicializa la interrupción (RBIF=0)
Resume
Enable
End

Hola...Prueba así a ver si te funciona bien como a mi solo tuve que achicar los tiempos de encendido/apagado de el led2 y colocar las definiciones en la cabecera.
Código:
' Programa en Pic Basic Pro
            Device = 16F628A   ' micro usado
        All_Digital= true  ' todas las entradas son digitales
    Config INTRC_OSC_NOCLKOUT, WDT_ON, LVP_OFF, BODEN_OFF, CP_ON, CPD_OFF, PWRTE_OFF, MCLRE_OFF
     Declare Xtal = 4  ' Define el Oscilador para un Cristal de 4 Mhz.
TRISA = %00000000 ' Configura el puerto A como salida.
TRISB = %11110000 ' Configura los 4 bits más significativos como
' entrada.
I VAR Byte ' Declaración de la variable "I" tipo Byte
Symbol LED1 = PORTA.0 ' Alias para el pin RA0
Symbol LED2 = PORTA.1 ' Alias para el pin RA1
PORTB=0 ' limpio puerto B
On Interrupt GoTo Interrup ' Define el vector de interrupción
INTCON = %10001000 ' habilita la interrupción RB4-RB7
Inicio:
LED1 = 1 ' Enciende el Led 1
DelayMS 1000 ' Pausa de 1 segundo
LED1 = 0 ' Apaga el Led 1
DelayMS 1000 ' Pausa de 1 segundo
GoTo Inicio ' Salta a la etiqueta "Inicio"
Interrup:
Disable
For I = 1 To 6
LED2 = 1 ' Enciende el Led 2
DelayMS 100'0 ' Pausa de 100 Mili segundo
LED2 = 0 ' Apaga el Led 2
DelayMS 100 '0 Pausa de 100 Mili segundo
Next I

INTCON = %10001000 ' habilita las interrupciones (GIE=1)
' habilita la interrupción RB4-RB7 (RBIE=1)
' Inicializa la interrupción (RBIF=0)
Resume
Enable
End
Saludos.

Ric.
 
Una consulta D@rkbytes. Lo único que no entiendo de la función button es la parte de action, no-se cuando action se le debe poner uno o cuando a action se le debe poner cero.
Agradecería mucho tu respuesta.
Saludos.
Action toma el siguiente valor cuando es presionado el pulsador...
0 si no se presiona, 1 cuando se presiona.
Así que todo depende de que valor quieres que tome el pulsador cuando es presionado.
Por lo regular Action conviene ponerlo en 0, ya que 0 es considerado como OFF en los Push Buttons N/A

Para que tengas más conocimiento de como actúa Action al presionar el pulsador,
crea algún proyecto sencillo con un LED y juega con el valor de Action para que veas el resultado.

Suerte.
 
Hola ricbevi,

Gracias por responder, pues realmente no sé que pueda estar pasándome, compilo y sigo teniendo problemas, parpadea el led para el ciclo normal y el de la interrupción igual una vez se ha activado. Adjunto la simulación pues este pequeño detalle me tiene dudando de mi lucidez mental je,je,je... a ver si, en definitiva, logro encausar mi proyecto. Lo probé con Proton y también presenta el error...
 

Adjuntos

  • interrupciones.rar
    41 KB · Visitas: 99
solo tuve que achicar los tiempos de encendido/apagado de el led2 y colocar las definiciones en la cabecera.
Hola ricbevi.
Solo como comentario...
La palabra de configuración que colocaste en el código es para Proton, no para PICBasic Pro.
Y si el amigo DEPREDADORX1 compila con MicroCode Studio le va a producir errores.
Hay que cambiar la palabra de configuración con la sintaxis para MCS.
Algo así como esto...
Código:
@ DEVICE PIC16F628A    ; Microcontrolador utilizado
; Palabra de configuración
@ DEVICE INTRC_OSC_NOCLKOUT,PROTECT_OFF,CPD_OFF,WDT_OFF,MCLR_ON,PWRT_ON,BOD_OFF,LVP_OFF
Y tener en consideración si se requiere tener activo el WDT que en tu configuración esta activo.

Saludos.
 
Gracias tambien a D@rkbytes por la aclaración, igual lo probé en Proton y funciona mal, espero de verdad encontrarle cuál es la falla, es muy curioso porque el código es estraído fielmente de algunos textos. Hasta ahora, buscando y buscando, no he podido encontrar un ejemplo funcional, ni siquiera el foro de Proton o pic basic, quizás algo relacionado con los teclados keypad, pero son ejemplos extensos que solo me han confundido más. Agradezco cuaquier otro comentario al que puedan hacer al respecto.
 
Hola ricbevi.
Solo como comentario...
La palabra de configuración que colocaste en el código es para Proton, no para PICBasic Pro.
Y si el amigo DEPREDADORX1 compila con MicroCode Studio le va a producir errores.
Hay que cambiar la palabra de configuración con la sintaxis para MCS.
Algo así como esto...
Código:
@ DEVICE PIC16F628A    ; Microcontrolador utilizado
; Palabra de configuración
@ DEVICE INTRC_OSC_NOCLKOUT,PROTECT_OFF,CPD_OFF,WDT_OFF,MCLR_ON,PWRT_ON,BOD_OFF,LVP_OFF
Y tener en consideración si se requiere tener activo el WDT que en tu configuración esta activo.

Saludos.

Si efectivamente esta en el formato del Proton las disculpas del caso y también entendido al WDT activado que posiblemente por eso parecía que funcionaba ....se me chispotio :) Saludos.
Ric.
 
Hola foreros,

Al parecer no siempre las cosas son como parecen, uno se guía por un texto porque cree que está bien y sucede que no. Checando el foro de los amigos de todopic encontré una posible respuesta al error de la interrupción por el puerto b, aquí lo que encontré:

primero: leer o escribir el puertoB;
Hacer PORTB = PORTB puede servir.

Luego, limpiar el flag correspondiente.

al salir y reactivar INTCON,GIE deberias poder salir de la interr, excepto los valores de las entradas en RB4-RB7 hayan vuelto a cambiar durante ese período de tiempo.

Al parecer le funcionó esto:
dim button_pressed as byte
dim tempbyte as byte

sub procedure interrupt

'Lo que quieras poner para que se ejecute la interrupcion ej: IF portb.7 = 1 then......
tempbyte = PORTB ' Lee el PORTB en una variable de bytes para eliminar condición desajuste
INTCON.RBIE = 0 ' Desavilita otras interrupciones
INTCON.RBIF = 0 ' Apaga la bandera de interrupción "Turn off the interrupt flag"
button_pressed = true
end sub

main
SetBit(INTCON,GIE) ' habilita interrupciones globales.
"tu programa"
INTCON.RBIE = 1
 
hola como declaras que pic vas a usar, lo pongo como esta en los tutoriales y da error



este programa me anda en la simulacion(en proteus 7.9) pero en la practica no me funciona


Código:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 24/10/2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

DEFINE OSC 4 
portb=0
n var byte
p1 var porta.0
p2 var porta.1
ldr var porta.4
ldr1 var porta.4
led var portb.4
led1 var portb.5
buzzer var portb.6
servo var portb.0


inicio:
if p1=1 then encender
PAUSE 200
if p2=1 then apagar
PAUSE 200
if ldr=1 then encender2
pause 200
if ldr1=0 then apagar2
goto inicio

encender:
for n=1 to 10 step 1
pulsout portb.0,175
pause 10
low portb.5
high portb.4
high portb.6
next
if p2=1 then apagar
goto encender

apagar:
for n=1 to 10 step 1
pulsout portb.0,150
pause 10
next
low portb.4
high portb.5
low portb.6
goto inicio

encender2:
for n=1 to 10 step 1
pulsout portb.0,175
pause 10
next
low portb.5
high portb.4
high portb.6
goto inicio

apagar2:
for n=1 to 10 step 1
pulsout portb.0,150
pause 10
low portb.4
high portb.5
low portb.6
next

goto inicio



end

Si efectivamente esta en el formato del Proton las disculpas del caso y también entendido al WDT activado que posiblemente por eso parecía que funcionaba ....se me chispotio :) Saludos.
Ric.

no me funciona declarar el pic utilizado como lo pusiste
 
Última edición por un moderador:
Disculpen a ver si alguien me podria ayudar ya que soy nuevo en lo que es PICs.
Encontré un código asm PIC 16f84A de un contador simple ascendente con un 7 segmentos y un pulsador, lo unico es que modifiqué es que tenga otro pulsador para conteo descendente, PERO !!!! cuando desciende a 0 se bloquéa a ver si alguien me puede decir que hice mal.

Físicamente configuré (RB0 a RB6 a,b,c,d,e,f,g Respectivamente del 7 Segmentos Cátodo común) RB7 1K a 0v y Pulsador a 5v
Luego agregué RA2 con el otro pulsador igual para descender y como les contaba, llega a 0 y se bloquéa, ( al ascender anda super pasa el 0 y vuelve a contar ) solo es al descender el problema, Desde yá muchas gracias .... ATTE. Victor Angel
Hola amigo lo que tu propones es mas sencillo hacerlo en pic basic.
Tengo lo que necesitas, te envió los archivos del programa y la simulación.

Amigo en el archivo esta lo que deseas espero que te sirva de ayuda.
 

Adjuntos

  • contador asc-desc con pulsadores.rar
    37.8 KB · Visitas: 127
Última edición por un moderador:
Claro simple polarización, otra alternativa mosfet irfz44n
Hola que tal, ya pude realizar mi contador ascendente, ya entendi lo de la Multiplexacion.

Alguien me podria hechar la mano con el uso de las banderas.
Lo que tengo que hacer es lo siguiente, cuando conecto el uC al la corriente despliega el numero 7 y cuando pulso un boton muestra el numero 4, si lo vuelvo a pulsar muestra el numero 7 de nuevo y si lo vuelvo a pulsar muestra el numero 4 de nuevo.
Es como un set y un reset. Se que tengo que usar banderas pero aun no logro entender bien como usarlas. Adjunto lo que llevo de codigo. De inicio en proteus me muestra el 7 y cuando pulso el boton me muestra el 4 pero al pulsar de nuevo el boton ya no hace nada =(, alguien que me heche una manita, de antemano gracias.
salu2

He compilado tu código con un pic16F628A y esta correcto, no genera ningún error.

:apreton:
 

Adjuntos

  • contador 0a9999.rar
    48.7 KB · Visitas: 135
Última edición por un moderador:
hola, hblando del l297 que lo he reutilizado bastantte con motores paso a paso,. me di cuenta que es mucho mas costoso ese par "l297 y L298" que un pic y nos transistores por lo menos aqui en mi pais saldria mas factible un pic que el driver, me gustaria hacer un L297 con un Pic. No creo que la programacion sea gran cosa, bueno quien quiera intentarlo me avisa y nos ponemos con eso saludos...

http://pdf1.alldatasheet.com/datasheet-pdf/view/22436/STMICROELECTRONICS/L297.html

No lo creo, el driver es para manejar mayor corriente al motor, lo puedes hacer con transistor y diodos .
 
Última edición por un moderador:
Claro simple polarización, otra alternativa mosfet irfz44n


He compilado tu código con un pic16F628A y esta correcto, no genera ningún error.

:apreton:

Hola lisani!!!
Agradesco tu tiempo y tu ayuda, pero debo ser sincero contigo, algunas instrucciones del programa no las etiendo :confused:
Yo stoy realizando un contador ascendente y descendente, se muestra a tráves de displays 7seg. catodo comun y estan multiplexados, tengo que usar banderas para que con un solo pulsador lo hagas pero solo un pulso, es decir al conectar el pic a vcc empieza a contar en forma ascendente, cuando presiono el pulsador cuenta descendente y si vuelvo a presionar el pulsador cuenta ascendente y asi sucesivamente.
Disculpa las molestias y gracias por tu tiempo y ayuda
 
Hola a todos, es mi primera pregunta en este foro que sigo hace algún tiempo y me parece fenomenal por los aportes que hacen ustedes, desde ya muchas gracias, mi pregunta es la siguiente, como o que tengo que hacer pera que el siguiente proyecto que es muy básico después de hacer su su salto a la correspondiente función y mediante una pulsación en gpio.3 mas larga se apague el led.

Nota: soy muy novato :oops: :oops: :D
Código:
define osc 4
 @ DEVICE  PIC12F629,INTRC_OSC_NOCLKOUT'' si usas el oscilador interno.
 @ DEVICE pwrt_off,bod_on,protect_off,cpd_off,mclr_off

 cmcon = 7

 trisio = %00001000  'gpio.3 entrada,0,1,2,4,5 son salidas
 gpio = %00000000
 cnt var byte
 boton var gpio.3  ;pulsador pin 4 gpio.3
 led var gpio.0    ;led pin 7 gpio.0
 cnt =0
 
chequeo: if boton = 0 then tick          
         goto chequeo 
                  
                        
tick:    pause 100 

         cnt = cnt + 1                                             
         if cnt =1 then luz1       
         if cnt =2 then luz2       
         if cnt =3 then luz3
         if cnt =4 then led_on         
         if cnt =>5 then led_off
        
luz1:    pwm led,25,100                                                                      
         if boton =0 then tick                                 
         goto luz1

Aqui por ejemplo: si presiono el pulsador por mas tiempo digamos (x) que se apague el led y si hago solamente un toke que siga saltando a su rutina. Y asi con las demas funciones.  
                                                    
luz2:    pwm led,50,100                                                            
         if boton =0 then tick                           
         goto luz2 
                                             
luz3:    pwm led,75,100                                         
         if boton =0 then tick                           
         goto luz3
         
led_on:  HIGH LED
         pause 200               
         if boton =0 then tick  
         goto led_on         
                           
led_off:  low led                              
          pause 250                   
          cnt =0               
          goto chequeo                    
          end
Muchas gracias



es posible que con la funcion button te funcione si no estoy mal esa funcion te permite dar un lapso de tiempo para pasar a una etiqueta es una funcion para antirebotes, pienso tambien en hacer un contador con respecto a pin de entrada si pin es 1 despues de tanto tiempo brinque a una etiqueta, en esa etiqueta colocar otro condicional de modo que si el pin aun es 1 entonces esperar a que sea 0 para seguir....creo que la solucion puede estar en la instruccion button leete el manual y buscate esa funcion.....pensa depronto con los condicionales y un contador para determinar si en un tiempo detrminado el boton no se a soltado que brinque....acordate de mayor que menor que.....puede ser contador de 0 a 255 con una pausita de 100...calcule el tiempo que mas o menos necesitas por ejemplo un segundo, si es a 100 milisegundos entonces el contador llega a diez cuando a pasado un segundo y si el contador llega a once te brinca de una...creo que por ahi vaaa jajaja saludos
 
Gracias guigo,(y) ya lo intente con button, pero me hace intermitencias se apaga y no se enciende......en fin ,seguro que no acierto con "down" "action", o con "bvar" tengo que decir que todo esto lo intente despues de leerme todo y mirar por si encontraba algo que pudiese modificar y adaptarlo, en fin como se trata de aprender seguiremos intentandolo ,depues de 58 años me da por esto que le vamos a hacer :D

Un saludo

PD: esto seria para hacer una linterna con varios modos y tal como lo tengo funciona bastante bien, pero me gustaria hacerlo de esa manera por experimentar y seguir con este pic que me gusta, no se porque :D
 
Última edición:
Gracias guido,(y) ya lo intente con button, pero me hace intermitencias se apaga y no se enciende......en fin ,seguro que no acierto con "down" "action", o con "bvar" tengo que decir que todo esto lo intente despues de leerme todo y mirar por si encontraba algo que pudiese modificar y adaptarlo, en fin como se trata de aprender seguiremos intentandolo ,depues de 58 años me da por esto que le vamos a hacer :D

Un saludo

PD: esto seria para hacer una linterna con varios modos y tal como lo tengo funciona bastante bien, pero me gustaria hacerlo de esa manera por experimentar y seguir con este pic que me gusta, no se porque :D


haaaaa num una de las cosas que sucede con los pic 12fxxx o puerto GPIO es que el pin se apaga apenas pasa a otra linea donde no este involucrado por ejemplo si vos cojes y prendes un pin le das una pausa para luego pasar a otra linea que prenda otro pin, el primer pin que prendiste se te va a apagar sin necesidad de darle a pin ñow o una instruccion que lo apague como sucede con otras familias como las 16fxxx....eso es una fallita de los pic de gama baja...

parcero....le toco hechar logica... iguale variables o utilice operaciones digitales..

saludos.

guigo dijo:
haaaaa num una de las cosas que sucede con los pic 12fxxx o puerto GPIO es que el pin se apaga apenas pasa a otra linea donde no este involucrado por ejemplo si vos cojes y prendes un pin le das una pausa para luego pasar a otra linea que prenda otro pin, el primer pin que prendiste se te va a apagar sin necesidad de darle a pin ñow o una instruccion que lo apague como sucede con otras familias como las 16fxxx....eso es una fallita de los pic de gama baja...

parcero....le toco hechar logica... iguale variables o utilice operaciones digitales..

saludos.

haaa y como las ppoliticas del foro no permite solucionarte el problema completo....no te puedo decir como hacerlo simplemete te puedo guiar con ideas y de hecho con lo que te he dicho es posible hacerlo...
 
Gracias, Guigo, :) ;) lo entiendo y lo comprendo, no buscaba "la solucion" , si no "una idea para la solucion" Un saludo

Ricbevi, gracias tambien , ya lo habia mirado, y probado,tiene soluciones geniales como on/off y commutacion (y) . Seguiremos intentandolo :D

SALUDOS
 
Última edición:
Atrás
Arriba