Curso de programación de PIC en PICBasic Pro

hola a todos, por favor alguien sabe sí con un 16f84a ó un 16f628a puedo usar programación in circuit? y sí es así como lo hago?
ya lo he hecho con otros pics como por ejemplo el 16f877a y me funciona pero con estos no que sera lo que estoy haciendo mal, les agradezco su ayuda...
 
hola a todos, por favor alguien sabe sí con un 16f84a ó un 16f628a puedo usar programación in circuit? y sí es así como lo hago?
ya lo he hecho con otros pics como por ejemplo el 16f877a y me funciona pero con estos no que sera lo que estoy haciendo mal, les agradezco su ayuda...

Hola si se puede, si es ICSP a lo que te refieres programación serial en el circuito, en la hoja de dato de todos los pic te indica cuales son los pines de programación, buscas en el PDF del pic para el caso del 16F84A, indica que debes buscar una guía.

For complete details of serial programming, please
refer to the In-Circuit Serial Programming (ICSP™)
Guide, (DS30277).

Pero en realidad los pines son igual para el 16F628A como para el 16F84A y son los siguientes:

PGC 13
PGD 12
MCLR 4
VDD 14
VSS 5



muchas gracias por ir orientandome ya poco a poco voy entendiendo logre aumentar el tiempo por 10 segundos puedo aumentar a 1 min aca dejo el codigo a 10 seg

Código:
@ DEVICE PIC16F628A         
@ DEVICE INTRC_OSC_CLKOUT   
@ DEVICE WDT_OFF             
@ DEVICE PWRT_OFF           
@ DEVICE LVP_OFF            
@ DEVICE CPD_OFF            
@ DEVICE PROTECT_OFF        
DEFINE OSC 4
CMCON = 7  
OPTION_REG = %10000101 

MAS_SEGUNDO  Var Byte     ; Definir variable second
MAS_TIEMPO    VAR BYTE
TIME1              VAR WORD 

LED_1      var PORTB.0  
LED_2      VAR PORTB.1 
TRISB = %00111110
TRISA = %11000000
PORTA = %00000000
PORTB = %00000000 

ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000

DISABLE         
MI_INTERRUPCION:
mas_tiempo=mas_tiempo+1
if mas_tiempo < 61 then endinterrupt 
mas_tiempo=0
toggle led_1
MAS_SEGUNDO=MAS_SEGUNDO+1
IF MAS_SEGUNDO>=10 THEN
SEGUNDO=0
TOGGLE LED_2
ENDIF

hola reyvilla mira pude aumentar el tiempo de encendido por 10 seg luego se apaga por 10 seg y se repite el bucle como podria hacer el codigo para que enciende led_2 x 10 seg y se apaga por 5 seg y asi se repita el bucle voy entendiendo muchas gracias espero puedas seguir ayudandome:unsure:



amigo mira probando y probando hago este codigo pero no se si estara bien creo que me estoy enredando cada vez mas y no quiero si practico y pruebo es para aprender pero quisiera saber en que fallo
este codigo lo que le indico es cuente x 10 seg cuando llegue a 10 seg prenda LED_2 por 5 seg luego se apague a los 15 seg osea:
0--10seg-->apagado led_2
10-15seg-->prendido led_2
15-25seg-->apagado led_2
25-30seg-->prendido led_2
pero no me hace eso, solo respeta los 10 seg al empezar el codigo, osea se prende LED_2 a los 10 seg luego se apaga a los 15 seg
0--10seg-->apagado led_2
10-15seg-->prendido led_2
15-20seg-->apagado led_2
20-25seg-->prendido led_2
como hacer para que me respete los 10 seg de apagado siempre
aca dejo el codigo que estoy haciendo en verdad agradesco su ayuda

Código:
@ DEVICE PIC16F628A          
@ DEVICE INTRC_OSC_CLKOUT    
@ DEVICE WDT_OFF             
@ DEVICE PWRT_OFF            
@ DEVICE LVP_OFF               
@ DEVICE CPD_OFF             
@ DEVICE PROTECT_OFF        

