Primer programa para PIC16F84A en assembler

Hola cómo les va? Les cuento que estoy involucrandome con el mundo de los microcontroladores, el cual me resulta muy interesante.
Estoy intentando hacer mi primer programa, y venía muy bien hasta que se me complicó!
Mi intención era hacer un simple programa que con un pulsador conectado al pin RA0, fuera incrementando en uno (del 0 al 9) el número mostrado en un 7 segmentos, conectado al puerto B.
Hice el programa con el mplab en assembler e intenté simularlo con el Proteus, obviamente que por algún error en mi programación no funciona, y hace 2 días que me estoy quemando las pestañas, lo único que hace es encender cualquier segmento al azar.
Podrían por favor orientarme en donde está el problema ya que no consigo verlo?
Les adjunto el diseño del circuito y el programa.

Ver el archivo adjunto test.bmp

Código:
Código:

	__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

	LIST P=PIC16F84A
	INCLUDE<P16F84A.INC>

	ORG 0

	CUENTA     EQU   0CH
	RETARDO   EQU   0DH

Inicio	
		bsf		STATUS,RP0
		clrf	TRISB
		movlw	b'11111111'
		movwf	TRISA
		bcf		STATUS,RP0
		CLRF 	CUENTA
		movf	CUENTA,W		

Principal
		btfsc	PORTA,0
		call 	TEST
		call	ESPERA

		goto	Principal
		
ESPERA
		BTFSC	PORTA,0
		GOTO	ESPERA
		return

TEST
		incf	CUENTA
		movf	CUENTA,W
		call 	Binario_7Seg
		movwf	PORTB
		return

Binario_7Seg

		addwf	PCL,F
Tabla	retlw	3fh
        retlw	06h
        retlw	5bh
        retlw	4fh
        retlw	66h
        retlw	6dh
        retlw	7dh
        retlw	07h
        retlw	7fh
        retlw	67h
        retlw	77h
        retlw	7ch
        retlw	39h
        retlw	5eh
        retlw	79h
        retlw	71h


		END
 
Última edición por un moderador:
Hola, un problema que siempre se tiene en estos casos es el rebote en el pulsador, debes probar de colocar un circuito antirebote y algun retardo al pulsar porque la velocidad del bucle es tan alta que probablemente cuente mucho mas que un pulso y entonces aparece cualquier valor.
 
simulalo, y si te anda bien, échale la culpa a lo que te dice ricber

Edit:

No e dicho nada..peque en leer brevemente lo que exponías y ver lo que te respondieron.

Dado que no tengo mucho tiempo para ver tu código, revisa este que tengo y que esta con simulación incluida, quizás te pueda ser de ayuda o guía en lo que quieres.

Saludos!!
 

Adjuntos

  • prender led por pulsador.rar
    19.7 KB · Visitas: 205
Última edición:
Hola, un problema que siempre se tiene en estos casos es el rebote en el pulsador, debes probar de colocar un circuito antirebote y algun retardo al pulsar porque la velocidad del bucle es tan alta que probablemente cuente mucho mas que un pulso y entonces aparece cualquier valor.

Muchas gracias por tu aporte ricber! Voy a investigar sobre el circuito antirrebote que me mencionas, y alguna función de retardo para el PIC. Ni bien lo haga les comento que tal salieron las pruebas.

simulalo, y si te anda bien, échale la culpa a lo que te dice ricber

Edit:

No e dicho nada..peque en leer brevemente lo que exponías y ver lo que te respondieron.

Dado que no tengo mucho tiempo para ver tu código, revisa este que tengo y que esta con simulación incluida, quizás te pueda ser de ayuda o guía en lo que quieres.

Saludos!!

Muchas gracias thenot! Ni bien vuelva a casa reviso lo que me pasas :)
Lo había simulado con el proteus y hacía cualquier cosa menos lo que yo quería. Seguro que con la info que me pasas y lo que me comenta ricber hoy mismo lo soluciono!
Saludos!
 
