TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
21 de Octubre de 2014, 10:32:31

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
350159 Mensajes en 39279 Temas por 41023 Usuarios
Último usuario: cristhian4151
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Microcontroladores PIC
| |-+  Primeros pasos - Iniciación a los microcontroladores (Moderadores: Veguepic, jfmateos2)
| | |-+  Pic 16f84a_ lectura de entrada -pulsadores-
0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Marcar como favorito Imprimir
Autor Tema: Pic 16f84a_ lectura de entrada -pulsadores-  (Leído 2607 veces)
fernando_realico
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 44


« : 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
En línea
Fer_TACA
Moderadores
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 2760



« Respuesta #1 : 09 de Agosto de 2010, 04:10:55 »

Y no puedes utilizar uno tipo 16f8x7 que tiene un numero mayor de pines para utilzar como entradas y salidas.

F.
En línea
Fidel Martins
PIC12
**
Desconectado Desconectado

Sexo: Masculino
Brasil Brasil

Mensajes: 91


Teoria y especulacion


« Respuesta #2 : 09 de Agosto de 2010, 20:21:00 »

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.
En línea
fernando_realico
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 44


« Respuesta #3 : 09 de Agosto de 2010, 22:30:11 »

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
En línea
willynovi
Colaborador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 503



« Respuesta #4 : 09 de Agosto de 2010, 23:40:20 »

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
En línea

Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.
Suky
Moderadores
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 6773


Con Qt...


WWW
« Respuesta #5 : 09 de Agosto de 2010, 23:53:30 »

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  wink


Saludos!
En línea

willynovi
Colaborador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 503



« Respuesta #6 : 09 de Agosto de 2010, 23:57:57 »

gracias Suky, como no estaba seguro que mejor que asegurarse  Mr. Green
En línea

Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.
fernando_realico
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 44


« Respuesta #7 : 10 de Agosto de 2010, 00:12:07 »

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
En línea
Fidel Martins
PIC12
**
Desconectado Desconectado

Sexo: Masculino
Brasil Brasil

Mensajes: 91


Teoria y especulacion


« Respuesta #8 : 10 de Agosto de 2010, 01:16:22 »

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.
En línea
Suky
Moderadores
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 6773


Con Qt...


WWW
« Respuesta #9 : 10 de Agosto de 2010, 01:28:48 »

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  wink

Saludos!
En línea

fernando_realico
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 44


« Respuesta #10 : 10 de Agosto de 2010, 09:27:11 »

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
En línea
fernando_realico
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 44


« Respuesta #11 : 10 de Agosto de 2010, 10:29:00 »

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) 
En línea
fernando_realico
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 44


« Respuesta #12 : 10 de Agosto de 2010, 10:50:34 »

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 línea
Fidel Martins
PIC12
**
Desconectado Desconectado

Sexo: Masculino
Brasil Brasil

Mensajes: 91


Teoria y especulacion


« Respuesta #13 : 10 de Agosto de 2010, 13:07:14 »

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.
En línea
willynovi
Colaborador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 503



« Respuesta #14 : 10 de Agosto de 2010, 15:15:16 »

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.

Código:
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

Código:
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í wink
En línea

Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.
fernando_realico
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 44


« Respuesta #15 : 10 de Agosto de 2010, 16:56:23 »

Gracias por responder, voy a quemar un poco el pic, y probar con el entrenador, gracias.

Saludos
Fernando
En línea
fernando_realico
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 44


« Respuesta #16 : 10 de Agosto de 2010, 20:52:38 »

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

En línea
TODOPIC
   

 En línea
Páginas: [1] Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.20 | SMF © 2006-2008, Simple Machines XHTML 1.0 válido! CSS válido!
Página creada en 0.048 segundos con 23 consultas.