Ayuda para Sincronizar PIC16f84A :: Programa sencillo

Muy buen día queridos amigos, alguien puede por favor ayudarme a sincronizar este miniprograma, para que el conteo del MINUTO sea absolutamente exacto. Tengo entendido que cada instrucción realizada por el PIC se demora 1 microsegundo, pero necesito que sea realmente exacto, para aprovechar la exactitud del cristal (4mhz):

#include <16f84A.h>
#fuses XT, NOWDT, NOPROTECT, PUT
#use delay(clock=4000000)
void main()
{
disable_interrupts(GLOBAL);
while (1)
{
output_high(pin_b3);
delay_ms(57000);
output_low(pin_b3);
delay_ms(3000);
}
}


Instrucciones para delays en C, en:
http://www.cc.gatech.edu/ccg/resources/pic/#ss52
 
Hola:

1- Antes que nada, debes sincronizarse uno mismo.

2- Puedes crear retardos exactos con con la laibrería que te dejo abajo en ASM.

3- C para un 16F84A es mucho, si te pones a su lugar lo entenderás, sólo hay que ser empático. A él le encanta el ensamblador.

4- C es más boen para los 18F o los nuevos 16F con nuevo núcleo y 14 instrucciones nuevas.

Saludos.
 
Hay librerías de retardos y timer, también un aweb sobre ello que ahora no recuerdo.

Código:
;**************************** Librería "RETARDOS.INC" *********************************
;
;    ===================================================================
;      Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;      E. Palacios, F. Remiro y L. López.        www.pic16f84a.com
;       Editorial Ra-Ma.  www.ra-ma.es
;    ===================================================================
;
; Librería con múltiples subrutinas de retardos, desde 4 microsegundos hasta 20 segundos. 
; Además se pueden implementar otras subrutinas muy fácilmente.
;
; Se han calculado para un sistema microcontrolador con un PIC trabajando con un cristal
; de cuarzo a 4 MHz. Como cada ciclo máquina son 4 ciclos de reloj, resulta que cada
; ciclo máquina tarda 4 x 1/4MHz = 1 µs.
;
; En los comentarios, "cm" significa "ciclos máquina".
;
; ZONA DE DATOS *********************************************************************

    CBLOCK
    R_ContA                        ; Contadores para los retardos.
    R_ContB
    R_ContC
    ENDC
;
; RETARDOS de 4 hasta 10 microsegundos ---------------------------------------------------
;
; A continuación retardos pequeños teniendo en cuenta que para una frecuencia de 4 MHZ,
; la llamada a subrutina "call" tarda 2 ciclos máquina, el retorno de subrutina
; "return" toma otros 2 ciclos máquina y cada instrucción "nop" tarda 1 ciclo máquina.
;
Retardo_10micros                ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
    nop                            ; Aporta 1 ciclo máquina.
    nop                            ; Aporta 1 ciclo máquina.
    nop                            ; Aporta 1 ciclo máquina.
    nop                            ; Aporta 1 ciclo máquina.
Retardo_5micros                    ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
Retardo_4micros                    ; La llamada "call" aporta 2 ciclos máquina.
    return                        ; El salto del retorno aporta 2 ciclos máquina.
;
; RETARDOS de 20 hasta 500 microsegundos ------------------------------------------------
;
Retardo_500micros                ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
    movlw    d'164'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
    goto    RetardoMicros        ; Aporta 2 ciclos máquina.
Retardo_200micros                ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
    movlw    d'64'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
    goto    RetardoMicros        ; Aporta 2 ciclos máquina.
Retardo_100micros                ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'31'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
    goto    RetardoMicros        ; Aporta 2 ciclos máquina.
Retardo_50micros                ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
    movlw    d'14'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
    goto    RetardoMicros        ; Aporta 2 ciclos máquina.
Retardo_20micros                ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'5'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
;
; El próximo bloque "RetardoMicros" tarda:
; 1 + (K-1) + 2 + (K-1)x2 + 2 = (2 + 3K) ciclos máquina.
;
RetardoMicros
    movwf    R_ContA                ; Aporta 1 ciclo máquina.
Rmicros_Bucle
    decfsz    R_ContA,F            ; (K-1)x1 cm (cuando no salta) + 2 cm (al saltar).
    goto    Rmicros_Bucle        ; Aporta (K-1)x2 ciclos máquina.
    return                        ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_500micros:    2 + 1 + 1 + 2 + (2 + 3K) = 500 cm = 500 µs. (para K=164 y 4 MHz).
; - Retardo_200micros:    2 + 1 + 1 + 2 + (2 + 3K) = 200 cm = 200 µs. (para K= 64 y 4 MHz).
; - Retardo_100micros:    2     + 1 + 2 + (2 + 3K) = 100 cm = 100 µs. (para K= 31 y 4 MHz).
; - Retardo_50micros :    2 + 1 + 1 + 2 + (2 + 3K) =  50 cm =  50 µs. (para K= 14 y 4 MHz).
; - Retardo_20micros :    2     + 1     + (2 + 3K) =  20 cm =  20 µs. (para K=  5 y 4 MHz).
;
; RETARDOS de 1 ms hasta 200 ms. --------------------------------------------------------
;
Retardo_200ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'200'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_100ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'100'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_50ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'50'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_20ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'20'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_10ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'10'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_5ms                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'5'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_2ms                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'2'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_1ms                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'1'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
;
; El próximo bloque "Retardos_ms" tarda:
; 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 =
; = (2 + 4M + 4KM) ciclos máquina. Para K=249 y M=1 supone 1002 ciclos máquina
; que a 4 MHz son 1002 µs = 1 ms.
;
Retardos_ms
    movwf    R_ContB                ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
    movlw    d'249'                ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
    movwf    R_ContA                ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
    nop                            ; Aporta KxMx1 ciclos máquina.
    decfsz    R_ContA,F            ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
    goto    R1ms_BucleInterno    ; Aporta (K-1)xMx2 ciclos máquina.
    decfsz    R_ContB,F            ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
    goto    R1ms_BucleExterno     ; Aporta (M-1)x2 ciclos máquina.
    return                        ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_200ms:    2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249).
