Autor Tema: Encender y apagar un led cada segundo en PROTEUS+MPLAB+ASM+PIC16F84  (Leído 38427 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado evolution

  • PIC10
  • *
  • Mensajes: 3
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 diseño 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 pinión o alguna recomendción, 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 simulación con proteus no va como debiera.

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Encender y apagar un led cada segundo en PROTEUS+MPLAB+ASM+PIC16F84
« Respuesta #1 en: 22 de Agosto de 2008, 15:55:00 »
Hola evolution, primero y principal en la simulación 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 errático. Debes utilizar el analizador lógico o el osciloscopio del proteus para corroborar los tiempos.

lo segundo: Para poder realizar retardos en asm el máximo valor que puede tomar un registro es 255,

Código: [Seleccionar]
;********************************************************************************************

__CONFIG _CP_OFF& _WDT_OFF& _PWRTE_ON& _XT_OSC

LIST P=16F84A           
INCLUDE <P16F84A.INC>   


;********************************************************************************************

#DEFINE LED PORTB,0

CBLOCK
Cont
ENDC

;********************************************************************************************

ORG 0             

Inicio bsf STATUS,RP0   
bcf LED
bcf STATUS,RP0   
Principal
bsf LED
call Retardo
bcf LED
call Retardo
goto Principal

;********************************************************************************************

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

;********************************************************************************************

END

;********************************************************************************************
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 más largos debes anidar varios bucles. Espero haberte ayudado

Desconectado evolution

  • PIC10
  • *
  • Mensajes: 3
Re: Encender y apagar un led cada segundo en PROTEUS+MPLAB+ASM+PIC16F84
« Respuesta #2 en: 22 de Agosto de 2008, 17:01:16 »
gracias pablomanieri, me acabas de dar luz en esto ya veo por donde va el asunto gracias de antemano, que sitio tan agradable.

Desconectado evolution

  • PIC10
  • *
  • Mensajes: 3
Re: Encender y apagar un led cada segundo en PROTEUS+MPLAB+ASM+PIC16F84
« Respuesta #3 en: 22 de Agosto de 2008, 17:34:19 »
Código: [Seleccionar]
;************************************************************************************************
;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

;********************************************************************************************

ORG 0             

Inicio bsf STATUS,RP0   
bcf LED
bcf STATUS,RP0   
Principal
bsf LED
call Retardo_2
call Retardo_2
call Retardo_2
call Retardo_2
call Retardo_2
bcf LED
call Retardo_2
call Retardo_2
call Retardo_2
call Retardo_2
call Retardo_2
goto 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

;********************************************************************************************