Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

25/09/2008 #1


Duda de funcionamiento
Tengo el siguiente código
Estoy haciendo un contador de dígitos de 0-9 ascendente y descendente, con un PIC16F84A, y todo iba bien hasta que al simular ésta parte del programa (contador descendente), encontré que no funciona adecuadamente.


Tengo el siguiente código en el fragmento:
(le pongo el encabezado para que solo lo copien y peguen en MPLAB y lo puedan revisar)

;Fragmento de programa que realiza un contador descendente del 9 al 0 y saca el código de cada
;número por el puerto B, en código para un Display de 7 segmentos, con el punto
;decimal encendido

LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


conde equ 0x20 ; registro para contador ascendente




ORG 0 ; El programa comienza en la dirección 0.

;Configuracion de puertos
bsf STATUS,RP0
clrf TRISB ; Las líneas del Puerto B se configuran como salida.
bcf STATUS,RP0
clrf TRISB

contdes
movlw d'10' ;carga a W un 10
movwf conde ;cargar contenido de W a registro contas

deconde
decf conde,1 ;incrementa contador y guarda el incremento en el mismo registro contas

call tabladec
movwf PORTB

movlw d'0'
subwf conde,0
btfss STATUS,Z ;revise el bit z del registro status y si es 1 saltara la sig inst
goto deconde



tabladec

; Tabla para display de 7 segmentos.
addwf PCL,F
Tabla2
retlw 0x9F ; El código 7 segmentos para el "0".
retlw 0x86 ; El código 7 segmentos para el "1".
retlw 0E ; El código 7 segmentos para el "2".
retlw 0xCF ; El código 7 segmentos para el "3".
retlw 0xE6 ; El código 7 segmentos para el "4".
retlw 0xED ; El código 7 segmentos para el "5".
retlw 0xFD ; El código 7 segmentos para el "6".
retlw 0x87 ; El código 7 segmentos para el "7".
retlw 0xFF ; El código 7 segmentos para el "8".
retlw 0xE7 ; El código 7 segmentos para el "9".

end


El problema es que cuando el registro de contador "conde" tiene 9 y 8, salta a la configuración del número 9y cuando llega al 7, salta a la configuración del 8, y al llegar al 6 salta a la configuración 7 y así sucesivamente.
¿Puede alguién asesorarme?
Pensé que el error estaba en el manejo del PCL y tal vez debería recurrir al PCLATCH, pero no estoy muy segura ya que uso solo 8 bits, que es tamaño del PCL.
Agradezco de antemano.
25/09/2008 #2

Avatar de Eduardo

Re: Duda de funcionamiento
Código:
contdes
		movlw 	d'10'			;carga a W un 10
		movwf 	conde		;cargar contenido de W a registro contas
		
deconde	
		decf 	conde,1			;incrementa contador y guarda el incremento en el mismo registro contas

		call	tabladec
		movwf	PORTB

		movlw 	d'0'
		subwf 	conde,0
		btfss 	STATUS,Z		;revise el bit z del registro status y si es 1 saltara la sig inst
		goto 	deconde
Cada vez que llamas a tabladec el contenido de W es conde+1
--> En la primer llamada te pasas de la tabla, y en las otras te devuelve el correspondiente a conde+1
25/09/2008 #3

Avatar de asherar

en principio lo que me parece es que deberías poner
Código:
 movfw conde  ; Carga conde en W
  call tabladec
caso contrario comienza con 10 y no con 9.

Yo además pongo las tablas antes del código. Así:
Código:
 LIST P=16F84A
 #INCLUDE <P16F84A.INC>
 __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

 conde equ 0x20 ; registro para contador ascendente

 ORG 0 ; El programa comienza en la dirección 0.
	goto	 start  ; Para saltear el vector de interrupciones

 ORG 5  

start  goto main ; Para saltear las tablas

tabladec

; Tabla para display de 7 segmentos.
Tabla2 addwf PCL,F
 retlw 0x9F ; El código 7 segmentos para el "0".
 retlw 0x86 ; El código 7 segmentos para el "1".
 retlw 0E ; El código 7 segmentos para el "2".
 retlw 0xCF ; El código 7 segmentos para el "3". 
 retlw 0xE6 ; El código 7 segmentos para el "4".
 retlw 0xED ; El código 7 segmentos para el "5".
 retlw 0xFD ; El código 7 segmentos para el "6".
 retlw 0x87 ; El código 7 segmentos para el "7".
 retlw 0xFF ; El código 7 segmentos para el "8".
 retlw 0xE7 ; El código 7 segmentos para el "9".

main
;Configuracion de puertos
 bsf STATUS,RP0
 clrf TRISB ; Las líneas del Puerto B se configuran como salida.
 bcf STATUS,RP0
 clrf TRISB

contdes
 movlw d'10' ;carga a W un 10
 movwf conde ;cargar contenido de W a registro contas

deconde
 decf conde,1 ;incrementa contador y guarda el incremento en el mismo registro contas

 movfw conde  ; Carga conde en W
 call tabladec
 movwf PORTB

 movlw d'0'
 subwf conde,0
 btfss STATUS,Z ;revise el bit z del registro status y si es 1 saltara la sig inst
 goto deconde

 end
Nota la posición del rótulo "Tabla2"
27/09/2008 #4


Muchas gracias Alejandro Sherar, justamente al revisarlo de nuevo muchas veces, el problema que encontré fue ese, debí cargar el contenido del registro "conde" antes de llamar a la tabla.
Ya resolví el problema. ¡¡Muchas gracias!
Y sobre eso de cambiar la instrucción "addwf PCL, F" a enfrente de la etiqueta "Tabla2", no es necesario, dejé el programa tal y como estaba, solo carge el contenido de "conde" en W y funcionó a la perfección.

De nuevo:
¡¡Muchas gracias!
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.