Microcontrolador con Display 7 Segmentos (Proteus)

Me he fijado en temas anteriores pero ningun responde a mi problema.

Estoy armando un programa en un PIC 16F84A, use el MPLAB para eso. El programa es este
Código:
;Integradora de Digitales II
;Rodriguez Javier 5° 2°
		list p=16f84a

;Etiquetas
portb	equ		0x06			;Puerto B = 0x06
trisb	equ		0x06			;Tris B	= 0x06
sta		equ		0x03			;Estado = 0x03
PDel0	equ		0x0c			;PDel0 = 0x0c
PDel1	equ		0x0d			;PDel1 = 0x0d

;Programación de Puertos
		bsf		sta,5			;Voy al Banco 1
		movlw	0x10			;Configuro Bits del Puerto B como entrada y salida
		movwf	portb			;Lo ingreso en Puerto B
		bcf		sta,5			;Voy al Banco 0

;Programa
		org		0x05			;Indico en donde origina el programa
		clrf	portb			;Limpio Puerto B

;-Encendido del programa-
		btfss	portb,4			;Pregunto si hay un 1 en el Bit 4
		goto	bit2			;Voy a bit2
		goto	bit1			;Voy a bit1

;--Si en el Bit 4 es 1, hacer--
bit1	btfsc	portb,4			;Pregunto si hay un 0 en el Bit 4
		goto	bit1			;Vuelvo a bit1
		goto	presentacion	;Empiezo el programa

;--Si en el Bit 4 es 0, hacer--
bit2	btfss	portb,4			;Pregunto si hay un 1 en el Bit 4
		goto	bit2			;Vuelvo a bit2
		goto	presentacion	;Empiezo el programa

;-Presentación-
presentacion
		clrf	portb			;Limpio el Puerto B
		movlw	b'0110111'		;Ingreso la letra H
		movwf	portb			;Lo muevo a Puerto B
		call	retardo			;Retardo
		movlw	b'1111110'		;Ingreso la letra O
		movwf	portb			;Lo muevo a Puerto B
		call	retardo			;Retardo
		movlw	b'0001110'		;Ingreso la letra L
		movwf	portb			;Lo muevo a Puerto B
		call	retardo			;Retardo
		movlw	b'1110111'		;Ingreso la letra A
		movwf	portb			;Lo muevo a Puerto B
		call	retardo			;Retardo
		movlw	b'0000000'		;Ingreso un espacio
		movwf	portb			;Lo muevo a Puerto B
		call	retardo			;Retardo
		movlw	b'1011011'		;Ingreso la letra S
		movwf	portb			;Lo muevo a Puerto B
		call	retardo			;Retardo
		movlw	b'1111110'		;Ingreso la letra O
		movwf	portb			;Lo muevo a Puerto B
		call	retardo			;Retardo
		movlw	b'0111011'		;Ingreso la letra Y
		movwf	portb			;Lo muevo a Puerto B
		call	retardo			;Retardo
		movlw	b'0000000'		;Ingreso un espacio
		movwf	portb			;Lo muevo a Puerto B
		call	retardo			;Retardo
		movlw	b'0111011'		;Ingreso la letra Y
		movwf	portb			;Lo muevo a Puerto B
		call	retardo			;Retardo
		movlw	b'1111110'		;Ingreso la letra O
		movwf	portb			;Lo muevo a Puerto B
		call	retardo			;Retardo
		movlw	b'1011111'		;Ingreso la letra G
		movwf	portb			;Lo muevo a Puerto B
		call	retardo			;Retardo
		movlw	b'0110000'		;Ingreso la letra I
		movwf	portb			;Lo muevo a Puerto B
		call	retardo			;Retardo
		movlw	b'0000000'		;Ingreso un espacio
		movwf	portb			;Lo muevo a Puerto B
		call	retardo			;Retardo

;-Llave de Selección-
key		btfss	portb,4			;Pregunto si hay un 1 en el Bit 4 del Puerto B
		goto	dec				;Si Bit 4 = 0, Decrementa
		goto	inc				;Si Bit 4 = 1, Incrementa

;-Incrementador-
inc
		call	retardo			;Realizo retardo de 0,5 seg.
		incf	portb,1			;Puerto B + 1
		movlw	0x19			;Ingreso un literal 9 en W
		xorwf	portb,0			;Verifico si hay una igualdad en Puerto B y W
		btfss	sta,2			;Verifico si el Bit Z es 1
		goto	key				;Si Bit Z = 0, voy a key
		goto	clear			;Si Bit Z = 1, voy a clear

