TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: fernando_realico en 09 de Agosto de 2010, 01:46:32
-
Estimados:
Soy un poco nuevo en el mundo de pic, he programado el pic 16f84a y quise programar el pic 16f873a y no logré hacerlo funcionar, me fijura que el programa se está grabado pero en el circuito no funciona, no se por qué, entonces quería preguntarle lo siguiente:
El proyecto que estoy realizando es una plaqueta universal de un programador de lavaropa automático, el inconveniente son las cantidades de salidas, es que necesito 9 salidas para activar 9 relé, salidas conectadas a un uln2004 y 2 optoacopladores, y me quedarían 5 puertos libres nada más, es decir, pretendía usar tres como señales luminosas y dos para seleccionar programas, es decir, con uno de esos 2 pulsadores que me quedan para seleccionar programas, a medida que se vayan presionando, pueda elegir subprogramas (lavado corto - lavado largo - centrifugado extra) y con el otro enviar una señal para que comience a ejecutar el programa elegido.
Me imagino que para lograr seleccionar, serían, subprogramas, con un solo pulsador, necesitaría poner en marcha un contador, bueno ahí tengo el problema, cómo podría hacer, defino un registro en memoria, y cómo podría logra el siguiente razonamiento lógico: si el registro "..." está en 1 y acciono el pulsador de comienzo, ejecutar el subprograma lavado largo.... Si el registro "..." está en 2 y acciono el pulsador de comienzo, ejecutar el subprograma lavado corto. Si el registro "..." está en 3 y acciono el pulsador de comienzo, ejecutar el subprograma cetrifugado extra.....
Bueno espero haber sido claro. El gran problema el el límite de 13 puertos. por eso quería pasar a un 16f873a
Las plaquetas que estoy comprando tienen un micro de 20 pines, por eso, si puedo lograr con un solo pulsador seleccionar varios subprogramas, solucionaría el problema. Las plaquetas universales que compro también se manejan con 2 pulsadores, con uno selecciona 1 de los 7 programas y el otro inicia la ejecución, también se puede pausar (calculo que debe ser Interrupción)
Bueno desde ya muchas gracias.
Saludos
Fernando Gutierrez
-
Y no puedes utilizar uno tipo 16f8x7 que tiene un numero mayor de pines para utilzar como entradas y salidas.
F.
-
Claro que puedes Fernando.
Cuando cargues el pulsador ira incrementando el numero de pasos de un registro (por ej. registro pasos) y cuando llegue al ultimo paso, vuelve al primero o desliga (cero).
Y en la rutina principal de programa, debera chequear cual paso y meterle el subprograma.
Saludos.
Fidel.
-
Gracias por responder, esa es la lógica que quiero lograr. con el plc lo he realizado.
El tema es por ejemplo si el registro "paso" está en 2, ir a etiqueta lavado corto.
Cuales serian las instrucciones, por ejemplo si uno pone btfss pregunta si hay un 1 y btfsc pregunta si hay un 0
pero cómo pregunto si hay un 2 o un 4 en el registro.
Desde ya muchas gracias
-
eso lo puedes hacer de varias formas, por ejemplo lo puedes hacer con una resta y si el resultado es cero pues es ese valor.
Si usas assembler lo haces con la siguiente instruccion, lo que haces es restarle a W el literal k y el resultado queda en W, luego vez si el bit 2 del registro STATUS (es el que te indica si el resultado es cero) ha cambiado a 1, previamente antes de ejcutar la instruccion SUBLW deberias poner a cero este bit.
SUBLW k
-
Por aquí hay un ejemplo de lo que indica willynovi:
http://www.todopic.com.ar/foros/index.php?topic=24720.msg201403#msg201403
Y sobre instrucciones de Assembler revisa el siguiente hilo:
http://www.todopic.com.ar/foros/index.php?topic=23623.0
.. previamente antes de ejcutar la instruccion SUBLW deberias poner a cero este bit...
Te refieres al bit Z? Ese cambia su valor al ejecutar una operación aritmética o lógica, no es necesario borrarlo antes ;-)
Saludos!
-
gracias Suky, como no estaba seguro que mejor que asegurarse :mrgreen:
-
Gracias amigos por responder, ahora cómo puedo decir... si el registro "x" está en 3 entonces ir a determinada etiqueta del programa. Voy a probar a realizar el contador primero.
Gracias nuevamente
-
Yo usaria "xor l....
movf paso,w ;si el reg paso = d'2'
xorlw d'2'
btfss status,z ; no pasa
goto otro ;aqui va p/otra pregunta
lavado_corto ; verdadero
; y asi p/delante
yo lo hago con Niple, es mucho mas tranquilo.
Saludos.
-
Gracias amigos por responder, ahora cómo puedo decir... si el registro "x" está en 3 entonces ir a determinada etiqueta del programa. Voy a probar a realizar el contador primero.
Gracias nuevamente
Cuando preguntas por el estado del bit Z tienes dos posibilidades, si y no. Depende como preguntes saltará la siguiente instrucción o no, es allí donde debes ubicar un goto ;-)
Saludos!
-
Amigos, muchas gracias por responder, ya me estoy dando una idea como es el tema, voy a leer sobre el bit z.
Es decir, tendría que realizar un loop para que continuamente vaya chequeando el valor de z según el estado del registro. Me voy a poner a leer un poco y les cuento como me fue.
Gracias nuevamente
Fernando
Argentina
-
Amigos, estuve haciendo algo, el tema, primero, si está bien el tema dl contador, que llegado a 6 reseteo y comienza de nuevo, segundo, cuando z es cero que salte al subprograma "programas" el problema que no se me ocurrre cómo en ese subprograma leo el registo contador, qué número tiene para ir a otro subprograma, por ejemplo si "contador" está en 1 que vaya a lavado corto, si está en 2 que vaya a "centrifugado"
aquí el programa: (disculpen si está mal, recien estoy comenzando con esto, faltarían antes de incrementar el registro, agregar una condición de un pulsador, pero quiero saber si está bien el conteo.
y como defino en el subprog "programas" la comparación del numero que está en el registro "contador" para ir a determinada parte del programa
list P=16F84a
#INCLUDE "P16F84a.INC"
; MAPA DE MEMORIA
estado equ 0X03
portb equ 0X06
porta equ 0X05
trisa equ 0x85
trisb equ 0X86
reg1 equ 0x0c
reg2 equ 0x0d
reg3 equ 0x0e
reg4 equ 0x0f
reg5 equ 0x1c
reg6 equ 0x1d
rotar equ 0x1e
contador equ 0x1f ;contador
;------------------------------------------------------------
; Declaración de Bits
;------------------------------------------------------------
c equ 0 ;carry / borrow bit
rp0 equ 5 ;registrer bank select bit
rp1 equ 6 ;registrer bank select bit
z equ 2 ;bit cero
;CONFIGURACION DE PUERTOS
reset org 0X00
goto inicio
org 0X05
inicio clrf porta
clrf portb
bsf estado,5
movlw b'11111'
movwf trisa
movlw b'00000000'
movwf trisb
bcf estado,5
;PRINCIPAL
principal
movlw b'00000000'
movwf portb
movlw b'11111'
movwf porta
bucle incf contador,1
movlw d'6'
subwf contador,0 ; si es 6 reseteo y vuelvo al bucle, sino voy a etiqueta programas
btfss status,z
goto programas ;voy a programas
clrf contador,1
goto bucle
programas (cómo hago para realizar la técnica polling, es decir, si el registro contador está en 1 que vaya a determinado subprograma o si está en 2 que vaya a otro subprograma)
-
Estaba pensando, a ver si aclaro el problema que tengo, una vez logrado el contador, por ejemplo si está en 3 decimal, no se puede hacer una función "si" es decir; si W está en 3 ir a tal parte del programa o llamar alguna subrrutina, si W está en 6 ir a tal etiqueta o llamar algunasubrrutina.
Espero que entiendan la dificultad que tengo
y gracias por todo.
Saludos
Fernando Gutierrez
-
En la selección de progamas, tienes que chequear asi: si es, va al prog-1; si no, va al proximo chequeo (y repetirlo 6 vezes) y al final vuelves al inicio o entonces cera todo.
Este purde ser el loop principal y lo demas se quedan en las llamadas.
Estoy subiendo una pantalla (en Niple) de lo expuesto.
saludos.
-
hola Fernando, lo que quieres hacer lo puedes implementar con los siguiente, suponiendo que tienes un contador que es el que lleva el número del programa.
movf contador,w
addwf PCL,f
goto programa0
goto programa1
goto programa2
lo que haces es al PCL, que es el que va indicando la linea siguiente a ejecutarse de programa, sumarle el valor de tu contador y con eso la siguiente instrucción a ejecutar será la que te guie hacia el programa seleccionado.
Tienes que tener en cuenta que el valor 0 no suma entonces si contador es 0 ejecutará la siguiente.
En el caso que los numeros no sean consecutivos, por ejemplo 2, 4, 5, 8 no sabria decirte con seguridad si agregando unos nop puedes sarlvar esta situacion. En ese caso quedaria
movf contador,w
addwf PCL,f
nop
nop
goto programa2
nop
goto programa4
goto programa5
nop
nop
nop
goto programa8
Es cuestion de probarlo.
Si puedes con tiempo mirate los dos enlaces que te puso Suky que estan muy completos esos tutoriales, esto que yo te termino de decir del PCL lo he sacado de ahí ;-)
-
Gracias por responder, voy a quemar un poco el pic, y probar con el entrenador, gracias.
Saludos
Fernando
-
Estimados:
Gracias por darme una mano, logré realizar lo propuesto, utilicé PCL,f, y un contador, ya lo probé en el entrenador encendiendo led. Aunque RB0 no enciende, cuando pulso RA0 van rotando por cada accionamiento va rotando de RA1 a RA5.
Aquí el programa:
;PRINCIPAL
principal
movlw b'00000000'
movwf portb
movlw b'11111'
movwf porta
bucle call retardo
call retardo
btfsc porta,0
goto bucle
incf contador,1
movlw d'6' ; tenía "10"
subwf contador,w ; si es 6 reseteo y vuelvo al bucle, sino voy a etiqueta programas
btfss STATUS,Z
goto programas ;voy a programas
clrf portb
clrf contador
goto bucle
programas movf contador,w
addwf PCL,f
goto enciende1
goto enciende2
goto enciende3
goto enciende4
goto enciende5
goto enciende6
enciende1 clrf portb
bsf portb,0
call seg1
goto bucle
enciende2 clrf portb
bsf portb,1
call seg1
goto bucle
enciende3 clrf portb
bsf portb,2
call seg1
goto bucle
enciende4 clrf portb
bsf portb,3
call seg1
goto bucle
enciende5 clrf portb
bsf portb,4
call seg1
goto bucle
enciende6 clrf portb
bsf portb,5
call seg1
goto bucle
end