Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
de Ingenieros de Gijn
Curso 2002-2003
J3
1
2
J5
BNC
J1
Conexin del
PORTC
1
2
3
4
5
6
7
8
9
10
RC1/CCP2 2
RC1/CCP2
RC2/CCP1
Q1
BC547
Conexin de
Altavoz
Alimentacin
VCC
1
2
J2
J7
J4
BNC
LS1
1
2
3
4
SPEAKER
RC2/CCP1
PORTC
J6
1
2
3
4
GND
RC2/CCP1
RC1/CCP2
25ms
480Hz
1s (sonido)
25ms
25ms
25ms
320Hz 480Hz
......
2s
25ms
320Hz
25ms
480Hz
Silencio
1s(sonido)
25ms
320Hz....
Planteamiento:
Se utiliza el mdulo CCP2 en modo PWM para generar dos ondas cuadradas
con frecuencias de emisin 320Hz y 480Hz. Para reducir armnicos, se hace
que stas ondas sean cuadradas (t en estado alto = t en estado bajo)
Se utiliza el temporizador TMR0 para temporizar intervalos de 25ms,
mediante interrupcin. Un segundo se contabiliza por 40 interrupciones de
TMR0 y 2 segundos por 80 interrupciones de TMR0.
80 interrupciones de
TMR0 (2s) en Estado 0
40 interrupciones de
TMR0 (1s) en Estados 1
2
Interrupcin de TMR0
(25s)
Estado 2
PWM generando 480Hz
Estado 1
PWM generando 320Hz
Interrupcin de TMR0
(25s)
Clculos:
Modo PWM
Frecuencia:
1/frecuencia = (4/fosc) * Prescaler TMR2 * (PR2+1)
Con
fosc=4MHz
Prescaler TMR2 = 16 (elegido)
Resulta:
para 320Hz
para 480Hz
CCPR2L = 97 (0x61)
CCPR2L = 65 (0x41)
TMR0
Para temporizar 25ms = (4/fosc) * Prescaler TMR0 * (256-Precarga)
Resulta: Precarga = 158 (0x9E)
Algoritmo utilizado:
INICIALIZACIN
Puertos: PORTC con RC1 como salida
TMR0 como temporizador y prescaler de 256
Carga de PR2 para generar 320Hz (0xC2)
CCP2 en modo PWM
TMR2 con prescaler de 16
Inicializamos variable ESTADO con cdigo de onda de 320Hz
Ponemos a cero CONTADOR de interrupciones
Cargamos registro de ancho del pulso (duty) CCPR2L (0x61)
Precarga de TMR0 para desbordar tras 25ms (0x9E)
Borramos flag T0IF y activamos interrupciones de TMR0
Ponemos en marcha TMR2
BUCLE PRINCIPAL INFINITO
PROGRAMA DE TRATAMIENTO DE INTERRUPCIN DE TMR0
Se comprueba que T0IF=1 si no salimos de inmediato
Salvamos el contexto del programa ppal. (W y STATUS)
Precargamos TMR0
Incrementamos CONTADOR de interrupciones
Verificamos ESTADO actual para evaluar posibles cambios
Si ESTADO==0 (silencio) y CONTADOR == 80 (2s)
ponemos CONTADOR a cero
cambiamos ESTADO a 1 (onda de 320Hz)
activamos mdulo CCP en PWM
cargamos PR2 y CCPR2L adecuadamente para 320Hz
Si ESTADO ==1 (onda 320Hz)
cambiamos ESTADO a 2 (onda de 480Hz)
cargamos PR2 y CCPR2L adecuadamente para esa frecuencia
EQU
EQU
0x20
0x21
W_temp
ST_temp
EQU
EQU
0x22
0x23
org
goto
0
INICIO
org
goto
4
PTI
INICIO bsf
bcf
STATUS,RP0
TRISC,1
0
1
2
;Paso al banco 1
;Defino pin RC1/CCP2 como salida
b'00000111'
OPTION_REG
0xC2
PR2
bcf
STATUS,RP0
;Vuelvo al banco 0
movlw
movwf
b'00001111'
CCP2CON
;Definimos CCP2
;en modo PWM
movlw
movwf
b'00000011'
T2CON
movlw
movwf
0x01
ESTADO
clrf
CONTADOR
0x61
CCPR2L
BUCLE
movlw
movwf
0x9E
TMR0
;Precargo TMR0
;para que desborde tras 25ms
movlw
movwf
b'10100000'
INTCON
bsf
T2CON,TMR2ON
goto
BUCLE
;Bucle infinito
btfss INTCON,T0IF
retfie
movwf
swapf
movwf
W_temp
STATUS,W
ST_temp
movlw
movwf
0x9E
TMR0
incf
CONTADOR,F
ESTADO,F
STATUS,Z
SILENCIO
movf
xorlw
btfsc
goto
ESTADO,W
0x01
STATUS,Z
A_320Hz
movf
xorlw
btfsc
goto
ESTADO,W
0x02
STATUS,Z
A_480Hz
goto
SALIR_PTI
CONTADOR,W
d'80'
STATUS,Z
SALIR_PTI
CONTADOR
0x01
ESTADO
movlw
movwf
b'00001111'
CCP2CON
bsf
movlw
movwf
bcf
STATUS,RP0
0xC2
PR2
STATUS,RP0
movlw
movwf
0x61
CCPR2L
goto
SALIR_PTI
0x02
ESTADO
SILENCIO
movf
xorlw
btfss
goto
clrf
movlw
movwf
A_320Hz movlw
movwf
STATUS,RP0
0x81
PR2
STATUS,RP0
0x41
CCPR2L
goto
FIN_TONOS
A_480Hz movlw
movwf
0x01
ESTADO
bsf
movlw
movwf
bcf
STATUS,RP0
0xC2
PR2
STATUS,RP0
movlw
movwf
0x61
CCPR2L
FIN_TONOS
movf
xorlw
btfss
goto
clrf
clrf
bcf
clrf
CONTADOR,W
d'40'
STATUS,Z
SALIR_PTI
CONTADOR
ESTADO
PORTC,1
CCP2CON
SALIR_PTI
bcf
INTCON,T0IF
swapf
movwf
swapf
swapf
retfie
interrupcin
END
ST_temp,W
STATUS
W_temp,F
W_temp,W
de
programa
de
tratamiento
de