Última edición:
Hola! Lo resolví!
thenot, te comento que no pude abrir la simulación que me pasaste porque estaba en una versión anterior de Proteus de la que yo tengo. De todas formas si miré el código del archivo .asm.

Adjunto el circuito y el código por si a alguien le sirve :)

Supongo que hay muchas mejoras a nivel código y hardware, me gustaría que me corrijan así aprendo.

Ver el archivo adjunto test.bmp

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

LIST P=PIC16F84A
INCLUDE<P16F84A.INC>

ORG 0

CONTADOR EQU 0CH
RETARDO EQU 0DH

Inicio
bsf STATUS,RP0
clrf TRISB
movlw b'11111111'
movwf TRISA
bcf STATUS,RP0

Config_7Seg
movlw .0
call Binario_7Seg
movwf PORTB

Principal
btfss PORTA,0
goto Sumar

goto Principal

Sumar
btfss PORTA,0
goto Sumar
incf CONTADOR
movf CONTADOR,W
andlw b'00001111'
call Binario_7Seg
movwf PORTB
goto Principal

Binario_7Seg

addwf PCL,F
Tabla retlw 3fh
retlw 06h
retlw 5bh
retlw 4fh
retlw 66h
retlw 6dh
retlw 7dh
retlw 07h
retlw 7fh
retlw 67h
retlw 77h
retlw 7ch
retlw 39h
retlw 5eh
retlw 79h
retlw 71h


END

Muchas gracias por la ayuda!!!

Saludos.

Pablo.

Por tarde que sea para mi, no podía irme a dormir sin probarlo en el protoboard, lo sé, tengo problemitas jaja, peeero, FUNCIONO! :)
Ahora sí! Voy a poder dormir tranquilo jajaja.

Saludos.

Pablo.
 
Última edición:
Hola! Cómo va?
Hice otro programita, con el mismo circuito del post anterior.
Cuando se presiona el pulsador empieza a incrementarse en 1, cada un segundo, el número mostrado en el 7 segmentos. Y al volver a presionar el pulsador se detiene la cuenta.
Capaz a alguien le sirva como ejemplo así que lo posteo.
Obviamente que se debe poder escribir de forma mas optimizada el código, pero como son mis primeros programitas, es lo que hay :D

Va el código...

Código:
	__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

	LIST P=PIC16F84A
	INCLUDE<P16F84A.INC>

	CBLOCK 0x0C
	ENDC

	ORG 0


Inicio	
		bsf		STATUS,RP0
		clrf	TRISB
		movlw	b'11111111'
		movwf	TRISA
		bcf		STATUS,RP0
		
Config_7Seg		
		movlw	.0
		call 	Binario_7Seg
		movwf	PORTB

Principal
		btfss	PORTA,0
		goto	Sumar

		goto	Principal
	
	CBLOCK
		R_ContA
		R_ContB
		CONTADOR
	ENDC

Sumar
		btfss	PORTA,0
		goto	Sumar
		incf	CONTADOR
		movf	CONTADOR,W
		andlw	b'00001111'
		call 	Binario_7Seg
		movwf	PORTB
		call	Retardo_200ms
		call	Retardo_200ms
		call	Retardo_200ms
		call	Retardo_200ms
		call	Retardo_200ms
		goto	Sumar

VolverPrincipal
		btfss	PORTA,0
		goto	VolverPrincipal
		goto	Principal

Retardo_200ms
		btfss	PORTA,0
		goto	VolverPrincipal
		movlw	d'200'
		goto	Retardo_ms
Retardo_100ms
		movlw	d'100'
		goto	Retardo_ms		
Retardo_1ms
		movlw	d'1'

Retardo_ms
		movwf	R_ContB

R1ms_BucleExterno
		movlw	d'249'
		movwf	R_ContA
R1ms_BucleInterno
		nop
		decfsz	R_ContA,F
		goto	R1ms_BucleInterno
		decfsz	R_ContB,F
		goto	R1ms_BucleExterno
		return

		
