Sei sulla pagina 1di 7

E.P.S.

de Ingenieros de Gijn
Curso 2002-2003

Prcticas de Sistemas Electrnicos Digitales


Curso 3 Ingeniera de Telecomunicacin

Se trata de realizar el diseo del programa encargado de generar el ring


de llamada de un telfono. Para eso empleamos el mdulo CCP2 de un
PIC16C65B y la placa de prcticas cuyo esquema elctrico aparece a
continuacin.
Alimentacin
VCC

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

Para test con


Osciloscopio

1
2
3
4

GND
RC2/CCP1
RC1/CCP2

Se emplea un oscilador de 4MHz para el microcontrolador.


El timbre de llamada consiste en un intervalo de 1s de sonido (en el que se
van alternando dos tonos de 320Hz y de 480Hz durante 25ms cada uno),
seguido de un intervalo de silencio de 2s y as sucesivamente.
25ms
320Hz

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.

E.P.S. de Ingenieros de Gijn


Curso 2002-2003

Prcticas de Sistemas Electrnicos Digitales


Curso 3 Ingeniera de Telecomunicacin

Cuando entra una interrupcin, se evala el estado actual y las posibles


modificaciones en el mismo de acuerdo con el siguiente diagrama de
estados:
Estado 0
Silencio
CCP2 inactivo

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

PR2= 194 (0xC2)


PR2=129 (0x81)

Ancho de pulso (tiempo en estado alto)


1/(2*frecuencia) = (1/fosc) * Prescaler TMR2 * (CCPR2L+2bits)
Tomamos los 2 bits a cero
Resultando: para 320Hz
para 480Hz

CCPR2L = 97 (0x61)
CCPR2L = 65 (0x41)

E.P.S. de Ingenieros de Gijn


Curso 2002-2003

Prcticas de Sistemas Electrnicos Digitales


Curso 3 Ingeniera de Telecomunicacin

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

E.P.S. de Ingenieros de Gijn


Curso 2002-2003

Prcticas de Sistemas Electrnicos Digitales


Curso 3 Ingeniera de Telecomunicacin

Si ESTADO ==2 (onda 480Hz)


cambiamos ESTADO a 1 (onda de 320Hz)
cargamos PR2 y CCPR2L para generar 320Hz
Si ESTADO era 1 2
Si CONTADOR ==40 (ha pasado 1s emitiendo)
ponemos CONTADOR a cero
cambiamos ESTADO a 0 (silencio)
desactivamos CCP2
Ponemos a cero el flag de TMR0
Recuperamos contexto del programa ppal.
Retornamos del programa de tratamiento de interrupcin

E.P.S. de Ingenieros de Gijn


Curso 2002-2003

Prcticas de Sistemas Electrnicos Digitales


Curso 3 Ingeniera de Telecomunicacin

Cdigo Fuente de la Aplicacin


;**************************************************************************
;
; Ejemplo para la generacin de un ring telefnico mediante mdulo PWM
;
; Se utiliza el mdulo CCP2 (salida RC1) para generar dos tonos que se
; alternan durante 25ms cada uno durante un total de tiempo de 1s
; al cabo de ese tiempo, se mantiene un intervalo de 2s de silencio
;
; Los tonos corresponden a frecuencias de 320Hz y 480Hz y se generan ondas
; cuadradas de tales frecuencias que se amplifican con un transistor npn y
; se emplea un pequeo altavoz
;
; En el fichero RIING.ASM. Realizado por Fernando Nuo Garca
;
;**************************************************************************
;
; Los clculos estn realizados para un oscilador de 4MHz
;
; Se programan interrupciones de TMR0 cada 25ms. En el modo de emisin
; se alterna la carga de PR2 para cambiar la frecuencia en cada paso
; cuando se haya completado 1s (40 interrupciones de TMR0) se pasa a modo
; silencio y cuando hayan transcurrido 80 interrupciones (2s) volvemos
; al modo de emisin
;
list p=16c65
;Procesador PIC16c65
include <p16c65.inc>
CONTADOR
ESTADO

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

;Contador de interrupciones de TMR0


;Estado del Sistema: Silencio
;
Fr de 320 Hz
;
Fr de 480 Hz
;Salvaguarda temporal de W
;idem para STATUS

0
1
2

;Paso al banco 1
;Defino pin RC1/CCP2 como salida

; Para temporizar 25ms con TMR0: 25ms = (4/4MHz)* 256 * (256-158)


; precarga de TMR0: 158 (0x9E)
movlw
movwf

b'00000111'
OPTION_REG

;TMR0 modo temporizador


;y prescaler de 256

; 1/320Hz = (PR2+1)* Prescaler_TMR2 (=16) * 4/4MHz ---> PR2= 194 (0xC2)


movlw
movwf

0xC2
PR2

;Cargo PR2 para 320Hz


;aprovecho que estamos en banco 1

bcf

STATUS,RP0

;Vuelvo al banco 0

movlw
movwf

b'00001111'
CCP2CON

