Con el permiso de dogflu y los moderadores me gustaria empezar un mini cursillo de comandos basicos del programa pic simulator ide con ejemplos y explicando las dudas que pueda tener el personal (aunque yo sea un principiante, un noob :?). Hago esto por que personalmente me costó mucho encontrar informacion, codigos y esquemas sobre este compilador y me gustaria ayudar a la gente que empieza la programacion con pic como yo. El programa para simular será el programa Isis de Proteus 7 professional. El programa para crear el codigo en basic y compilarlo sera el PIC SIMULATOR IDE. Recomiendo que miren un poco esta web ucontrol para las personas que quieran aprender mas cosas a parte de las que haremos en el cursillo, quiero destacar que hago el cursillo en calidad de aprendiz, ire explicando las cosas que voy aprendiendo con los topic de este foro y las diferentes paginas web que hay en internet, pero con esquemas hechos y codigos hechos por mi, naturalmente no me gusta copiar codigos, por que copiando no se aprende. El mini cursillo seria el siguiente: 1. Encender y apagar led. (hecho pagina1) 2. Parpadeo de led. (hecho pagina1) 3. Encender led en funcion de un pulsador. (hecho pagina1) 4. Utilizar matriz de led. (hecho pagina1) 5. Utilizar matrid de led con un 74ls164 (registro de desplazamiento 8bit) (hecho pagina1) 6. Utilizar display 7 segmentos con pic. (contador 0 9 hecho pagina1) 7. Utilizar display de 7 segmentos con pic + 74ls164 (registro de desplazamiento 8bit) ... (lo que vaya surgiendo).
¿ Que opinais al respecto ?
Correjido el fallo ortografico (gracias a dogflu), cambiado el "echo" por "hecho" ya que hacer se escribe con "h" y esta "h" la conservan todos sus derivados jim_17: Si, me pase por su tema, y ha hecho un trabajo muy bueno, pero creo que (sin des preciar el gran trabajo que ha echo) ahi se maneja manej a mas la funcion de lcd y no tanto las otras multiples funciones cuotidianas que existen en el compilador. No entiendo lo que quieres decir on empatar su tema, me me lo puedes puedes explicar ? :-/ aitopes: Hola Jim! Adelante con el poryecto, ayudare en lo que pueda. (y probablemente te "robe" algunos ejemplos para mejorar el "cursillo" que tengo en uControl ;).
Aqui va el primer primer ejemplo:
ENCENDER Y APAGAR UN LED a una frecuencia de 1 HZ: El PIC es un 16F627A (o 628A, o648A, o casi cualquiera de 18 pines). El LED esta con su anodo en PORTB.0, y tiene el catodo conectado a GND. Código:
TRISB = %00000000 'Declaro TODO el puerto B como salidas. loop: 'Comienzo un bucle. Esta es solo una etiqueta "a la que puedo saltar". PORTB.0 = 1 'Pongo el pin en alto, el led enciende. WaitMs 500 'Espero medio segundo PORTB.0 = 0 'Pongo el pin en bajo, el led se apaga. WaitMs 500 'Espero medio segundo Goto loop 'Salto a la etiqueta "loop", y recomienza el bucle. END 'Fin del ejemplo
Saludos! :mrgreen: jim_17: Aitopes felicitaciones con tu pagina web, me a yudo mucho a comprender el desplazamiento de registro. Espero que el año que viene pueda a yudar mas al foro por que ya estaré estudiando ingenieria electronica. Aqui os va una foto del esquema con el conocido 16f84a con el codigo de aitopes.
Si alguien no comprende lo que es frecuencia 1hz os lo explico: frecuencia = 1/tiempo que tarda en hacer un ciclo---> por lo tanto el tiempo en hacer un ciclo = 1s -----> un ciclo = encender una vez el led y apagarlo, es decir, la mitad de tiempo para encender el led 500ms y la otra mitad para apagarlo 500ms. jim_17: Aqui os pongo un ejemplo mas de como encender un led dependiendo del estado de un boton. Si el boton esta activado el led se enciende, si esta apagado el led se apaga. (Estas seran las funciones basicas, las pasaré rapido, si hay alguna duda preguntad) Código:
' Encender un led en funcion de ' ' un boton pic 16f84a ' ''''''''''''''''''''''''''''''''''''' TRISA = %00000001 'Establecemos el pin RA0 como pin de entrada TRISB = %00000000 'Establecemos todos los pines del puertoB como salidas PORTB = %00000000 'Empezamos poniendo el puerto b a 0 (led apagado)
main: 'programa principal (cadauno pone la etiqueta que quiere) If PORTA.0 = 1 Then ' Si el pulsador esta activado enciende el led High PORTB.0 'Tambien podemos utilizar portb.0 = 1 Else ' Si el pulsador no esta activado el led no se enciende Low PORTB.0 'Tambien podemos utilizar portb.0 = 0 Endif Goto main End
Otra forma de hacer lo mismo que el ejemplo anterior, pero más rapido y con menos codigo: Citar ' Encender un led en funcion de ' ' un boton pic 16f84a ' Version 2 ''''''''''''''''''''''''''''''''''''' TRISA = %00000001 'Establecemos el pin RA0 como pin de entrada TRISB = %00000000 'Establecemos todos los pines del puertoB como salidas PORTB = %00000000 'Empezamos poniendo el puerto b a 0 (led apagado) main: 'programa principal (cadauno pone la etiqueta que quiere) PORTB.0 = PORTA.0 'Copio en el pin del led el estado del pulsador... goto main End jim_17: Tienes toda la razón. Maneras de hacer un "programa" hay miles, la cuestion esta en encontrar la propia.
Mañana si puedo pasaré los temas 4 y 5 en el foro, porque creo que esto es muy basico y la gente no entra mucho y asi poder seguir con algo mas avanzado. dogflu66: Cita de: jim_17 en 05 de Diciembre de 2007, 16:44:05
Si, me pase por su tema, y ha echo un trabajo muy bueno, pero creo que (sin despreciar el gran trabajo que ha echo) ahi se maneja mas la funcion de lcd y no tanto las otras multiples funciones cuotidianas que existen en el compilador. No entiendo lo que quieres decir on empatar su tema, me lo puedes explicar ? :-/
Cuando te dijeron lo de "empatar su tema", El moderador se referia a no iniciar temas redundantes, ya que entre otras muchas funciones la de
un moderador es la de intentar mantener el foro ordenado, con esto tambien se refiere a que ningun hilo es propiedad de nadie, ni siquiera del que lo creo, un hilo puede ser continuado por uno o mas foreros, simplemente tiene que tener en cuenta que la continuacion del hilo este relacionada con el tema abierto previamente. PD. Esto solo lo aclaro como moderador que soy tambien de este nuestro y magnifico foro Todopic. De todas formas tengo que aclarar que el hilo anterior sobre el PSI, es un hilo que se basa en una placa entrenadora, por lo que todos sus ejemplos se mueven al rededor de este hard, siendo el lcd uno mas de sus dispositivos, si se sigue indagando en el hilo se puede ver que toma una nueva direccion para interactuar con la pantalla y teclado del pc entre otras cosas. En realidad nunca tuve la intencion de que fuera un hilo basico, ya que lo que se expone es lo que se suele buscar con los pic y que se suele tardar incluso años en conseguirlo. Y por supuesto tienes todo mi apoyo a este nuevo hilo.... ASI QUE ANIMO Y ADARLE DURO... :-) jim_17: Thanks, mi intención haciendo esto es facilitarle la busqueda a la gente que empieza como yo, y haciendo esto tambien aprendo y asi me obligo a aprender.
Como ya tengo otro esquema preparado os paso la matriz de led 2 X 8 (dos filas, ocho columnas) Led parpadeando. Aquí teneis el código: Código: TRISA = 0 'puerto A como salida TRISB = 0 'puerto B como salida Symbol fila1 = PORTA.0 'establecemos fila1 = porta.0 Symbol fila2 = PORTA.1 'establecemos fila2 = porta.1 Dim parpadeo As Byte 'variable parpadeo como byte Dim reset As Byte 'variable reset como byte Dim i As Byte 'variable i como byte PORTA = 0 'todo el puerto a = 0 PORTB = 0 'todo el puerto b = 0 main: 'etiqueta programa principal Gosub reset 'apaga todos los led High fila1 'encendemos la fila 1 y vamos variando portb Gosub parpadeo 'enciende y apaga el led Low fila1 'apaga la fila1 para empezar con la fila2
Gosub reset High fila2 Gosub parpadeo Low fila2 Goto main 'hacemos un bucle para que el parpadeo sea constante End reset: PORTA = 0 'porta = 0 apagamos todas las filas PORTB = %11111111 'portb = %11111111 porque los led se encienden cuando portb.n = 0 el portb actua de masa Return ' volvemos para continuar con el codigo parpadeo: PORTB.0 = 0 'lo ponemos a 0 para prender el 1r led WaitMs 200 ' esperamos 200 ms para ver el led encendido PORTB.0 = 1 ' con un 1 apagamos el led PORTB.1 = 0 'hacemos lo mismo con los led de al lado WaitMs 200 PORTB.1 = 1 PORTB.2 = 0 WaitMs 200 PORTB.2 = 1 PORTB.3 = 0 WaitMs 200 PORTB.3 = 1 PORTB.4 = 0 WaitMs 200 PORTB.4 = 1 PORTB.5 = 0 WaitMs 200 PORTB.5 = 1 PORTB.6 = 0 WaitMs 200 PORTB.6 = 1 PORTB.7 = 0 WaitMs 200 PORTB.7 = 1 Return 'volvemos del sub para continuar con el codigo
Otro de lo mismo, pero este insertado como "codigo freebasic " Código GeSHi (freebasic): '********************************************************** 'Led intermitente******************************************
'********************************************************** AllDigital 'todos los pin como I/O TRISB.0 = 0 'PIN Puerto RB0 como salida Symbol led = PORTB.0 'Se asigna nombre al pin 0 del port B main: 'Nuestro Programa High led 'Enciende el led, Polariza Anodo Gosub espera 'Salto con retorno a la rutina de espera Low led 'Apaga el led, Polariza Anodo Gosub espera 'Salto con retorno Goto main 'Hace que nuestro programa no termine nunca End 'Separador (interrupciones y subrutinas). espera: 'Rutina de Pausa WaitMs 500 'Interrumpe el programa durante medio segundo Return 'Retorna despues del salto generado por un Gosub. jim_17: Lo que yo quiero no es que parpadee el led, sino que se vaya encendiendo un led tras otro. Ahora cuelgo como hacer un contador 0 - 9 utilizando los pines del pic.
a = portb.0 b = portb.1 c = portb.2 d = portb.3 e = portb.4 f = portb.5 g = portb.6
0= 1= 2= 3= 4= 5= 6= 7= 8= 9=
abcdef g 0000001= 1001111= 0010010= 0000110= 1001100= 0100100= 0100000= 0001111= 0000000= 0000100=
PORTB 01000000 01111001 00100100 00110000 00011001 00010010 00000010 01111000 00000000 00010000
= = = = = = = = = =
Decimal 64 121 36 48 25 18 2 120 0 16
Aqui os paso el codigo y la respectiva foto del montaj e en Isis Código: TRISA = %11111110 TRISB = %10000000 PORTA.0 = 0 ' display de anodo comun PORTB = %01111111 ' ponemos el portb = 1 por que el display se enciende cuando le enviamos un cero al catodo
Dim i As Byte 'variable i para la funcion for main: ' etiqueta principal For i = 0 To 9 ' como es un contador de 0 9 utiliz amos la funcion for PORTB = LookUp(64, 121, 36, 48, 25, 18, 2, 120, 0, 16), i ' seleccionamos el numero que queremos marcar con la funcion lookup PORTA.0 = 1 ' si i = 1 selecciona el 121 WaitMs 100 ' encendemos porta.0 y esperamos 100 ms Next i Goto main 'volvemos a main para iniciar el bucle End
jim_17: Vale, veo que no le interesa a mucha gente este mini-cursillo, pero no pasa nada, a medida que vayamos ampliando conocimientos seguramente ya le interesará a mas personas.
SE ADMITEN PROPUESTAS.
Aqui os dejo el esquema para encender las luces de una matriz de led 8X2 una a una. Código GeSHi (freebasic): Symbol fila1 = PORTA.0 'establecemos porta.0 como fila1 Symbol fila2 = PORTA.1 'establecemos porta.1 como fila2 Symbol clock = PORTB.6 'establecemos el clock como portb.6 Symbol data = PORTB.7 'establecemos data como portb.7 Dim reset As Byte Dim contador As Byte TRISB = %00000000 'puerto b como salida TRISA = %00000000 'puerto a como salida PORTB = %00000000 'puerto b apagado PORTA = %00000000 'puerto a apagado
main: 'etiqueta principal Gosub reset 'enviamos 0 al registro de desplazamiento fila1 = 1 'activamos la fila 1 Gosub uno 'enviamos un 1 al primer pin del registro de desplazamiento WaitMs 100 'esperamos 0.1s Gosub parpadeo 'le vamos enviando 0 al registro del desplazamiento y asi conseguimos el juego optico
fila1 = 0 'desactivamos la fila1 fila2 = 1 'activamos la fila2 y repetimos el mismo proceso Gosub uno WaitMs 100 Gosub parpadeo fila2 = 0 Goto main 'volvemos a main para continuar con el bulce End
reset: For reset = 0 To 7 'enviamos un 1 ocho veces data = 1 'los led se prenden cuando enviamos un 0 al registro de desplazamiento clock = 0 '--WaitUs 2 '---Todo lo marcado con un --- simboliza el proceso clock = 1 '--- que se sigue para enviar un uno logico al registro WaitUs 2 '--- de desplazamiento Next reset 'repetimos el enviar un 1 siete veces mas Return ' volvemos a la rutina cuando acaba el proceso
parpadeo: For contador = 0 To 7 'enviamos un uno ocho veces y asi vamos moviendo el registro data = 1 'la misma explicacion que en reset clock = 0 WaitUs 2 clock = 1 WaitMs 100 'esperamos 100ms para mover el led encendido hacia el lado Next contador Return 'volvemos a la rutina
uno: data = 0 'con este proceso enviamos un 0 clock = 0 'para que se prenda el primer led WaitUs 2 'y luego poder mover el led prendido clock = 1 'con el registro de desplazamiento WaitUs 2 ' Return 'volvemos a la rutina Como dije ya una vez, hay muchas maneras de hacer un codigo ahora os pondré aqui las etiquetas de los sub reset y parpadeo con la funcion while. Código GeSHi (freebasic): reset: reset = 0 While reset < 8 'mientras reset sea menor que ocho
data = 1 'el programa hara la funcion de enviar un 1 al registro de desplazamiento clock = 0 WaitUs 2 clock = 1 reset = reset + 1 ' sumamos un uno a reset cada vez que envia un uno al registro WaitUs 2 ' de desplazamiento para que no sea un bulce infinito Wend ' para indicar que aqui acaba el codigo que queremos que se repita mientras Return ' reset sea menor que 8 --> reset < 8 'volvemos a la rutina
parpadeo: contador = 0 While contador < 8 'establecemos el mismo criterio que lo explicado en reset data = 1 clock = 0 WaitUs 2 clock = 1 WaitMs 100 contador = contador + 1 Wend Return
aitopes: Citar
Vale, veo que no le interesa a mucha gente este mini-cursillo, pero no pasa nada, a medida que vayamos ampliando conocimientos seguramente ya le interesará a ma s personas. Hola Jim! No, no creo que sea asi. El hilo ya casi llega a las 100 visitas, y hace muy poco que esta disponible. :mrgreen: Por lo pronto, le voy a poner una chincheta para que este "a mano". Y sigue asi, que es muy util tener ejemplos claros y sencillos sobre este buen BASIC. ;) jim_17: Bueno, solamente queda un esquema mas, ya ire pensando y poniendo mas esquemas, espero que aun que sea una tonteria, si necesi tais que se explique algun esquema, lo que sea, si quereis añadir algo propio al cursillo, podeis hacerlo. No me gusta que solo posteen los moderadores, eso me hace pensar que no le interesa a nadie, alomejor es que es muy basico lo que hacemos, pero si quereis hacer algo mas high pedidlo.
Aqui os va el codigo de como manejar el registro de desplazamiento para hacer un contador 0 9. Código GeSHi (freebasic): Dim und As Byte 'variable de unidades Dim u As Byte 'variable u para utilizar en la funcion for Dim i As Byte ' variable i para utilizar en la funcion for TRISA = 0 'puerto a como salida TRISB = 0 ' puerto b como salida PORTA = 0 'todos los pines puerto a apagados PORTB = 0 'todos los pines del puerto b apagados Symbol dato = PORTB.7 ' dato sera igual a portb.7 Symbol clock = PORTB.6 'clock sera igual a portb.6 main: 'etiqueta principal For i = 0 To 9 'desde 0 hasta el 9 und = LookUp(126, 12, 182, 158, 204, 218, 250, 14, 255, 222), i 'buscamos el numero que queremos Gosub enviar 'enviamos los datos al registro de desplazamiento Next i 'siguiente numero Goto main 'iniciamos bucle End 'finalizamos el programa enviar: For u = 0 To 7 'enviamos 8 datos If und.7 = 0 Then 'si el bit 7 de la variable und = 0 dato = 1 'envia un uno al registro de desplazamiento clock = 0 'porque los led se encienden cuando hay un 0 WaitUs 1 ' clock = 1 ' WaitUs 1 ' Else dato = 0 'si el bit 7 es igual a 1 clock = 0 'envia un 0 al registro de desplazamiento WaitUs 1 'porque los led se encienden con un 0 logico clock = 1 ' WaitUs 1 ' Endif 'finalizamos el la condicion und = ShiftLeft(und, 1) 'movemos todos los bits hacia la izquierda Next u 'siguiente variable 1 PORTA.0 = 1 'una vez estan todos los bits enviados WaitMs 200 'encendemos porta.0 y esperamos 200ms PORTA.0 = 0 'luego apagamos el porta.0
jim_17: Bueno, bueno, bueno, me estube 2h intentando descubrir un fallo que hice en el
programita. El fallo era que modificaba la variable dec, y no me permanecian los numeros decimales, :P. Aqui os dejo el esquema y el codigo. Una cosa, alguien sabe como hacer el recuadro de proteus mas grande ? estube mucho rato mirando y nada ... :). Si hay algo que no entendeis no dudeis en preguntar. Tambien tengo que decir que las funciones que utilizo con "for" tambien se pueden hacer con la funcion "while", mas arriba hay un ejemplo. Aqui el codigo Código GeSHi (freebasic): Symbol data = PORTB.7 'dato de los decimales Symbol clock = PORTB.6 Dim d As Byte 'para la aplicacion for de los decimales Dim u As Byte 'para la aplicacion for de las unidades Dim i As Byte 'para la aplicacion for de envio de datos Dim e As Byte 'para la aplicaciof for de envio de datos Dim dec As Byte 'almacenaremos los datos decimales Dim und As Byte 'almacenaremos los datos de las unidades TRISA = 0 'puerto a como salidas TRISB = 0 'puerto b como salidas PORTA = 0 'puerto a apagado PORTB = 0 'puerto b apagado main: For d = 0 To 9 'decimales del 0 al 9 dec = LookUp(252, 96, 218, 242, 102, 182, 190, 224, 254, 246), d 'buscamos el decimal For u = 0 To 9 'unidades del 0 al 9 und = LookUp(252, 96, 218, 242, 102, 182, 190, 224, 254, 246), u 'buscamos la unidad PORTA.0 = 0 'apagamos porta para enviar los datos Gosub enviar2 'enviamos primero los datos de las unidades Gosub enviar1 'luego enviamos los datos de los decimales PORTA.0 = 1 'encendemos los display WaitMs 100 'esperamos 100ms para ver el cambio rapido Next u 'siguiente unidad Next d 'cuando acaba de escribir todas las unidades escribe un decimal mas y vuelve a escribir 9 unidades Goto main 'hacemos un bucle End 'finalizamos el programa
enviar1: 'sub enviar1, enviamos los datos decimales For i = 0 To 7 'enviamos 8 bit de datos If dec.0 = 0 Then 'si el bit 0 de la variable dec es igual a 0 data = 0 'envia un cero logico clock = 0 'porque el display ahora se enciende con un uno logico WaitUs 2 'en el registro de desplazamiento clock = 1 ' WaitUs 2 '
Else data = 1 'envia un uno logico clock = 0 '...lo explicado antes WaitUs 2 ' clock = 1 ' WaitUs 2 ' Endif 'finalizamos la funcion if dec = ShiftRight(dec, 1) 'desplazamos un bit hacia la derecha Next i 'next, para enviar el siguiente bit dec = LookUp(252, 96, 218, 242, 102, 182, 190, 224, 254, 246), d 'como la variable dec ha sido modificada debemos hacer que sea como anteriormente porque sino solo nos enviara 0 Return 'volvemos a la rutina
enviar2: 'sub enviar2, enviamos los datos de las unidades For e = 0 To 7 'enviamos 8 bit de datos If und.0 = 0 Then 'si el bit 0 de la variable und = 0 data = 0 'envia un cero logico clock = 0 'por que el display se enciende con un uno logico WaitUs 2 'en el registro de desplazamiento clock = 1 ' WaitUs 2 ' Else data = 1 'envia un uno logico clock = 0 '...lo explicado anteriormente WaitUs 2 ' clock = 1 ' WaitUs 2 ' Endif 'finalizamos la funcion if und = ShiftRight(und, 1) 'desplazamos un bit hacia la derecha Next e 'next para enviar el siguiente bit Return 'volvemos a la rutina
aitopes: Hola Jim! Buenisimo el ejemplo.
Podria mejorarse un poquitin...utilizando solo una rutina para escribir en el display. Antes de llamarla, se carga en una variable auxiliar el valor a mostrar, y luego llamas a la rutina. Esto haria el codigo mas compacto, mas fácil de mantener, y ademas evitarias tener que volver a "reconstruir" la variable despues de usarla en la rutina... Si puedo, el lunes posteo el programa con esas modificaciones. ;) Saludos!
mundotronic: Hola jim_17!, la verdad es una gran idea hacer es te curso de PSI, ya que resulta muy util y a mi parecer de todos los basic que conozco es el mas versatil y rapido para aprender. A proposito Aitopes, debo agradecerte por hacer tan didactica uControl, desde tu sitio aprendi todo lo que se de electronica y especialmente de micros y PSI (ademas de haber hecho la entrenadora para pics de 18 pine s y el modulo de 8 entradas/salidas). Adelante con el Hilo y cuando tenga un tiempito cuelgo algunos ejemplos de los proyectos que tengo realizados.
Saludos! :-/ PD: Adelante con este hilo que a medida que avanza s e pone cada vez mas interesante!
RockLee_89 : Define SIMULATION_WAITMS_VALUE = 10 'este instruccion es para la simulacion si lo quieren quemar en el micro solo quiten esta linea AllDigital 'todos los pines como digitales TRISB = %00000000 'todo el puerto B configurado como salida Dim a As Byte 'a la pongo como variable de tipo byte a=0 RB.0 = 1 'pongo a 1 el pin b0 del puerto b WaitMs 500 'le doy un retardo de 500ms inicio:
For a = 1 To 7 Step 1 'en esta instruccion repito a a 7 veces y depues que ejecute el otro for RB = ShiftLeft(RB, 1) 'desplazo el 1 que esta en el pin rb.0 del puerto b hacia la izquierda WaitMs 500 'le dejo un retraso de 500ms Next a a = 0 'pongo a=0 para no usar otra variable For a = 1 To 7 Step 1 'es otro bucle for que repetira 7 veces lo que esta adentro de este bucle RB = ShiftRight(RB, 1) 'desplazo el 1 que esta en el pin rb.0 del puerto b hacia la derecha WaitMs 500 'le doy un retraso de 500ms Next a Goto inicio RockLee_89 : Ahora el mismo programa del coche fantástico pero con instrucciones (if then)
Define SIMULATION_WAITMS_VALUE = 10 'este instruccion es para la simulacion si lo quieren quemar en el micro solo quiten esta linea AllDigital 'todos los pines como digitales
TRISB = %00000000 'todo el puerto B configurado como salida RB.0 = 1 'pongo a 1 el pin b1 del puerto b WaitMs 500 'le doy un retardo de 500ms izquierda: RB = ShiftLeft(RB, 1) 'desplazo el 1 que esta en el pin rb.0 del puerto b hacia la izquierda WaitMs 500 'le dejo un retraso de 500ms If RB.7 = 1 Then Goto derecha 'si rb.7=1 salto ala secuencia de derecha Goto izquierda derecha: RB = ShiftRight(RB, 1) 'desplazo el 1 que esta en el pin rb.1 del puerto b hacia la derecha WaitMs 500 'le doy un retraso de 500ms If RB.0 = 1 Then Goto izquierda 'si rb.0=1 salto ala secuencia de izquierda Goto derecha RockLee_89 : el mismo ejemplo que los 2 anteriores pero ahora utilizando los siclo wile y wend
Define SIMULATION_WAITMS_VALUE = 10 'este instruccion es para la simulacion si lo quieren quemar en el micro solo quiten esta linea AllDigital 'todos los pines como digitales TRISB = %00000000 'todo el puerto B configurado como salida Dim a As Byte RB.0 = 1 'pongo a 1 el pin b1 del puerto b WaitMs 500 'le doy un retardo de 500ms a=0 izquierda: While a < 7 'si a es menor a 7 ejecunta lo que esta entre while y wend a=a+1 RB = ShiftLeft(RB, 1) 'desplazo el 1 que esta en el pin rb.0 del puerto b hacia la izquierda WaitMs 500 'le dejo un retraso de 500ms Wend 'si no es menor a 7 ejecuta lo que esta despues de wend a=0 While a < 7 'si a es menor a 7 ejecunta lo que esta entre while y wend a=a+1 RB = ShiftRight(RB, 1) 'desplazo el 1 que esta en el pin rb.1 del puerto b hacia la derecha WaitMs 500 'le doy un retraso de 500ms Wend 'si no es menor a 7 ejecuta lo que esta despues de wend a=0 Goto izquierda
dogflu66:
RockLee_89 : Bueno amigos el siguiente programa que les dejo es un contador de 0 a 99 con 2 circuitos 7447 y 2 display de ánodo común.
El programa esta implementado con el puerto (a) para poder sumar una variable la cual cera programado en la eeprom del pic y la cual cera el punto final del contador cuyo valor cera mínimo de 0 y máximo de 99. El programa funcionara de esta manera, cuando inicializa la aplicación entrara ala subrutina la cual prendera un led que cera puesto en el puerto a pin 4 (ra.4), indicando que el programa está listo para sumar y guardar el dato en el cual uno desea que su contador ce detenga. El pulsador que se encuentra en el puerto a pin 0 (ra.0) es el encargado de sumar la variable y mostrarla en el displey. El pulsador que se encuentra en el puerto a pin 1 (ra.1) es el encargado de restar la variable y mostrarla en el displey. El pulsador que se encuentra en el puerto a pin 2 ( ra.2) es el encargado de guardar la variable en la memoria interna del pic y apagar el led puesto en (ra.4) indicando que ya quedo un dato guardado. El programa solo suma una variable y la compara con la variable anteriormente guardada y si son = termina el programa. Espero que le sea de alguna utilidad como practica usando instrucciones if.. Then, gosub, y read y write Saludos desde Tamaulipas México ce despide rockLee_89 RockLee_89 : Define SIMULATION_WAITMS_VALUE = 10 'solo para simulacion AllDigital 'todos los pines digitales TRISA = %000111 'pines ra.0,ra.1,ra.2 como entradas TRISB = %00000000 'puerto b como salida Dim a As Byte Dim b As Byte a=0 b = 0 Gosub dato 'saltar ala subrutina
inicio: Read 0, a 'leer lo que esta en la memoria en la casilla 0 y guardarlo en la variable a
If b = a Then 'un comparadar para termino de nuestro programa End Endif b = b + 1 'simple contador PORTB = b 'y lo saca por el puerto b en binario WaitMs 1000 Goto inicio dato: RA.4 = 1 'encender el pin ra.4 (este es el led) If RA.0 = 1 Then 'si ra.0=1 le suma 1 ala variable a a=a+1 If a = 100 Then 'una simple condicion para que solo llegue a 99 a=0 Endif PORTB = a 'lo saca por el puerto b el valor de la variable a para ver que numero esta WaitMs 50 Endif If RA.1 = 1 Then 'si ra.1=1 le resta 1 ala variable a a=a-1 If a = 255 Then 'una simple condicion para que cuando a este a 0 y ustedes le quieran restar no los aparesca ff o 255 numero que sobrepasa nuestro contador a=0 Endif PORTB = a 'lo saca por el puerto b el valor de la variable a para ver que numero esta WaitMs 50 Endif If RA.2 = 1 Then 'si ra.2 es = a 1 entonces RA.4 = 0 'apaga el led que indica que ya guardo un dato WaitMs 50 Write 0, a 'y escribe el dato el cual quedo prestablecido en la casilla 0, lo que hay en la variable a Return 'regresar a donde fue llamada la subrutina Endif Goto dato
si en algo la regue o tienen algunas ides o mejoras para el programa tenga la confianza de decírmelo ya que nadie nace sin equivocarse y el fin son programas didácticos para que los novatos como yo tengan una idea de cómo hacer simples circuitos y que recuerden que la practica hace al maestro.. tenia pensado que Leyera la variable a y si es mayor a 0 y menor a 99 se ejecute el
programa para que así no esté como esclavo de que cada que lo conectes no estar guardando el dato acada rato pero ce me paso bueno pero el ej emplo jala que es lo bueno jiji Saludos y nos veremos después con mas ejemplos
RockLee_89 : Bueno amigo hoy les dejare unos ejemplos fáciles y tratare de explicarles como utilizar un lcd de 16 caracteres y 2 líneas (16x2)
Casi todos los lcd de 16x2 bueno al menos los que yo e visto y manejado vienen con sus 16 pines aunque no recuerdo bien si los LCD que no tienen luz de fondo los traigan los 16 bueno en si con luz o sin luz es lo de menos Bueno lo adjunto ya que lo explique de cómo conectarlo y los comandos comunes del lcd para su manejo y como es mucho no quiero echarme mucho royo aqui y aburrirlos mejor les dejo el archivo de word asi el que quiera le da una le ida y entiende algo sobre el lcd su conecion y su manejo en este lenguaje RockLee_89 : Bueno amigos aquí empezamos con el primer programa d manejo del lcd el programa saca un texto por la línea 1 del lcd y pasa a la línea 2 del lcd y escribe otra frase.
Define SIMULATION_WAITMS_VALUE = 10 'solo para simulacion Define LCD_BITS = 4 'defino la conexion de 4 bits . cuando ponemos conexion de 8 bits el lcd_dbit es ignorado Define LCD_DREG = PORTB 'defino la conexion del puerto b Define LCD_DBIT = 4 'defino la conexion de los altos (4,5,6,7) del puerto b Define LCD_RSREG = PORTB 'define el uerto b como conexion rs Define LCD_RSBIT = 0 'define el pin donde ira conectado rs Define LCD_EREG = PORTB 'define el puerto donde estara el pin de e Define LCD_EBIT = 2 'defino la conecion de e por el pin 2 Define LCD_RWREG = PORTB 'defino a r/w por el puerto b Define LCD_RWBIT = 1 'defino el pin 1 como r/w este pin lo podemos ignorar u poner con una resistencia a tierra ya que solo queremos escribir en el lcd y no leer Define LCD_COMMANDUS = 1000 'define la demora en microsegundo en la escritura Define LCD_DATAUS = 100 'define cuanto la escritura de un dato Define LCD_INITMS = 100 'define la demora de la inicizion del lcd Lcdinit 2 'el cursor subrayado inicio: Lcdout "hola amigos" 'saco por la linea uno de lcd WaitMs 2000 'retardo para visualizarlo Lcdcmdout LcdLine2Home 'paso ala linea 2 del lcd Lcdout "de todo pic" 'saco por la linea dos de lcd WaitMs 2000 'retardo para visualizarlo
Lcdcmdout LcdClear 'borro lo que hay en el lcd Goto inicio RockLee_89 : Bueno eso es todo por hoy ,maña implementare la opción de count port para poder medir la frecuencia esta no la he implementado hasta valores de kilos, ya que no ce si llegue con 555 convencional hasta esta frecuencia ya que no cuento con un osciloscopio ni un generador para ver estas frecuencias pero he medido frecuencias con un 555 de 160 hz y medí con un acoplado de un transformador y una simple fuente de ½ onda una señal de 60 u 61 hz que es la frecuencia en México en la red eléctrica con lo cual creo que esta función si sirve para poder medir frecuencias, si alguien la ha implementado en frecuencias en MHz y KHz puede comentar si con esta simple instrucción pude funcionar o ce tiene que modificar.
El pic simulador cuenta con osciloscopio y generador pero como soy algo lelo todavía no le he movido pero esto del 555 y el acoplado de la luz elé ctrica si esta calado en físico. bueno eso sería todo subiré fotos que le tome al lcd y al proto donde hice esta aplicación también tengo pensado usar esta misma aplicación para medir las rpm de un motor cuando tenga tiempo de hacer la conexión del motor y su placa ce los mostrare Espero que les allá servido de algo lo que e posteado que mi fin es ayudar al foro y a los novatos como yo como podrían usar algunas simples aplicaciones que el compilador nos da. Desde Tamaulipas México ce despide RockLee_89 hasta la próxima.
fabio2012 :
Hola a todos,no puedo subir el ejemplo del contador de 4 digitos porque no me funciono el 7447 :( :( (lo queria subir con video para ver su funcionamiento por que en proteuz no se puede apreciar) pero subo un un ejemplo de un variador (podemos a ser que prenda mas lijeros y mas lento), espero que sea de utilidad aca va el ejemplo: AllDigital TRISA = %11111111 TRISB = %11111110 Dim xy As Byte Dim veces As Byte veces = 100 inicio: PORTB = %00000001 Gosub timer PORTB = %00000000 Gosub timer
Goto inicio End timer: If RA0 = 0 Then Gosub restar If RA1 = 0 Then Gosub sumar For xy = 100 To veces WaitMs 5 Next xy Return sumar: If veces > 150 Then Return veces = veces + 5 Return restar: If veces < 10 Then Return veces = veces - 5 Return
subo tambien simulacion en proteuz espero que sea de utilidad,voy a tratar de seguir subiendo ejemplos saludos :) :)