DEFINE OSC 4 

CMCON = 7   
OPTION_REG = %10000101 

Hour   Var Byte    
Minuto Var Byte     
Segundo Var Byte     
MAS_TIEMPO VAR BYTE
TIME1   VAR WORD 

LED_1      var PORTB.0  
LED_2      VAR PORTB.1 
TRISB = %00111110 
TRISA = %11000000 
PORTA = %00000000
PORTB = %00000000 

ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000

INICIO:
    IF led_2=1 THEN
     for TIME1=1 to 1000
      pause 5
     next TIME1
      low led_2
    ENDIF
GOTO INICIO

DISABLE         
MI_INTERRUPCION:
mas_tiempo=mas_tiempo+1
if mas_tiempo < 61 then endinterrupt 
mas_tiempo=0
toggle led_1
SEgundo=Segundo+1
IF SEgundo>=10 THEN
SEgundo=0
high LED_2
ENDIF
 
endinterrupt:
INTCON.2=0
RESUME
ENABLE
END

Hola recuerda comentar todo ya que se hace mas facil entender lo que pretendes hacer, y por otro lado para implementar tiempos distintos y a traves de algo externo para iniciar la temporizacion yo particularmente utilizo una base de tiempo que me permite incrementar otros contadores individuales...Otra cosa si no necesitas presicion los tiempos los puedes manejar sin interrupcion avisa en si que es lo que quieres hacer.
 
Última edición:
Hola....
ps yo quiciera introducirme en la comunicacion USB y ethernet con basic. alguien me puede enviar ejemplos sencillos y si a alguno le ha pasado que al compilar el codigo generado por easyHid no compila, me puede explicar que debo tener en cuenta? muchas gracias.
 
quisiera que empiece por respetar el tiempo que quiero darle que sea 10 seg exactos que este apagado y 5 seg exactos que este prendido de verdad muchas gracias por tu apoyo
 
quisiera que empiece por respetar el tiempo que quiero darle que sea 10 seg exactos que este apagado y 5 seg exactos que este prendido de verdad muchas gracias por tu apoyo

Hola amigo cesar con otro compañero me puse a realizar un proyecto similar y quedo bastante bien a mi parecer revisalo y me avisas saludoss:apreton:
 

Adjuntos

  • cesarim.rar
    9.8 KB · Visitas: 72
Hola que tal, alguien podria hecharme una manita con las interrupciones en la comunicacion en serie...
He estado leyendo acerca del tema y ando un poco confundido...
esto es lo que he logrado hasta ahorita
Código:
DEFINE HSER_RCSTA 90h 'Set  receive register to receiver enabled
DEFINE HSER_TXSTA 26h ' Set transmit register to transmitter enable
DEFINE HSER_BAUD 9600 ' Set baud rate

x   var byte
y   var byte
 

trisb=$00

x=2

INTCON=%11000000  'Habilita interrupciones de registro PEIE
on interrupt goto lee_serie
PIE1.5 = 1 
  
ciclo:  
  portb=x
  goto ciclo
  
   Disable 
 lee_serie     
    hserin [x]
    hserout [x]
resume
enable

La comunicacion la estoy haciendo virtualmente por el momento con el VSPD, proteus y el hiperterminal de microcode.
La idea es sencilla, mando un caracter a tráves de microcode y el pic lo recibe y este mismo me lo regresa, el caracter enviado se muestra en el puerto B a tráves de leds, el problema es que no importa cual caracter envie la visualizacion en los leds no cambia, es decir si mando un 6 o un 9, permanecen encendidos los mismos leds sin cambio alguno.
Yo se que no es necesario usar las interrupciones para este programita tan sencillo y que sin interrupciones se puede lograr lo que quiero, pero necesito aprender a usar las interrupciones ya que lo implementare en un programa un poco mas complejo.
salu2
 
Última edición:
Hola que tal, alguien podria hecharme una manita con las interrupciones en la comunicacion en serie...
He estado leyendo acerca del tema y ando un poco confundido...
esto es lo que he logrado hasta ahorita