;Definimos CCP2
;en modo PWM

movlw
movwf

b'00000011'
T2CON

;Defino TMR2 prescaler 16


;y parado al principio

movlw
movwf

0x01
ESTADO

;Inicializo con PWM de f=320Hz


;en variable ESTADO

clrf

CONTADOR

;Pongo a 0 contador de interrupciones

; Registro de duty: 1/(2*320Hz)=(CCPR2L_2bits) * PrescalerTMR2 * 1/4MHz


; CCPR2L=97 (0x61)
movlw
movwf

0x61
CCPR2L

;Cargo registro de duty


;para ton = 1/(2*320Hz)

E.P.S. de Ingenieros de Gijn


Curso 2002-2003

BUCLE

Prcticas de Sistemas Electrnicos Digitales


Curso 3 Ingeniera de Telecomunicacin

movlw
movwf

0x9E
TMR0

;Precargo TMR0
;para que desborde tras 25ms

movlw
movwf

b'10100000'
INTCON

;Pongo a 0 flag de TMR0 y activo


;sus interrupciones

bsf

T2CON,TMR2ON

;Pongo en marcha TMR2

goto

BUCLE

;Bucle infinito

; Programa de Tratamiento de Interrupcin


PTI

btfss INTCON,T0IF
retfie
movwf
swapf
movwf

W_temp
STATUS,W
ST_temp

;Si entramos aqu por otro motivo


;distinto a T0IF=1 salimos de inmediato
;Salvamos el registro W
;y el registro STATUS por
;si acaso se manipulan para el principal

movlw
movwf

0x9E
TMR0

;Precargamos de nuevo TMR0


;para otros 25ms

incf

CONTADOR,F

;Incrementamos el Contador de 25ms

;Ahora miramos en qu estado estbamos


movf
btfsc
goto

ESTADO,F
STATUS,Z
SILENCIO

;Comparamos ESTADO con 0

movf
xorlw
btfsc
goto

ESTADO,W
0x01
STATUS,Z
A_320Hz

;Comparamos ESTADO con 0x01

movf
xorlw
btfsc
goto

ESTADO,W
0x02
STATUS,Z
A_480Hz

;Comparamos estado con 2

goto

SALIR_PTI

;Si no era ninguno de los conocidos salimos

CONTADOR,W
d'80'
STATUS,Z
SALIR_PTI
CONTADOR
0x01
ESTADO

;Si el ESTADO era de Silencio, salimos


;al cabo de 2s (80 interrupciones)

movlw
movwf

b'00001111'
CCP2CON

;Activamos el mdulo CCP en modo PWM


;de nuevo si haba que cambiar

bsf
movlw
movwf
bcf

STATUS,RP0
0xC2
PR2
STATUS,RP0

;Cargo PR2 para 320Hz


;PR2 est en banco 1

movlw
movwf

0x61
CCPR2L

;Cargo tambin registro de duty


;para ton = 1/(2*320Hz)

goto

SALIR_PTI

;Vamos a salir de la interrupcin

0x02
ESTADO

;El Estado era de generar onda


;de 320Hz, tenemos que cambiar a 480Hz

SILENCIO
movf
xorlw
btfss
goto
clrf
movlw
movwf

A_320Hz movlw
movwf

;Si era el 0 es de Silencio

;Si era el 1 estaba a 320HZ

;Si era el 2 estaba a 480Hz

;si no llegamos a 80 salimos sin cambiar


;Si ya han pasado 2s = 80 * 25ms
;paso a ESTADO de 320Hz

; 1/480Hz = (PR2+1)* Prescaler_TMR2 (=16) * 4/4MHz ---> PR2= 129 (0x81)


bsf
movlw
movwf
bcf

STATUS,RP0
0x81
PR2
STATUS,RP0

;Precarga de PR2 para 480Hz

; Registro de duty: 1/(2*480Hz)=(CCPR2L_2bits) * PrescalerTMR2 * 1/4MHz


; CCPR2L=65 (0x41)

E.P.S. de Ingenieros de Gijn


Curso 2002-2003
movlw
movwf

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

Prcticas de Sistemas Electrnicos Digitales


Curso 3 Ingeniera de Telecomunicacin
;Cargamos el Ton tambin
;para la mitad del periodo

;El Estado era generando onda de 480Hz


;hay que cambiar de Estado a 320Hz
;Modificamos PR2 para 320Hz

;Cargamos tambin Ton


;Parte final comn de emisin
;Comparamos contador con 40
;para ver si ha pasado ya 1s
;Si no hemos llegado salimos
;si ya hemos llegao ponemos a 0 CONTADOR
;pasamos a estado de Silencio
;y anulamos salida
;Desactivamos el mdulo CCP2 en silencio

;ponemos a cero el flag para la sig. interrupcin


;Recuperamos el registro STATUS con un SWAPF
;Recuperamos tambin el W con dos SWAPF
;Retornamos

de

programa

de

tratamiento

de

Potrebbero piacerti anche