; - Retardo_100ms:    2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249).
; - Retardo_50ms :    2 + 1 + 2 + (2 + 4M + 4KM) =  50007 cm =  50 ms. (M= 50 y K=249).
; - Retardo_20ms :    2 + 1 + 2 + (2 + 4M + 4KM) =  20007 cm =  20 ms. (M= 20 y K=249).
; - Retardo_10ms :    2 + 1 + 2 + (2 + 4M + 4KM) =  10007 cm =  10 ms. (M= 10 y K=249).
; - Retardo_5ms  :    2 + 1 + 2 + (2 + 4M + 4KM) =   5007 cm =   5 ms. (M=  5 y K=249).
; - Retardo_2ms  :    2 + 1 + 2 + (2 + 4M + 4KM) =   2007 cm =   2 ms. (M=  2 y K=249).
; - Retardo_1ms  :    2 + 1     + (2 + 4M + 4KM) =   1005 cm =   1 ms. (M=  1 y K=249).
;
; RETARDOS de 0.5 hasta 20 segundos ---------------------------------------------------
;
Retardo_20s                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'200'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
    goto    Retardo_1Decima        ; Aporta 2 ciclos máquina.
Retardo_10s                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'100'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
    goto    Retardo_1Decima        ; Aporta 2 ciclos máquina.
Retardo_5s                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'50'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
    goto    Retardo_1Decima        ; Aporta 2 ciclos máquina.
Retardo_2s                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'20'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
    goto    Retardo_1Decima        ; Aporta 2 ciclos máquina.
Retardo_1s                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'10'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
    goto    Retardo_1Decima        ; Aporta 2 ciclos máquina.
Retardo_500ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'5'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
;
; El próximo bloque "Retardo_1Decima" tarda:
; 1 + N + N + MxN + MxN + KxMxN + (K-1)xMxN + MxNx2 + (K-1)xMxNx2 +
;   + (M-1)xN + Nx2 + (M-1)xNx2 + (N-1) + 2 + (N-1)x2 + 2 =
; = (2 + 4M + 4MN + 4KM) ciclos máquina. Para K=249, M=100 y N=1 supone 100011
; ciclos máquina que a 4 MHz son 100011 µs = 100 ms = 0,1 s = 1 décima de segundo.
;
Retardo_1Decima
    movwf    R_ContC                ; Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
    movlw    d'100'                ; Aporta Nx1 ciclos máquina. Este es el valor de "M".
    movwf    R_ContB                ; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
    movlw    d'249'                ; Aporta MxNx1 ciclos máquina. Este es el valor de "K".
    movwf    R_ContA                ; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno          
    nop                            ; Aporta KxMxNx1 ciclos máquina.
    decfsz    R_ContA,F            ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
    goto    R1Decima_BucleInterno    ; Aporta (K-1)xMxNx2 ciclos máquina.
    decfsz    R_ContB,F            ; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
    goto    R1Decima_BucleExterno    ; Aporta (M-1)xNx2 ciclos máquina.
    decfsz    R_ContC,F            ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
    goto    R1Decima_BucleExterno2    ; Aporta (N-1)x2 ciclos máquina.
    return                        ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_20s:    2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 20000807 cm = 20 s.
;            (N=200, M=100 y K=249).
; - Retardo_10s:    2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 10000407 cm = 10 s.
;            (N=100, M=100 y K=249).
; - Retardo_5s:        2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  5000207 cm =  5 s.
;            (N= 50, M=100 y K=249).
; - Retardo_2s:        2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  2000087 cm =  2 s.
;            (N= 20, M=100 y K=249).
; - Retardo_1s:        2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  1000047 cm =  1 s.
;            (N= 10, M=100 y K=249).
; - Retardo_500ms:    2 + 1     + (2 + 4N + 4MN + 4KMN) =   500025 cm = 0,5 s.
;            (N=  5, M=100 y K=249).

;    ===================================================================
;      Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;      E. Palacios, F. Remiro y L. López.        www.pic16f84a.com
;       Editorial Ra-Ma.  www.ra-ma.es
;    ===================================================================
 
homero-pensando-300x205.jpg

INTERESANTE:

Sólo pretendo una ayuda para mi programita, no podría aprender en un día lo que sé que les llevó meses o años a ustedes.
homero+simpson+triste.gif
 
Última edición:
Información es poder.

Haz una plantilla de lo que deseas paso a paso, si haces preguntas generales obtienes respuestas generales o simplemente no tienes respusta.
 
Pretendo hacer un reloj que marcará la hora minuto a minuto; la marcación va a ser activada por un mecanismo que es activado por un motor, para la activación el motor deberá estár encendido durante 4 segundos, y apagado durante 56 segundos para completar el minuto.
Pero el programa debe considerar también el retardo que se genera al ejecutar cada instrucción, pues de no ser así, se retrasará cierto numero de segundos diarios que al año serían varios minutos, cosa que no debe hacer un reloj, considerando que el PIC funciona con un cristal de 4mhz sería un desperdicio de exactitud.
 
Para no perder precision se usa un timer... incluso algunas veces se usa un 2o cristal o un circuito dedicado a las funciones de timer y calendario....

Tambien por alli en el foro hay un tema de alguien que hizo un timer basandose en el conteo de la frecuencia de la linea electrica... es muy bueno, te recomiendo que lo busques...
 
Atrás
Arriba