Yo se que no es necesario usar las interrupciones para este programita tan sencillo y que sin interrupciones se puede lograr lo que quiero, pero necesito aprender a usar las interrupciones ya que lo implementare en un programa un poco mas complejo.
salu2

Aqui hay un ejemplo de lubeck click aqui con este ejemplo yo lo pude simular
mi ejemplo

estamos en contacto...
 
Amigo Reyvilla agradesco tu paciencia en haberme ayudado ya entendi muy el codigo que me enviastes y me ayudo mucho

otra cosa amigo que ahora me esta saturando un poco si quisiera esos led trabajarlos cada uno con pulsadores se puede lograr me refiero a que el led1 prenda cuando prsiona el pulsador y se apague con el tiempo dado por el codigo
 
Amigo Reyvilla agradesco tu paciencia en haberme ayudado ya entendi muy el codigo que me enviastes y me ayudo mucho

otra cosa amigo que ahora me esta saturando un poco si quisiera esos led trabajarlos cada uno con pulsadores se puede lograr me refiero a que el led1 prenda cuando prsiona el pulsador y se apague con el tiempo dado por el codigo

Hola que bueno que hayas aprendido eso es lo importante ya que para eso es el foro, no solo aprendes tu yo también, con respecto a lo que mencionas de los led's con pulsadores, yo diría que casi todo es posible con los pic y de seguro que si se puede, la cuestión es sacarle el mayor provecho al pic, claro esta sin suturarlo. Ahora lo que se me ocurre es que si le damos prioridad al tiempo al presionar el pulsador este va seguir Incrementando solo que va a cambiar el estado del led hasta que termine su tiempo y vuelva a cambiar de estado por desbordamiento del registro asignado para ese led...Si te fijaste en el código anterior las salidas del puerto A al presionar el botón cambian y eso sin afectar los tiempo de los leds.

Un dato importante que no se si notaste es que a pesar de manejar tiempos bien precisos a través del reloj de tiempo real interno del pic, es que si dentro de nuestro loop de interrupción hacemos muchas otras sentencias el tiempo se ve afectado para largos periodos, un ejemplo seria una hora, si dentro del loop interrupción tenemos muchas sentencias eso genera un retardo y mas en pbp, eso sucede porque consumimos el tiempo y eso pasa porque al entrar al loop se deshabilita la interrupción y el reloj deja de funcionar hasta que se vuelva habilitar la interrupción, si en ese proceso utilizamos muchas sentencias las cuales generan el uso de muchos ciclos de maquina, con lo cual empezamos a degradar la precisión de los tiempos de los leds. Es por eso que solo se uso una sola sentencia en la interrupción para que sea lo mas preciso posible.

Cualquier cosa me avisas saludosss :apreton:
 
Si entendi eso muy bien y gracias por la aclaracion ya que comence hacer pruebas pàra ir aprendiendo y en algun momento afecto como tu me indicas eso si lo logre manejar lo que ahora mi inquietud es agregar pulsador a cada led y por decir
boton1(activa) led_1
boton2(activa) led_2
cuando se pulse el boton1 el led_1 encienda hacerle un bucle de 5 min para probar y luego que se apgue solo y funcione hasta que lo vuelvas a preesionar y tambien que tenga la opcion de si presionastes y prendio el led si no se cumple los 5 min y vuelves a presionar el boton1 que este tenga la opcion tambien de apgarlo asi no se haya cumplido los 5 min estoy intentandole pero no logro y en realidad ni idea de como hacerlo si he echo prender y apagar leds con botones pero de esta manera con interrucion jamas y ahora quisiera intentarlo pero no logro nada si podria darme una idea te estare agradecido ya que me estas ayudando mucho
 
Algo a tomar en cuenta es el tiempo de los registros ya que se manejan los led's con el comando toggle, y eso quiere decir que puedes cómodamente colocarle prioridad a un pulsador a pesar de no haber completado el tiempo el registro, ahora que va a pasar con ese registro se va a resetear al momento de pulsar el pulsador o va a seguir contando el tiempo restante hasta los 5min.?:confused: Alli es donde esta el problema, ya que no se si seria solo para cuando apagues el led's que se resetee el registro y para cuando se encienda no? :confused:Depende de eso se hace mas o menos complejo el asunto. Planteate bien eso y me avisas saludoss :apreton:
 