;-Decrementador-
dec
		call	retardo			;Realizo retardo de 0,5 seg.
		movlw	0x00			;Ingreso un literal 0 en W
		xorwf	portb,0			;Verifico si hay una igualdad en Puerto B y W
		btfsc	sta,2			;Verifico si el Bit Z es 0
		goto	dato			;Si Bit Z = 1, voy a dato
		decf	portb,1			;Si Bit Z = 0, hago Puerto B - 1
		goto	key				;y voy a key

;-Limpieza de Puerto (Incrementador)-
clear
		call	retardo			;Realizo retardo de 0,5 seg.
		clrf	portb			;Limpio Puerto B
		goto	key				;Voy a key

;-Ingreso de Literal (Decrementador)-
dato
		call	retardo			;Realizo retardo de 0,5 seg.
		movlw	0x09			;Ingreso un literal 9 en W
		movwf	portb			;Lo muevo a Puerto B
		goto 	key				;Voy a key

;-Retardo 0,5 seg.-
retardo movlw     .239      ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .232      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  goto PDelL3         ; 2 ciclos delay
PDelL3  clrwdt              ; 1 ciclo delay
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL4  goto PDelL5         ; 2 ciclos delay
PDelL5  goto PDelL6         ; 2 ciclos delay
PDelL6  goto PDelL7         ; 2 ciclos delay
PDelL7  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.

;-Fin-
		end

Notaran que soy un poco ordenado :rolleyes:
El tema es que queria hacer una simulación y estoy usando el Proteus, ya que no tengo materiales para poder hacerlo (Me gusta hacer pruebas en vivo y en directo ^^, si explotan, bueno).
Lo que estoy armando es un Contador Ascendente y Descendente controlado por el pic en el 7 segmentos. El problema es que no recibo ningun dato, ni siquiera un parpadeo. Dejo una imagen mas abajo del circuito.
Me gustaria que me digan que estoy haciendo mal :S
Gracias!
 

Adjuntos

  • cats.jpg
    cats.jpg
    137.9 KB · Visitas: 33
Me gustaría que me digan que estoy haciendo mal :S
Gracias!

Saludos.
Aquí te adjunto algunas correcciones básicas tanto al programa como al esquema de simulación.

Coméntanos si con estos cambios ya te funciona.

Suerte.
 

Adjuntos

  • Contador.rar
    17.7 KB · Visitas: 39
Gracias D@rkbytes, ahora me di cuenta de los errores ^^
Con respecto al .asm vi lo que editaste y tengo una duda, que serian y para que sirven estas 2 lineas?
include p16f84a.inc
__config _XT_OSC & _PWRTE_ON & _WDTE_OFF
El de config me imagino que es algo como configurar esas cosas y que no se cambien, no?

Edito: Me falto anunciar que me funciono :D Gracias nuevamente.
 
Última edición:
que serian y para que sirven estas 2 lineas?
El de config me imagino que es algo como configurar esas cosas y que no se cambien, no?
Saludos.
include p16f84a.inc
Se refiere a que en nuestro programa se incluirán las definiciones de puertos, registros etc. Del PIC en cuestión.
Con este archivo agregado a nuestro programa, podemos evitar definir los nombres de puertos, registros, etc.
Ahora podemos llamar directamente a PORTB, STATUS y RP0, por ejemplo...
movlw b'10010101'
movwf TRISB
bcf STATUS,RP0
clrf PORTB
Sin la necesidad de definir todos los registros y puertos del PIC
Se evita esto...
PORTB equ 0x06
TRISB equ 0x06
STATUS equ 0x03


Esta es la palabra de configuración del PIC.
__config _XT_OSC & _PWRTE_ON & _WDTE_OFF

Sirve para establecer varios parámetros de configuración del microcontrolador.
_XT_OSC Aquí seleccionamos oscilador a cristal hasta 4MHz.
Para velocidades de reloj más altas, se usa _HS_OSC
_PWRTE_ON Si activamos el bit PWRTE, conseguimos que se genere un retardo en la inicialización del microcontrolador.
Esto se utiliza para que la tensión se estabilice, por lo que se recomienda su uso.
_WDTE_OFF Desactivamos el Watch Dog Timer (Perro Guardián)
Con esto el PIC tiene la capacidad de auto resetearse si está en ON.
Es útil ante problemas que impidan el funcionamiento del programa del PIC,
como un bucle infinito, el WDT lo sacará de el, reseteándo el PIC.

Existen más, pero en este PIC con agregar esos es suficiente, ya que algunos son establecidos por default.

Por aquí en el Foro existe un
asm-desde-0-asm-desde-cero-16898
tutorial de ensamblador desde 0
Léelo y aprenderás más sobre este lenguaje.

Suerte.
 
Última edición:
Atrás
Arriba