desktop

Delay por TMR0 para un pic16f84A

Hola a todos, sucede que llevo ya algun tiempo con problemas acerca de un delay que supuestamente por los calculos que hice deberia de ser de 2us, pero no sale de eso, sino de 25us. La forma en que hice los calculos fue de la siguiente manera.

Delay= 4*250ns*1*2

El 250 es porque uso un oscilador de 4MHz.
El 1 representa el valor resultante de restar 256 menos el valor cargado en el TMR0
Y el 2 es porque se esta ocupando (supuestamente) el divisor de frecuencia 1:2

Ya realice muchos cambios y ese el delay mas pequeño que obtengo, lo que no me serviria para toda la aplicación que estoy desarrollando ya que necesito un delay de 1us mínimo. Alguien sabe si sera posible con el uso de un 16f84? y ademas ¿Alguien sabe porque no logro la temporización que supuestamente yo planeo?

El programa que mando es el utilizo para los delay, y representa un programa que realiza cuatro rutinas diferentes de acuerdo a la combinación de dos switches que entran por el puerto A y tienen su salida en el puerto B. Es lo único que hace y sin embargo no he podido utilizarlo porque esas temporizaciones no salen. Ah y otra cosa, la idea es obtener un tren de pulsos pero el estado alto y el bajo en todas las comninaciones resulta de diferente ancho de pulso, es decir, por ejemplo, en la combinación 00 el nivel alto dura los 25us ya mencionados, y el bajo dura 30us, con 01 el alto es de 45us y el bajo de 60us, con 10 el alto es de 90us y el bajo de 110us, finalmente con 11 el alto es de 140us y el bajo de 160us. No se porque tiene esos retardos en el nivel bajo, y necesito que tanto nivel bajo, como alto sean iguales.

Muchas gracias por su ayuda, espero que me haya dado a entender.
 

Adjuntos

  • pforo_546.asm
    2.7 KB · Visitas: 44
externamente la señal de reloj es (para tu caso) de 4MHz; internamente el uC lo divide entre 4 lo cual resulta en un frecuencia de 1MHz que es con la que trabaja el uC.

La mayoria de las instrucciones utiliza 1 ciclo de reloj para llevarse a cabo, lo cual equivale a 1uS (microsgundo).

Si solo quieres un delay de 2uS , podrias usar DOS instrucciones NOP, cada una de las cuales utilizaria 1 uS.

Descargate la hoja de datos para mas información.


p.d. un programita que te puede servir para generar rutinas de retardo : http://golovchenko.org/cgi-bin/delay
 
Ya intente realizar la rutina unicamente con un nop, pero lo mas que consigo es un retardo de 6 us (lo que ya me ayuda bastante), solo que siguen siendo asimétricos el pulso "alto" y el "bajo" alguien podria explicarme porque?, y de acuerdo al programa que mando cual es el error y en que influiria el tiempo en el que se realiza cada instrucción, para saber si es esto lo que no permite conseguir el delay planeado.

Por su atención muchas gracias. :)
 
si te das cuenta el call y el return te generan 2 ciclos de reloj y mas el nop de la subrutina de 1us te da un total de 5 uS; en lugar de llamar esa subrutina si solo quieres 1us , solamente utiliza la operacion nop

y las demas subrutinas de retardo te conviene utilizar el programa del link que puse arriba por ejemplo:

Código:
; Delay = 2e-05 seconds
; Clock frequency = 4 MHz

; Actual delay = 2e-05 seconds = 20 cycles
; Error = 0 %

;	cblock
;	d1
;	endc

DELAY20US
			;16 cycles
	movlw	0x05
	movwf	d1
DELAY20US_0
	decfsz	d1, f
	goto	DELAY20US_0

			;4 cycles (including call)
	return
Los pulsos te salen asimetricos debido a que no estas tomando en cuenta las instrucciones que utilizas, quiza te convenga utilizar nop debidamente colocados
 
Atrás
Arriba