Binario_7Seg

		addwf	PCL,F
Tabla	retlw	3fh
        retlw	06h
        retlw	5bh
        retlw	4fh
        retlw	66h
        retlw	6dh
        retlw	7dh
        retlw	07h
        retlw	7fh
        retlw	67h
        retlw	77h
        retlw	7ch
        retlw	39h
        retlw	5eh
        retlw	79h
        retlw	71h


		END

Saludos!

Pablo.
 
Hola amigo mira yo estoy aprendiendo a programar en pic basic y quisiera saber si tu tienes conocimientos en este lenguaje para si poder contar con tu ayuda

amigo este programa como seria en pic basic


Hola! Cómo va?
Hice otro programita, con el mismo circuito del post anterior.
Cuando se presiona el pulsador empieza a incrementarse en 1, cada un segundo, el número mostrado en el 7 segmentos. Y al volver a presionar el pulsador se detiene la cuenta.
Capaz a alguien le sirva como ejemplo así que lo posteo.
Obviamente que se debe poder escribir de forma mas optimizada el código, pero como son mis primeros programitas, es lo que hay :D

Va el código...

Código:
	__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

	LIST P=PIC16F84A
	INCLUDE<P16F84A.INC>

	CBLOCK 0x0C
	ENDC

	ORG 0


Inicio	
		bsf		STATUS,RP0
		clrf	TRISB
		movlw	b'11111111'
		movwf	TRISA
		bcf		STATUS,RP0
		
Config_7Seg		
		movlw	.0
		call 	Binario_7Seg
		movwf	PORTB

Principal
		btfss	PORTA,0
		goto	Sumar

		goto	Principal
	
	CBLOCK
		R_ContA
		R_ContB
		CONTADOR
	ENDC

Sumar
		btfss	PORTA,0
		goto	Sumar
		incf	CONTADOR
		movf	CONTADOR,W
		andlw	b'00001111'
		call 	Binario_7Seg
		movwf	PORTB
		call	Retardo_200ms
		call	Retardo_200ms
		call	Retardo_200ms
		call	Retardo_200ms
		call	Retardo_200ms
		goto	Sumar

VolverPrincipal
		btfss	PORTA,0
		goto	VolverPrincipal
		goto	Principal

Retardo_200ms
		btfss	PORTA,0
		goto	VolverPrincipal
		movlw	d'200'
		goto	Retardo_ms
Retardo_100ms
		movlw	d'100'
		goto	Retardo_ms		
Retardo_1ms
		movlw	d'1'

Retardo_ms
		movwf	R_ContB

R1ms_BucleExterno
		movlw	d'249'
		movwf	R_ContA
R1ms_BucleInterno
		nop
		decfsz	R_ContA,F
		goto	R1ms_BucleInterno
		decfsz	R_ContB,F
		goto	R1ms_BucleExterno
		return

		
Binario_7Seg

		addwf	PCL,F
Tabla	retlw	3fh
        retlw	06h
        retlw	5bh
        retlw	4fh
        retlw	66h
        retlw	6dh
        retlw	7dh
        retlw	07h
        retlw	7fh
        retlw	67h
        retlw	77h
        retlw	7ch
        retlw	39h
        retlw	5eh
        retlw	79h
        retlw	71h


		END

Saludos!

Pablo.
 
Última edición:
Hola Carlos Jara.
La verdad que jamás programé en pic basic. No has buscado ejemplos en el resto del foro? Seguramente algún buen compañero ha subido ejemplos :)
Si llego a encontrar algo te lo paso.

Saludos!

Pablo.
 
que bueno que te haya servido =)
y lo de que mi proteus es de una version menor, pienso que es al revez, tu version debe ser de una version menor, yo tengo la 7.5 sp3.. pero bien lo importante es que solucionaste tu problema.

Saludos man =)
 
Atrás
Arriba