Reyvilla mira aun no me sale el codigo que te mencione pero intentandole logre ya que al menos me respondiera este puylsador Boton que al presionarse se encienda el led lo logra hacer lo que no me respeta aun es el tiempo quisiera saber en que estoy fallando quisiera que el led de encendido sea exacto 10 seg o 20 seg o min si le pusiera pero ahora solo cuenta por contar como te digo no es el ejemplo que postee q tengo en mente realizar pero al menos ya he podido dar con el pulsador que haga prender este led espero tu respuesta y gracias por la ayuda
Código:
@ DEVICE PIC16F628A         
@ DEVICE INTRC_OSC_CLKOUT    
@ DEVICE WDT_OFF             
@ DEVICE PWRT_OFF            
@ DEVICE LVP_OFF               
@ DEVICE CPD_OFF             
@ DEVICE PROTECT_OFF        

DEFINE OSC 4 

CMCON = 7   

TRISB = %00000000 
TRISA = %11111000 
PORTA = %00000000
PORTB = %00000000

TLED1       VAR word  
MinutO      var byte   
Segundo     Var Byte     
MAS_TIEMPO  VAR BYTE
INITIO      VAR BYTE
FLAG0      VAR BIT
Juego       VAR WORD

LED_1       var PORTB.0  
LED_2       VAR PORTB.1 
IntE        VAR PORTB.7
                           
BLuz1       VAR PortA.0
BLuz2       VAR PortA.1
BLuz3       VAR PortA.2
BOTON       VAR PortA.7 

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

FLAG0=0
INICIO: 

    IF BOTON THEN
    toggle led_2;=1
    flag0=1
    ENDIF
    while BOTON = 1
    wend
    
GOTO INICIO

DISABLE            
MI_INTERRUPCION: 
INITIO  = INITIO  + 1
MAS_TIEMPO = MAS_TIEMPO + 1
IF INITIO = 3 THEN
INITIO = 0
TOGGLE INTE
ENDIF

IF MAS_TIEMPO => 61 THEN
MAS_TIEMPO = 0
TOGGLE LED_1 
FLAG0=1
TLED1 = TLED1 + 1

IF LED_2 = 1 AND flag0=1 and TLED1 = 10 THEN
LED_2 = 0 
TLED1 = 0
flag0=0
ENDIF
endif

INTCON = %10100000 
Resume
Enable



Código:
IF LED_2 = 1 or flag0=1 and TLED1 = 10 THEN
LED_2 = 0 
TLED1 = 0
flag0=0
ENDIF
endif

INTCON = %10100000 
Resume
Enable
aca me respeta el toggle prende y apaga pero si lo dejo prendido aun no me respeta el tiempo asignado



aca mejoro un poco mas pero el boton no es preciso espero lo puedas compilar y me sigas ayudando por favor
Código:
IF MAS_TIEMPO => 61 THEN
MAS_TIEMPO = 0
TOGGLE LED_1 
if FLAG0=1 and led_2=1 then
TLED1 = TLED1 + 1

IF LED_2 = 1 or flag0=1 and TLED1 = 10 THEN
LED_2 = 0 
TLED1 = 0
flag0=0
ENDIF
endif
endif
 
Última edición:
hola aun no logro entender que es lo que quieres que haga con exactitud, quieres que al presionar el botón el led cambie de estado, osea si esta apagado cuando presionas el botón encienda y si esta encendido cuando presiones el botón se apague, por otro lado el tiempo va a empezar después de ser presionado el botón o va a seguir con el tiempo que ya llevaba.
 
saludos amigo reyvilla mira si presiona el pulsador el led cambia de estado como tu mencionas es correcto presionas pulsador prende el led y empieza el conteo si le pusimos 10 min y no se volvio a presionar el pulsador se apaga el led cumplido los 10 min pero si se presiono el pulsador antes de los 10 min por decir a los 2min o 5 min entoncs el led se apaga y el conteo vuelve a cero espero puedas ayudarme saludos
 
