Hola!

Registrándote como bakuno podrás publicar, compartir y comunicarte en privado con otros bakuos :D

Regístrame ya!

ayuda...algien que me pueda explicar este programa de mplab

sly32

Bovino maduro
Desde
15 Ago 2009
Mensajes
123
;Programa de regulación de velocidad de un motor de corriente continua mediante la modulación
;de anchura de pulso(PWM). Por la linea de salida se genera una onda cuadrada de frecuencia
;constante s 100Hz(periodo de 10 ms) y ciclo de trabajo variable desde 0% a 100%, dependiendo
;del valor de la entrada del Puerto A. Es decir, el tiempo en alto varia entre 0 ms (0%) y 10
;ms (100%) de acuerdo con la siguiente tabla:

; (Ciclos_ON) (Ciclos_OFF)
; Entrada CD(%) SEMIPERIODO ALTO SEMIPERIODO BAJO
; ------- ----- ---------------- ----------------
; 0 0% 0 mn = 0 x 1 ms 10 ms = 10 x ms
; 1 10% 1 ms = 1 x 1 ms 9 ms = 9 x 1 ms
; 2 20% 2 ms = 2 x 1 ms 8 ms = 8 x 1 ms
; ... ... -------- -------
; 9 90% 9 ms = 9 x 1 ms 1 ms = 1 x 1 ms
; 10 100% 10 ms = 10 x 1 ms 0 ms = 0 x 1 ms
; >10 0%
;
;ZONA DE DATOS***************************************************************************

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

CBLOCK 0x0C
Ciclos_ON
Ciclos_OFF
GuardaEntrada
Var
ENDC

MaximaEntrada EQU .10

;ZONA DE CODIGOS*************************************************************************

ORG 0
Inicio:
bsf STATUS,RP0
movlw b'00001111' ;RA3:RA0 como entradas.
movwf TRISA
clrf TRISB ;Las lineas del Puerto B se configuran como salidas.
bcf STATUS,RP0
Principal
movf PORTA,W ;Lee el puerto de entrada.
andlw b'00001111'
movwf GuardaEntrada ;Guarda el valor.
btfsc STATUS,Z ;Si RA3:RA0=0 el motor se detiene
goto DC_CeroPorCiento
sublw MaximaEntrada ;(W)=10-(PORTA)
btfsc STATUS,Z
goto DC_100PorCiento
btfss STATUS,C ;¿C=1?,¿(w)positivo?,¿(PORTA)<=10?.
goto DC_CeroPorCiento ;Ha resultado(PORTA>10).
movwf Ciclos_OFF ;10-(PORTA)-->(Ciclos_OFF).
movf GuardaEntrada,W
movwf Ciclos_ON ;Carga RA3:RA0 en (Ciclos_ON).
Motor_ON
movlw b'10000000' ;Habilita los drivers y un sentido de giro.
movwf PORTB
call Retardo_1ms
decfsz Ciclos_ON,F ;Si(Ciclos_ON)=0 salta a Motor_OFF.
goto Motor_ON ;+2
Motor_OFF
clrf PORTB ;Inhabilita los drivers. Motor parado.
call Retardo_1ms
decfsz Ciclos_OFF,F ;Si(Ciclos_OFF)=0 salta a Principal.
goto Motor_OFF ;+1
goto Fin
DC_CeroPorCiento
clrf PORTB ;Inhabilita los drivers. Motor Parado.
goto Fin
DC_100PorCiento
movlw b'10000000' ;Habilita los drivers y un sentido de giro
movwf PORTB
Fin:
goto Principal

INCLUDE<RETARDO.INC>
END







;****************************Libreria "RETARDOS.INC"************************************
;
;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/4 Mhz = 1uSeg.
;
;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 hasta 10 microsegundos******************************************************
;
;A continuación retardos pequeños teniendo en cuenta que para una frecuencia de 4Mhz,
;la llamada a subrutina "call" tarda 2 ciclos máquina, el retorno de subrutina
;"return" toma otros 2 ciclos máquina y cada instruccion "nop" tarda 1 ciclo maquina.
;
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
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
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
nop ;Aporta 1 ciclo 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
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
movlw d'5' ;Aporta 1 ciclo máquina. Este es el valor de "K"

;El proximo bloque "RetardoMicros" tarda:
;1 + (K-1) + 2 (K-1) x 2 + 2 -(2+3K) cilcos máquina.

RetardoMicros
movwf R_ContA ;Aporta 1 ciclo máquina.
Rmicros_Bucle
decfsz R_ContA,F ;(K-1) x 1 cm (cuando no salta) + 2 cm (al saltar).
goto Rmicros_Bucle ;Aporta (K-1) x 2 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)= 500ms = 500uS (para K = 164 y 4 Mhz).
;Retardo_200micros: 2+1+1+2+(2+3K)= 200ms = 200uS (para K = 64 y 4 Mhz).
;Retardo_100micros: 2 + 1+2+(2+3K)= 100ms = 100uS (para K = 31 y 4 Mhz).
;Retardo_50micros: 2+1+1+2+(2+3K)= 50ms = 50uS (para K = 14 y 4 Mhz).
;Retardo_20micros: 2 + 1 + (2+3K)= 20ms = 20uS (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 uS = 1mS.

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 maquina.
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'1' ;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".
goto Retardo_1Decima ;Aporta 2 ciclos máquina.

;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 4Mhz son 100011uS = 100mS = 0.1s = 1 decima de segundo.

Retardo_1Decima
movwf R_ContC ;Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
movlw d'100' ;Aporta Nx1 cilcos máquina. Este es el valor de "M".
movwf R_ContB ;Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
movlw d'249' ;Aporta MxNx1 cilcos máquina. Este es el valor de "M".
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:
;Retardos_20s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 20000807 cm = 20s.
; (N = 200, M = 100 y K = 249).
;Retardos_10s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 10000407 cm = 10s.
; (N = 100, M = 100 y K = 249).
;Retardos_5s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 5000207 cm = 5s.
; (N = 50, M = 100 y K = 249).
;Retardos_2s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 2000087 cm = 5s.
; (N = 20, M = 100 y K = 249).
;Retardos_1s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 1000047 cm = 5s.
; (N = 10, M = 100 y K = 249).
;Retardos_500mS:2 + 1 + (2 + 4N + 4MN + 4KMN) = 5000025 cm = 0.5s.
; (N = 5, M = 100 y K = 249).
 
Volver
Arriba