Sie sind auf Seite 1von 4

Hola, estoy iniciando en esto de los microcontroladores y pues he estado leyendo un poco acerca del tema me he guiado de un conocido

libro de la editorial Alfa-Omega


RA-MA supongo que muchos lo tienen o lo han leido, bueno ahi he visto sobre rutinas para crear retardos. pues bien, hice algunas modificaciones para hacerlo mas
entendible para mi, asi como tambien obtuve un jemplo que hacia lo mismo de una pagina perdida por ahi, no obstante dicho ejemplo fue escrito en basic y solo brindaban
el .hex, para darme un idea de como van las cosas he estado usando el editor MPLAB junto con el simulador Proteus, en donde el ejemplo del amigo desconocido va de
maravilla, sinembargo el mio no va como debiera y realiza parpadeos de manera acelerada y erratica, aqui dejo el codigo asm, el archivo .hex y el archivo del diseo en
Proteus, nose bien si es algo con el codigo que estoy pasando por alto o que esta mal o bien si es algo referente al simulador de proteus, me agradaria me dieran su pinin
o alguna recomendcin, estoy usando el PIC16F84A, con el MPLABSIM pues he seguido paso a paso el rumbo que sigue el flujo de procesamiento y va deacuerdo a lo
esperado sinembargo en la simulacin con proteus no va como debiera.

RPTA1: Hola evolution, primero y principal en la simulacin de proteus no debes fijarte en la frecuencia con que el led parpadea, ya que no lo hace en tiempo real y por lo
tanto parece como si fuese errtico. Debes utilizar el analizador lgico o el osciloscopio del proteus para corroborar los tiempos.
lo segundo: Para poder realizar retardos en asm el mximo valor que puede tomar un registro es 255, y tu colocaste 249000, el compilador solo te toma los bits menos
significativos en este caso 0 por lo tanto el retardo que logras es de solo 256 pasos, es decir hasta que tu variable se haga nuevamente 0. Con esto logras un retardo de
alrededor de 4*256/1Meg=1.024mseg. que est muy lejos de un segundo.
Para realizar retardos ms largos debes anidar varios bucles. Espero haberte ayudado

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

;********************************************************************************************
#DEFINE

LED
CBLOCK
Cont

PORTB,0

ENDC
;********************************************************************************************

Inicio

ORG

bcf
bcf

STATUS,RP0
LED
STATUS,RP0

bsf
call
bcf
call
goto

LED
Retardo
LED
Retardo
Principal

bsf

Principal

;********************************************************************************************
Retardo
movlw d'249000'
movwf Cont
bucle
nop
decfsz Cont,1
goto
bucle
return
;********************************************************************************************
END
;********************************************************************************************

;************************************************************************************************
;Anidando un bucle queda de esta forma si el valor maximo de un registro es 255 pues utlizo un segundo
;contador con valor 200 y ahora si, porsupuesto que las instrucciones del bucle que anida agregan ciclos maquina
;pero ya tiene mas sentido esto :) gracias.
;************************************************************************************************
__CONFIG _CP_OFF& _WDT_OFF& _PWRTE_ON& _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>

;********************************************************************************************
#DEFINE

LED

PORTB,0

CBLOCK
Cont_1
Cont_2
ENDC
;********************************************************************************************

Inicio

ORG

bcf
bcf

STATUS,RP0
LED
STATUS,RP0

bsf
call
call
call
call
call
bcf
call
call

LED
Retardo_2
Retardo_2
Retardo_2
Retardo_2
Retardo_2
LED
Retardo_2
Retardo_2

bsf

Principal

call
call
call
goto

Retardo_2
Retardo_2
Retardo_2
Principal

;********************************************************************************************
Retardo_2
movlw d'200'
movwf Cont_2
bucle_2
decfsz Cont_2,1
Retardo_1
movlw d'249'
movwf Cont_1
bucle_1
nop
decfsz Cont_1,1
goto
bucle_1
return
goto
bucle_2
return
;********************************************************************************************
END
;********************************************************************************************

Das könnte Ihnen auch gefallen