ok siendo así es mucho mas sencillo el código, claro esta no va a contar solo si no hasta que se presione el botón, y digamos que tenemos 4 pulsadores y 4 led's, del LED1 A LED4 Y del PULSADOR1 A PULSADOR 4, los cuales se corresponden, PULSADOR1 activa el LED1, siendo así tendrías una variable por cada led y como son individuales no afectaría el tiempo de ninguna, y con una condicional colocas el botón que si se presiona y esta el led encendido lo apague y resetee la variable y listo ya tendrías solucionado el problema.
 
Saludos reyvilla quisiera nuevamente pedirte que me ayudes mira no logro aun mejorar mi programa si pudieras ayudarme ya que me estoy enredando y no logro encontrar solucion te dejo el codigo con la simulacion haber si lo puedas revisar y decirme en que estoy fallando cuando presiono el pulsador no es preciso, quiero decir que no siempre funciona a la primera pulsacion
Le agrege pulsador2 para que trabaje con otro led2 con el mismo proposito del pulsador1 o boton. La idea es que cualquiera de los dos pulsadores BOTON0 o BOTON1 active o desactive su correspondiente leds sea LED0 o LED1 si este esta prendido y no se volvio a presionar el pulsador que se apague despues del tiempo dado en este caso 10 seg y si se presiona antes del tiempo de los 10 seg que apage el led y resetee el conteo si logras chequear el codigo el conteo solo lo logra hacer para uno de ellos, el otro no cuenta solo funciona como un toggle espero puedas ayudarme y poder saber que me falta Saludos
ahi te dejo todo el codigo
Código:
@ DEVICE PIC16F628         
@ DEVICE INTRC_OSC_CLKOUT    
@ DEVICE WDT_OFF             
@ DEVICE PWRT_OFF            
@ DEVICE LVP_OFF               
@ DEVICE CPD_OFF             
@ DEVICE PROTECT_OFF        

DEFINE OSC 4 

CMCON = 7   

TRISB = %00000000 
TRISA = %11111000 
PORTA = %00000000
PORTB = %00000000

TLED1       VAR word  
TLED2       VAR word
MinutO      var byte   
Segundo     Var Byte     
MAS_TIEMPO  VAR BYTE
INITIO      VAR BYTE
FLAG0       VAR BIT
FLAG1       VAR BIT
Juego       VAR WORD

LED_1       var PORTB.0  
LED_2       VAR PORTB.1 
LED_3       VAR PORTB.2
IntE        VAR PORTB.7
                           
BLuz1       VAR PortA.0
BLuz2       VAR PortA.1
BLuz3       VAR PortA.2
BOTON       VAR PortA.7 
BOTON1      VAR PortA.6

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

FLAG0=0
FLAG1=0

INICIO: 

    IF BOTON  THEN Salto1
    IF BOTON1 THEN Salto2
        
    salto1:
    if BOTON THEN
    toggle led_2
    TOGGLE FLAG0
    ENDIF
    while BOTON = 1 :Wend
    
    salto2:
    if BOTON1 THEN
    toggle led_3
    TOGGLE FLAG1
    ENDIF
    while BOTON1 = 1 :Wend
     
GOTO INICIO

DISABLE            
MI_INTERRUPCION: 
MAS_TIEMPO = MAS_TIEMPO + 1
IF MAS_TIEMPO => 61 THEN
MAS_TIEMPO = 0
TOGGLE LED_1 
if FLAG0=1 and led_2=1 then
TLED1 = TLED1 + 1

IF LED_2 = 1 or flag0=1 and TLED1 = 10 THEN
LED_2=0 
if led_2=0 then
flag0=0
TLED1=0

IF LED_3 = 1 or flag1=1 and TLED2 = 10 THEN
LED_3=0 
if led_3=0 then
flag1=0
TLED2=0
endif 
endif
endif
endif
endif
endif

INTCON = %10100000 
Resume
Enable
 

