TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: sanchoweb en 29 de Diciembre de 2004, 11:57:00
-
Buenos días nuevamente. En esta ocación les pido ayuda para confeccionar un trabajo práctico. Lo que ocurre es que estoy un poco apretadp con el tiempo, asique espero que me puedan ayudar.
Lo que tengo que hacer es la simulación de un ascensor, pero solo con una matriz de leds que me indica en que piso está. Parece simple, pero a mi no me sale...
Para esto tengo:
- PIC 16f84A
- Matriz de Led 7x5
- Deco 3-8 (H4138)
- Conversor (MC4069)
La cosa es simple, lo que hago es un contador con el nivel inferior del puerto B, eso lo mando al deco 3-8 y con el converor invierto las salidas de este para poder controlar las filas de la matriz...
Las colmnas de la matriz la controlo con el Puerto A. Y tengo dos pulsadores, uno en RB7 y otro en RB6 que hacen que el numerito suba de piso o baje.
Hasta ahi todo joya. Pero hay un problema.... Necesito que cada vez que, por ejemplo, asciendo un piso... no me aparezca el número siguiente de una, sino que necesito que vaya desplazando al anterior. Como se ve en los ascensores de verdad.
Y una última cosa. Si apago el pic y lo vuelvo a encender, necesito que el piso se mantenga, por lo que tendría que laburar con memorias. FSR, INDF y demás yerbas.
Yo solo se programar en asembler, asique si alguien me quiere dar una mano.. se los agradecería mucho.
Saludos. Y espero su pronta respuesta.
-
Agrego más datos:
RA0 - RA4: Control de las columnas de la Matriz 5x7
RB0 - RB2: Contador que llega hasta 7 (7 filas) y controla las filas de la matriz
RB6: Pulsador de ascenso
RB7: Pulsador de descenso
-
Acá está lo que hice, pero no funca...
LIST P=16F84A
#INCLUDE <P16F84A.inc>
CBLOCK H"0D"
CONTADOR
PISO
CounterA
CounterB
CounterC
ENDC
__CONFIG _XT_OSC &_WDT_OFF &_PWRTE_ON &_CP_OFF
ORG H"00"
GOTO INICIO
ORG H"05"
TABLA
ADDWF PCL,F
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00011011"
RETLW B"00010011"
RETLW B"00011011"
RETLW B"00011011"
RETLW B"00011011"
RETLW B"00011011"
RETLW B"00010001"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00011110"
RETLW B"00011101"
RETLW B"00010011"
RETLW B"00001110"
RETLW B"00000000"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00011110"
RETLW B"00011001"
RETLW B"00011110"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00011101"
RETLW B"00011001"
RETLW B"00010101"
RETLW B"00001101"
RETLW B"00000000"
RETLW B"00011101"
RETLW B"00011101"
RETLW B"00000000"
RETLW B"00001111"
RETLW B"00001111"
RETLW B"00010001"
RETLW B"00011110"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001111"
RETLW B"00000001"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00000000"
RETLW B"00011110"
RETLW B"00011101"
RETLW B"00011011"
RETLW B"00010111"
RETLW B"00010111"
RETLW B"00010111"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00010000"
RETLW B"00011110"
RETLW B"00001110"
RETLW B"00010001"
DELAY4
movlw D"6"
movwf CounterB
movlw D"48"
movwf CounterA
loop
decfsz CounterA,1
goto loop
decfsz CounterB,1
goto loop
retURN
MUESTREOSUBE
MOVLW H"0C"
MOVWF FSR
MOVF INDF,W
MOVWF PISO
CLRF PORTB
CLRF CONTADOR
MOVF CONTADOR,W
CALL TABLA
MOVWF PORTA
LOOP2
CALL DELAY4
MOVLW D"07"
XORWF PORTB
BTFSS STATUS,Z
GOTO SALE
INCF PORTB,F
INCF CONTADOR,F
MOVF CONTADOR,W
CALL TABLA
MOVWF PORTA
GOTO LOOP2
SALE
INCF PISO
MOVLW H"0C"
MOVWF FSR
MOVF PISO,W
MOVWF INDF
return
MUESTREOBAJA
MOVLW H"0C"
MOVWF FSR
MOVF INDF,W
MOVWF PISO
CLRF PORTA
MOVLW D"07"
MOVF CONTADOR,W
CALL TABLA
MOVWF PORTA
LOOP3
CALL DELAY4
MOVLW D"07"
XORWF PORTB
BTFSC STATUS,Z
GOTO SALE2
INCF PORTB,F
DECF CONTADOR,F
MOVF CONTADOR,W
CALL TABLA
MOVWF PORTA
GOTO LOOP3
SALE2
DECF PISO,F
MOVLW H"0C"
MOVWF FSR
MOVF PISO,W
MOVWF INDF
RETURN
INICIO
BSF STATUS,RP0
MOVLW B"11000000"
MOVWF PORTB
CLRF PORTA
BCF STATUS,RP0
CLRF PISO
LOOP4
BTFSC PORTB,7
GOTO SUBE
BTFSC PORTB,6
GOTO BAJA
GOTO LOOP4
SUBE
MOVLW D"09"
XORWF PISO
BTFSC STATUS,Z
GOTO LOOP4
CALL MUESTREOSUBE
GOTO LOOP4
BAJA
MOVLW D"00"
XORWF PISO
BTFSC STATUS,Z
GOTO LOOP4
CALL MUESTREOBAJA
GOTO LOOP4
END
-
Ok, acerca del prender y apagar el PIc y mantener el piso, el 16F84 posee un recurso poderoso, una EEPROM interna de 64 bytes, esta la puedes usar para guardar tu piso antes de apagar, en el foro hay una multitud de aplicaciones y ejemplos en ASM. Lo de que el piso se desplace es una animacion que la puedes hacer en PIC, pero el codigo es un poco complicado porq debes leer n veces la tabla de digitos (siendo n la cantidad de filas q posea tu display) ademas de incorporar un pequeño retardo entre cada cambio, es una idea interesante, vere si puedo generar un codigo q lo pueda hacer, pero igual ve desarrollando el tuyo propio.
-
Bueno, muchas gracias. Yo estoy probando mis códigos constantemente, porque tengo la ventaja de poseer el circuito con la matriz y todos los integrados necesarios.
Pero realmente, la cabeza no me da para más. Hace mucho que estoy con esto y no me sale...
Pero seguiré intentando. Gracias.
-
Aprovechando que tienes la tabla de las matrices de led, en vez de colocar los caracteres a visualizar del 0 al 9 (como lo tienes) pon primero el caracter 9 y el ultimo el 0 (o el B, vamos la planta baja). Unicamente deberas cambiar el direccionamiento del puntero.
Cuando llega el momento de cambiar de numero (por ejemplo incrementar), haz que el puntero que utilizas para apuntar a la zona del caracter a visualizar apunte a la la fila mas baja del siguiente numero, y visualizas los siete bytes, como antes. Que hara: cargarte la primera linea del siguiente caracter y las seis mas altas anterior. Esto lo haces con un retardo y lo haces en un lazo siete veces.
Resultado: se delizan los numeros. Si lo quieres decrementar, en lugar de cargar en el puntero la fila mas baja, cargas la direccion de la penultima fila mas alta del numero para que se visualicen las seis filas mas bajas del caracter y la primera del anterior.
Espero habrte ayudado. Feliz año a todos.
-
Bueno gente. Ya lo terminé. Me puse como meta hacerlo para hoy a las 11 de la noche y son las 10:48 y terminé el programa.
Logré que vaya desde 0 hasta 9 con los intervalos bien definidos y los números se ven perfecto.
Acá va el código:
LIST P=16F84A
#INCLUDE <P16F84A.inc>
CBLOCK H"0C"
CONTADOR
CONTADOR2
TEMPORAL
CounterA
CounterB
PISO
ENDC
__CONFIG _XT_OSC &_WDT_OFF &_PWRTE_ON &_CP_OFF
ORG H"00"
GOTO INICIO
ORG H"05"
DELAY
movlw D"5"
movwf CounterB
movlw D"138"
movwf CounterA
loop decfsz CounterA,1
goto loop
decfsz CounterB,1
goto loop
return
TABLA
ADDWF PCL,F
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00000000"
RETLW B"00011011"
RETLW B"00011001"
RETLW B"00011010"
RETLW B"00011011"
RETLW B"00011011"
RETLW B"00011011"
RETLW B"00000000"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001111"
RETLW B"00010111"
RETLW B"00011001"
RETLW B"00001110"
RETLW B"00000000"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001111"
RETLW B"00010011"
RETLW B"00001111"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00010111"
RETLW B"00010011"
RETLW B"00010101"
RETLW B"00010110"
RETLW B"00000000"
RETLW B"00010111"
RETLW B"00010111"
RETLW B"00000000"
RETLW B"00011110"
RETLW B"00011110"
RETLW B"00010001"
RETLW B"00001111"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00011110"
RETLW B"00010000"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00000000"
RETLW B"00001111"
RETLW B"00010111"
RETLW B"00011011"
RETLW B"00011101"
RETLW B"00011101"
RETLW B"00011101"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00001111"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00001111"
RETLW B"00001110"
RETLW B"00010001"
MUESTREO
CLRF CONTADOR
MOVF PISO,W
MOVWF TEMPORAL
LMUESTREO
MOVF CONTADOR,W
MOVWF PORTB
MOVF TEMPORAL,W
CALL TABLA
MOVWF PORTA
CALL DELAY
MOVLW D"7"
XORWF CONTADOR,W
BTFSC STATUS,Z
RETURN
INCF TEMPORAL,F
INCF CONTADOR,F
GOTO LMUESTREO
INICIO
BSF STATUS,RP0
CLRF TRISA
MOVLW B"11000000"
MOVWF TRISB
BCF STATUS,RP0
LOOP2
CALL MUESTREO
BTFSS PORTB,7
GOTO LOOP5
GOTO SUBE
LOOP5
BTFSS PORTB,6
GOTO LOOP2
GOTO BAJA
SUBE
MOVLW D"63"
XORWF PISO,W
BTFSC STATUS,Z
GOTO LOOP2
MOVLW D"7"
MOVWF CONTADOR2
LSUBE
INCF PISO,F
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
DECFSZ CONTADOR2,F
GOTO LSUBE
GOTO LOOP2
BAJA
MOVLW D"0"
XORWF PISO,W
BTFSC STATUS,Z
GOTO LOOP2
MOVLW D"7"
MOVWF CONTADOR2
LBAJA
DECF PISO,F
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
DECFSZ CONTADOR2,F
GOTO LBAJA
GOTO LOOP2
END
Ahora. Solo me falta una sola cosa. Pero de verdad que lo intenté y no lo puedo hacer funcionar. Es que me piden que cuando le saque la tensión al pic y se la vuelva a dar, se mantenga el piso en el que estaba.
Pensé en esta subrutina, pero no me anda. Si alguno me quiere dar una mano, se lo agradecería.
MOVLW H"0C"
MOVWF FSR
MOVF PISO,W
MOVWF INDF
-
compañero quizas no sere de ayuda pero si estoy un tanto interesado en lo que haz hecho y me gustaria armarlo a mi tambien es por eso que escribo esto, para ver la posibilidad de si puedes compartir el esquema del circuito que haz hecho y komo es que esta interconectado con el microcontrolador
desde ya me despido agradecido
-
Hola, realmente superaste tu propio record!!!

