Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
inicio: ; inicio de la linea de programa
if (pulsador=1) then gosub secuencia
pause 100
if (pulsador1=1) then gosub secuencia1
pause 100
if (pulsador2=1) then gosub secuencia3
pause 100
goto inicio
secuencia:
HIGH portb.0
PAUSE 10000
LOW portb.0
goto inicio
secuencia1:
HIGH portc.0
PAUSE 10000
LOW portc.0
goto inicio
secuencia3:
HIGH porta.0
PAUSE 100
LOW porta.0
goto inicio
end ; fin del programa
No lo tomes a mal pero te sugiero que borres y comiences de nuevo.
La Instrucción GOSUB es para derivar el programa a una subrutina que comienza en una etiqueta y termina con RETURN(no existe tal cosa en tu programa .
De la ayuda del MicroCode
Ver el archivo adjunto 190079
Si usas retardos de 10seg(PAUSE 10000, tu programa estará allí esperando que se cumpla el tiempo y recién luego retornara para ver que hiciste con los pulsadores, etc. etc.
SI necesitas estar atento a los pulsador tienes que encontrar la forma de no "matar" durante todo ese tiempo al microcontrolador para que este pueda revisar lo que tú haces con ellos.
Puede ser porque no te pones tú en el lugar del microcontrolador y el trabajo que según tus instrucciones debe realizar.
Recuerda y grabate que el microcontrolador solo hace una cosa a la vez pero el truco es que lo hace muy rápido para nosotros y así como una película de video es una sucesión de "fotos"a una velocidad rápida, tú puedes implementar un sistema similar en el programa.
Para qué quieres esperar sin hacer nada mas si debes prender algo durante x tiempo y luego apagarlo?
Hay varias formas de resolver esto según la precisión que amerite la situación.
Puedes realizar un contador con una variable que se incremente cada determinado tiempo(muy corto...ejemplo 50ms) y cada vez que la incrementas revisas los otros pulsadores y haces según tú antojo lo que debas y cuando llegas al tiempo según la suma de estos pequeños retardos apagas lo que has prendido.
La de mayor precisión sería usando interrupciones pero sospecho, por como vas con la programación en general, que lo dejes para más adelante.
Low portb.0
Low portb.1
inicio:
if pulsador1=1 then
While pulsador1=1 : wend
portb.0=~portb.0
Endif
if pulsador2=1 then
While pulsador2=1 : wend ;Antirebote
portb.1=~portb.1 ;invierte el estado del pin del puerto
Endif
goto inicio
Le sugiero y para facilitar el análisis y posibles respuestas, hace un archivo con simulación y código y súbalo como adjunto.
Como se dara cuenta hay mil formas o poco menos de hacer esto.
Para mi el error es el tipo de display con el controlador que no es el que corresponde.
'****************************************************************
'* Name : Puerto.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2020 [RicBevi ] :) *
'* : All Rights Reserved *
'* Date : 11/05/2020 *
'* Version : 1.0 *
'* Notes : PIC 16F628A + decodificador 7447 y 4511 conectados*
'* : a B.0...B.3 con display de 7 segmentos AC y CC *
'* : respectivamente *
'****************************************************************
' fusible de programación del pic
_intrc_osc_pwrt_on_wdt_off_mclr_off_lvp_off_protect_off
' uso el oscilador interno y los pines son digitales, sin wdt,mclr, protección de código, programación de bajo voltaje
DEFINE OSC 4 ' velocidad de trabajo del oscilador
cmcon = 7 ' apago comparadores analógicos
trisb = 0 ' puerto B es salida
portb = 0 ' limpio puerto a estado bajo
i var byte ' defino variable
inicio: ' inicio de la rutina/programa
for i = 0 to 9 ' Para el valor de i entre 0 y 9
portb = i ' el puerto toma el valor de i
pause 500 ' espero medio segundo
next i ' incremento i hasta el valor de 9
goto inicio ' voy a iniciar todo de nuevo
end ' fin del programa
Gracias, en caso de querer conectar dos contadores pero sin decodificador en un PIC16F877A solo me funciona bien el primer contador que esta conectado en el puerto bMe olvide incluir el código de mi simulación pero es lo que apreciaba en la imagen de lo aportado en la consulta más pequeños agregados sin el cual a veces las cosas no funcionan.
Código:'**************************************************************** '* Name : Puerto.BAS * '* Author : [select VIEW...EDITOR OPTIONS] * '* Notice : Copyright (c) 2020 [RicBevi ] :) * '* : All Rights Reserved * '* Date : 11/05/2020 * '* Version : 1.0 * '* Notes : PIC 16F628A + decodificador 7447 y 4511 conectados* '* : a B.0...B.3 con display de 7 segmentos AC y CC * '* : respectivamente * '**************************************************************** ' fusible de programación del pic _intrc_osc_pwrt_on_wdt_off_mclr_off_lvp_off_protect_off ' uso el oscilador interno y los pines son digitales, sin wdt,mclr, protección de código, programación de bajo voltaje DEFINE OSC 4 ' velocidad de trabajo del oscilador cmcon = 7 ' apago comparadores analógicos trisb = 0 ' puerto B es salida portb = 0 ' limpio puerto a estado bajo i var byte ' defino variable inicio: ' inicio de la rutina/programa for i = 0 to 9 ' Para el valor de i entre 0 y 9 portb = i ' el puerto toma el valor de i pause 500 ' espero medio segundo next i ' incremento i hasta el valor de 9 goto inicio ' voy a iniciar todo de nuevo end ' fin del programa
Por cierto en sus esquemas dejas pines libres o flotantes(sin ninguna referencias o a GND o a Power) en los IC decodificadores y eso puede traer problemas en la simulación o en la práctica por lo que es una buena práctica no hacerlo.
No estan adjuntados los que subi? bueno no los ejecuta?Al menos a mi me pasa que el archivo pbp no corresponde al hex adjuntado.
Declaras y limpias el puerto B y C en el programa y usas el display conectado al B y al D en la simulación, el cristal de esa forma (en cortocircuito los pines del oscilador) jamas funcionara en la realidad...¿para que esta al igual que los capacitores de 22pF? no son necesarios para la simulación.
Por otro lado si no declaras la velocidad creo que el PBP toma como que sera 4MHz por defecto pero en las propiedades del pic lo declaras a 1MHz.
Esto es importante porque el compilador calcula los retardos de tiempo en función a dicho cristal declarado.
Te aclaro que el PBP lo manejo muy por arriba ya que hace mas de 10 años que migre al Proton Basic por las limitaciones que tiene dicho compilador.
Debes trabajar y mucho ya que esto es horas y horas de silla delante del compilador y simulador pero debes basarte en como son las cosas realmente.
No puedes poner un display de led sin decodificador en un puerto, si no haces tú en el programa el trabajo de pasar el numero a lo que se debe mostrar en los dígitos mediante el prendido de los segmentos.
Subiste un ejemplo con LookUp a eso me refiero y eso es lo que necesitas o alguno otra forma pero no la que adjuntaste en cuanto a programación.
No estan adjuntados los que subi? bueno no los ejecuta?
Bueno la cosa esque en mi trabajo así me lo pide, conectar los dos display sin el decodificador
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2020 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 12/05/2020 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
TRISB = 0
PORTB = 0
TRISC = 0
PORTC = 0
'DECLARACION DE VARIABLES
i VAR BYTE
a VAR BYTE
b VAR BYTE
un0 VAR a.0
un1 VAR a.1
un2 VAR a.2
un3 VAR a.3
de0 VAR b.0
de1 VAR b.1
de2 VAR b.2
de3 VAR b.3
INICIO:
FOR i=99 TO 0 STEP -1
b=i/10
a=i-b*10
PORTB.0=un0
PORTB.1=un1
PORTB.2=un2
PORTB.3=un3
PORTC.0=de0
PORTC.1=de1
PORTC.2=de2
PORTC.3=de3
PAUSE 500
NEXT i
GOTO INICIO
En los PIC con un solo puerto suelen llamarse PORTA o PORTB, en este caso: PORTA¿En el PIC12F635 cómo llamaría a sus pines de salida?
High Pin para establecer un estado alto y Low Pin para establecer un estado bajo.¿Me podrían brindar una mano con algún ejemplo sencillo, como por ejemplo; encender un LED?