Adjuntos

  • eje1.rar
    7 KB · Visitas: 58
Saludos cesarim
Me parece que con los cambios que realice a tu programa, ya hace lo que requieres.
Ya el amigo reyvilla te enseño algunos conceptos, y con estas modificaciones que realice,
creo que podrás continuar con tu proyecto.

Compara tu programa con el que adjunto para que puedas ver en donde se realizaron los cambios.

Suerte.
 

Adjuntos

  • eje1(2).rar
    11.1 KB · Visitas: 95
te agradesco mucho les agradesco mucho a ambos por que entiendo ya mejor como es trabajar con pic y en verdad las dudas me atormentaban que nio dormir podia practicando de una y otra forma y ahora ya esta la cuarta parte de mi codigo gracias a su apoyo seguire y pues solo gracias y mas gracias
 
Amigos vamos con un proyecto interesante control de acceso son clave utilizando un teclado matrixal de 4x4,pic 16f84a y testigos de operatividad, al ingresar los cuatro digitos correctamente se energiza un rele durante tres segundos ubicado en el pin door del pic ,si la clave es incorrecta se emite tres activaciones en bip y led ubicados en el puerto A0 y A1 respectivamente, la activacion de cada tecla va acompañado de la visualizacion del led ubicado en pin 18 del pic 16f84a.

codigo fuente en pic basic pro
Código:
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz

;creacion de variables
tecla var byte                 ;donde se guarada tecla pulsada
repit var byte                 ;para hacer repeticiones 

;configuracion de pines del pic 16f84a

bip var porta.0      ;donde se conecta la chicharra
led var porta.1  ;donde se conecta el led 
door var porta.2   ;donde se conecta rele para la puerta

a var portb.0       ;pines de las filas 
b var portb.1
c var portb.2
d var portb.3 

uno var portb.4
dos var portb.5
tres var portb.6
cuatro var portb.7

iniciando:        ;incica funcionamiento del sistema 

high led:high bip
pause 1000
low led:low bip
goto teclauno        ; comparar clave

barrido:
low a               ;sensar fila a
if uno=0 then tecla=1:return
if dos=0 then tecla=2:return
if tres=0 then tecla=3:return
if cuatro=0 then tecla=10:return
high a
low b
if uno=0 then tecla=4:return
if dos=0 then tecla=5:return
if tres=0 then tecla=6:return
if cuatro=0 then tecla=11:return
high b
low c
if uno=0 then tecla=7:return
if dos =0 then tecla=8:return
if tres=0 then tecla=9:return
if cuatro=0 then tecla=12:return
high c
low d
if uno=0 then tecla=14:return
if dos=0 then tecla=0:return
if tres=0 then tecla=15:return
if cuatro=0 then tecla=13:return
high d
pause 10
goto barrido

;rutina antirrebote de teclas
ptecla:
high led:low bip
pause 100
low led :low bip
espacio:
if uno=0 then espacio
if dos=0 then espacio
if tres=0 then espacio
if cuatro=0 then espacio
pause 25
return
 ;rutina para comparar claves

teclauno:
gosub barrido
gosub ptecla
if tecla=1then teclados
goto falso

teclados:
gosub barrido:gosub ptecla
if tecla=2 then teclatres
goto falso1

teclatres:
gosub barrido:gosub ptecla
if tecla=3 then teclacuatro
goto falso2

teclacuatro
gosub barrido:gosub ptecla
if tecla=4 then open
goto falso3

open:
for repit=1 to 2
pause 100
high led:high bip
pause 100
low led:low bip
next

high door
pause 3000
low door 
goto teclauno

;rutina teclas erroneas

falso:
gosub barrido:gosub ptecla
falso1:
gosub barrido:gosub ptecla
falso2:
gosub barrido:gosub ptecla
falso3:
for repit=1 to 3
pause 100
high led:high bip
pause 100                      
low led: low bip
next
goto teclauno
end
Me gustaría colocarle un teclado matricial de 3*4 y si la programación la tengo que modificar
 
Última edición por un moderador:
Atrás
Arriba