Creo que mas arriba tienes la respuesta... emplea la eeprom
puedes grabar en la eeprom del micro el dato o numero de piso...
asi que en el inicio del programa, colocas un CALL LECTURA que cargue al encender el equipo, el valor que tenia...
;============== MANEJO DE EEPROM =================================
LECTURA MOVF DIRECCION,W ;TOMAR DIRECCION A LEER
MOVWF EEADR ;PASO DIRECCION A EEADR
BSF STATUS,RP0 ;BANCO 1
BSF EECON1,RD ;LEER DATO DE LA EEPROM
BCF STATUS,RP0
MOVF EEDATA,W ;DATA --->W
CLRWDT
RETURN ;RETORNA CON DATO EN W
;-------------------------------------------------------------------------
ESCRITURA
MOVF DIRECCION,W ;TOMA DIRECCION
MOVWF EEADR
MOVF BYTE,W
MOVWF EEDATA
BSF STATUS,RP0
BSF EECON1,WREN ;HABILITA ESCRITURA
MOVLW 0X55
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
BSF EECON1,WR ;WR-->1
BCF EECON1,WREN ;DESHABILITA ESCRITURA
BCF STATUS,RP0 ;BANCO 0
RETURN
;*************************************************
; codigo, colocar direccion a grabar
MOVWF DIRECCION ;DIRECCION A GRABAR DE LA EEPROM
; colocar el numero o dato a grabar
MOVWF BYTE
CALL ESCRITURA ;ENVIO A GRABAR EEPROM
BSF STATUS,RP0
ESCRCOMPL1
CLRWDT
BTFSC EECON1,WR ;BYTE ESCRITO?
GOTO ESCRCOMPL1
BCF STATUS,RP0
; ya esta grabado... seguir con el programa
;******************************************************
suerte!!
Norberto
-
Bueno, de verdad muchas gracias por todo.
Ahora me voy a poner a insertar las partes para el grabado en la EEPROM y cuando esté todo terminado subo el código completo.
Lo que si... no tengo cámara digital Norberto, asique solo puedo subir la plaqueta hecha en el Eagle y las hojas de datos utilizadas...
En un rato vengo con el proyecto ¿terminado?
Saludos.
Sancho
-
Puedes pegarlo en word o hacerlo en pdf, todos podran verlo asi.
-
Bueno gente. Acá ajunto un txt. con el programa finalizado.
La plaqueta todavía no la hice. Pero supongo que mañana la haré.
Gracias por la ayuda brindada y cualquier consulta escribanme que los trataré de ayudar en lo que pueda.
Por lo pronto, en los próximos días subiré los planos de la plaqueta, con el conexionado así se entiende bien.
Pero para los que me lo pedían, acá está el código en asembler.
Sancho
PD: No me deja agregar el .txt... asique se los copio en la caja de texto:
LIST P=16F84A
#INCLUDE <P16F84A.inc>
CBLOCK H"0C"
CONTADOR
CONTADOR2
TEMPORAL
CounterA
CounterB
PISO
BYTE
DIRECCION
ENDC
__CONFIG _XT_OSC &_WDT_OFF &_PWRTE_ON &_CP_OFF
ORG H"00"
GOTO INICIO
ORG H"05"
DELAY
movlw D"5"
movwf CounterB
movlw D"138"
movwf CounterA
loop
decfsz CounterA,1
goto loop
decfsz CounterB,1
goto loop
return
TABLA
ADDWF PCL,F
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00011011"
RETLW B"00011001"
RETLW B"00011010"
RETLW B"00011011"
RETLW B"00011011"
RETLW B"00011011"
RETLW B"00000000"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001111"
RETLW B"00010111"
RETLW B"00011001"
RETLW B"00001110"
RETLW B"00000000"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001111"
RETLW B"00010011"
RETLW B"00001111"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00010111"
RETLW B"00010011"
RETLW B"00010101"
RETLW B"00010110"
RETLW B"00000000"
RETLW B"00010111"
RETLW B"00010111"
RETLW B"00000000"
RETLW B"00001110"
RETLW B"00011110"
RETLW B"00010001"
RETLW B"00001111"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00011110"
RETLW B"00010000"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00000000"
RETLW B"00001111"
RETLW B"00010111"
RETLW B"00011011"
RETLW B"00011101"
RETLW B"00011101"
RETLW B"00011101"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00001111"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00010001"
RETLW B"00001110"
RETLW B"00001110"
RETLW B"00010001"
RETLW B"00001111"
RETLW B"00001110"
RETLW B"00010001"
MUESTREO
CLRF CONTADOR
MOVLW H"00"
MOVWF EEADR ;PASO DIRECCION A EEADR
BSF STATUS,RP0 ;BANCO 1
BSF EECON1,RD ;LEER DATO DE LA EEPROM
BCF STATUS,RP0
MOVF EEDATA,W ;DATA --->W
CLRWDT
MOVWF PISO
MOVF PISO,W
MOVWF TEMPORAL
LMUESTREO
MOVF CONTADOR,W
MOVWF PORTB
MOVF TEMPORAL,W
CALL TABLA
MOVWF PORTA
CALL DELAY
MOVLW D"7"
XORWF CONTADOR,W
BTFSC STATUS,Z
RETURN
INCF TEMPORAL,F
INCF CONTADOR,F
GOTO LMUESTREO
ESCRITURA
BSF STATUS,RP0
BSF EECON1,WREN
MOVLW H"55"
MOVWF EECON2
MOVLW H"AA"
MOVWF EECON2
BSF EECON1,WR
LOPO BTFSS EECON1,EEIF
GOTO LOPO
BCF EECON1,EEIF
BCF STATUS,RP0
RETURN
INICIO
BSF STATUS,RP0
CLRF TRISA
MOVLW B"11000000"
MOVWF TRISB
BCF STATUS,RP0
LOOP2
CALL MUESTREO
BTFSS PORTB,7
GOTO LOOP5
GOTO SUBE
LOOP5
BTFSS PORTB,6
GOTO LOOP2
GOTO BAJA
SUBE
MOVLW D"63"
XORWF PISO,W
BTFSC STATUS,Z
GOTO LOOP2
MOVLW D"7"
MOVWF CONTADOR2
LSUBE
INCF PISO,F
CLRF EEADR
MOVF PISO,W
MOVWF EEDATA
CALL ESCRITURA
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
DECFSZ CONTADOR2,F
GOTO LSUBE
CLRF EEADR
MOVF PISO,W
MOVWF EEDATA
CALL ESCRITURA
GOTO LOOP2
BAJA
MOVLW D"0"
XORWF PISO,W
BTFSC STATUS,Z
GOTO LOOP2
MOVLW D"7"
MOVWF CONTADOR2
LBAJA
DECF PISO,F
CLRF EEADR
MOVF PISO,W
MOVWF EEDATA
CALL ESCRITURA
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
CALL MUESTREO
DECFSZ CONTADOR2,F
GOTO LBAJA
CLRF EEADR
MOVF PISO,W
MOVWF EEDATA
CALL ESCRITURA
GOTO LOOP2
END
-
alguien hizo la simulacion de esto en el proteus???
serviria de mucho para entenderlo mejor.