Sie sind auf Seite 1von 4

Hoja 1 de 2

SIMULACIN EXAMEN SEGUNDO PARCIAL de DSD


Nota los ejercicios 3 y 4 tiene solucin. En caso de presentarse ejercicios similares en el examen debe
resolverlos siguiendo el patrn que se muestra en esta simulacin.
EJERCICIO 1:
a) Configurar solo los bits necesarios de los registros asociados al modulo CCP del PIC16F877A para conseguir una
interrupcin cuando se produzca una captura por un flanco de bajada en el pin CCP1 (RC2/CCP1 para el mdulo CCP1.
0

GIE
1

PEIE
1

PSPIE
0

ADIE
0

PSPIF
0

ADIF
0

CCPxCON -- CCP1CON (17h) Y CCP2CON


DCXB1
DCxB0
CCPxM3
CCPxM2
0
0
0
1
INTCON
T0IE
INTE
RBIE
T0IF
0
0
0
0
PIE1
RCIE
TXIE
SSPIE
CCP1IE
0
0
0
1
PIR1
RCIF
TXIF
SSPIF
CCP1IF
0
0
0
0

CCPxM1
0

CCPxM0
0

INTF
0

RBIF
0

TMR2IE
0

TMR1IE
0

TMR2IF
0

TMR1IF
0

b) Configurar solo los bits necesarios de los registros asociados al modulo CCP del PIC16F877A para conseguir una
interrupcin cuando el TMR1 alcance el valor de 3500 y por un flanco de bajada en el pin (RC2/CCP1) se ponga en 1.
0

GIE
1

PEIE
1

PSPIE
0

ADIE
0

PSPIF
0

ADIF
0

CCPxCON -- CCP1CON (17h) Y CCP2CON


DCXB1
DCxB0
CCPxM3
CCPxM2
0
0
1
0
CCPR1L
1
0
1
1
CCPR1H
0
0
1
1
INTCON
T0IE
INTE
RBIE
T0IF
0
0
0
0
PIE1
RCIE
TXIE
SSPIE
CCP1IE
0
0
0
0
PIR1
RCIF
TXIF
SSPIF
CCP1IF
0
0
0
0

CCPxM1
0

CCPxM0
1

INTF
0

RBIF
0

TMR2IE
0

TMR1IE
1

TMR2IF
0

TMR1IF
0

EJERCICIO 2: Realizar el diseo de un programa encargado de generar el ring de llamada de un telfono. Para eso empleamos
el mdulo CCP1 de un PIC16F877. Primero intercalaran ondas cuadradas de 320Hz y 480Hz durante 25ms cada una durante 1s.
Seguido de 2s de silencio.
Se valorar:
(a) La explicacin de la generacin de los baudios.
(b) La explicacin de la estructura del programa principal.
SOLUCIN
//T = (PR2 + 1) 4 TOSC PRESCALER TMR2
//T ON = (CCPRxL:CCPxCON<5:4>) TOSC PRESCALERTMR2
//Si usamos FOSC=4MZ y un PRESCALER TMR2=16,
//Entonces:
//frecuencia de 320hz,.. PR2=194 y (CCPRxL:CCPxCON<5:4>)=391
//frecuebcia de 480hz,.. PR2=129 y (CCPRxL:CCPxCON<5:4>)=258
#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#use fast_io(c)
int16 i;

;aade librerias del PIC


;fusibles de control de PIC
;configure el reloj de retardo
;configuracion rapida del PIC
;variable entera de 16 bits

Hoja 2 de 2
void main()
{
while (true){
for (i=0;i<40;i++){
setup_timer_2(T2_DIV_BY_16,194,1);

;programa principal
;bucle infinito
//PR2=194

;enciende timer 2 preescaler de 16


bit,carga Pr2 y post escaler siempre en 1
;configure ccp1 en modo PWN
;moviendo ccpr1l y ccpr1h
;retardo 25 milisegundos
;apaga ccp1
;{

setup_ccp1(CCP_PWM);
set_pwm1_duty(391);//CCP1 en modo PWM
delay_ms(25);
setup_ccp1(CCP_OFF);
setup_timer_2(T2_DIV_BY_16,129,1);
//PR2=194
setup_ccp1(CCP_PWM);
set_pwm1_duty(258);//CCP1 en modo PWM
delay_ms(25);
setup_ccp1(CCP_OFF);
}
set_tris_c(0x00);
output_low(PIN_C2);
delay_ms(2000);
}
}

Repite lo mismo para una frecuencia de 480


;}
; configure como salida
;coloca en 0 el pin C2
;retardo de 2 segundos

EJERCICIO 3: Explicar con el mayor detalle posible el funcionamiento del siguiente programa (Que es lo que hace?). Deber
aadir todos los comentarios necesarios encada lnea para su perfecta comprensin.
#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#include <lcd.c>
#byte PIR1=0x0C
int1 nuevopulso=0;
int16 TFB=0,TFS=0,TF=0;
float AP=0.0;
int1 cambio=0;

//Entra otro pulso


//Tiempo flancos
//Valor final del ancho de pulso
//Cambio de flanco de disparo

#int_ccp1
void ccp1_int(){
//Funcin interrupcin
if(cambio==0){
//Flanco de subida
TFS=CCP_1;
//Carga del valor del registro CCPR1 en flanco subida
setup_ccp1(CCP_CAPTURE_FE); //Configuracin modo Captura en flanco de bajada
cambio=1;
//Control de cambio de flanco
} else {
//Flanco de Bajada
TFB=CCP_1;
//Carga del valor del registro CCPR1 en flanco bajada
setup_ccp1(CCP_CAPTURE_RE); //Configuracin modo Captura en flanco de subida
cambio=0;
//Control de cambio de flanco
if(nuevopulso==0){
nuevopulso=1;
}
}

//Fin de pulso...
//pulso a medir

}
void main() {
lcd_init();
setup_timer_1(T1_INTERNAL);
setup_ccp1(CCP_CAPTURE_RE);
cambio = 0;
enable_interrupts(int_ccp1);
enable_interrupts(global);

//Configuracin TMR1
//Configuracin modo Captura en flanco de subida
//Control de cambio a 0
//Habilitacin interrupcin modulo CCP
//Habilitacin interrupcin global

do {
if(nuevopulso==1){
//Pulso nuevo?
TF=(TFB-TFS);
//Ancho de pulso.
AP = TF*1.0;
//Ancho de pulso en microsegundos (a 4MHz:1us)
printf(lcd_putc,"\nPulso = %6.1fuS ", AP);
nuevopulso=0;
//Pulso ya medido, espera nuevo
}
} while (TRUE);
}

Hoja 3 de 2
Solucin:
Realiza la medicin del un ancho de pulso de un tren de pulsos mediante el mdulo CCP usando el modo captura del CCP,
configurndolo para que detecte el flanco de subida y el de bajada del pulso a medir.
EJERCICIO 4: Verificar y corregir el programa. El programa genera por RC2 una seal cuadrada de 400 Hz con un tiempo til
del 50% cada vez que se presione un pulsador conectado a RB0. El cristal que se usar es de 4 MHz.
Programa con Errores
list p=16F877
PIC16F877
include <p16F877.inc>
org
0
INICIO
bsf
STATUS,RP0
bsf
STATUS,RP1
bcf
TRISC,2
bcf
TRISB,0
bcf
STATUS,RP0
BUCLE btfss PORTB,0
goto
BUCLE
PWM
bcf
STATUS,RP0
movlw .155
movwf PR2
bcf
STATUS,RP0
movlw .50
movwf CCPR1L
movlw b'00001111'
movwf CCP1CON
movlw b'00000011'
movwf T1CON
bsf
T2CON,TMR2ON
SUELTA
btfsc PORTB,0
goto
SUELTA
clrf
CCP1CON
bsf
PORTC,2
goto
BUCLE
END

Programa sin Errores


list p=16F877
PIC16F877
include <p16F877.inc>
org
0
INICIO
bsf
STATUS,RP0
bcf
STATUS,RP1
bcf
TRISC,2
bcf
TRISB,0
bcf
STATUS,RP0
BUCLE btfss PORTB,0
goto
BUCLE
PWM
bsf
STATUS,RP0
movlw .155
movwf PR2
bcf
STATUS,RP0
movlw .78
movwf CCPR1L
movlw b'00001111'
movwf CCP1CON
movlw b'00000011'
movwf T2CON
bsf
T2CON,TMR2ON
SUELTA
btfsc PORTB,0
goto
SUELTA
clrf
CCP1CON
bcf
PORTC,2
goto
BUCLE
END

Comentarios
;Procesador PIC16F877

;Paso al banco 1
;Defino pin RC2/CCP1 como salida
;Defino RB0 como entrada
;Vuelvo al banco 0
;banco 1
;Precarga de PR2 para la nota
;paso al banco 0
;Cargamos tambin Tiempo de trabajo
;Definimos CCP1
;en modo PWM
;Defino TMR2 prescaler 16
;y parado al principio
;Pongo en marcha TMR2

;Desactivamos el mdulo CCP1 en silencio


;y anulamos salida

EJERCICIO 5:
V F El bloque funcional TMR0 es un contador de 16 bits incrementado por hardware y programable. La cuenta
mxima es de 255.
V F Si para programar una onda PWM en el mdulo CCP de un microcontrolador PIC16F877, se carga el registro
PR2 con un valor n dentro de su margen permitido (0 a 255 ambos incluidos), cualquier valor que se cargue en
el conjunto de bits formado por CCPRxL:CCPxCON<5:4> superior a 4 veces n provocar que el ciclo de
trabajo de la onda de salida sea del 100%.
V F En el TMR0 se puede insertar un prescaler programable que puede dividir por 2, 4, 8, 16, 32, 64, 128 y 256 el
incremento del registro TMR0
V F Un microcontrolador PIC de la gama media que disponga de 2 mdulos CCP (CCP1 y CCP2) puede manejar de
manera simultnea dos salidas PWM con ciclos tiles distintos e independientes pero con la restriccin de que
la frecuencia de ambas salidas debe ser la misma.
V
El retardo del TMR0 se calcula segn:
Retardo= 4*Tosc*(256-carga de TMR0)*Preescaler
V F Si se emplea el mdulo CCP2 de un microcontrolador en modo captura para lanzar las conversiones del mdulo
analgico/digital, el clculo del tiempo entre inicios de conversin debe ser superior a la suma de los tiempos
de adquisicin y de conversin.
Si se usa un cristal de 20Mhz, en teora, el siguiente cdigo genera un retardo de:..
set_timer1 (2000);
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 );
V F Es posible realizar temporizaciones muy largas con un microcontrolador PIC16F877, y se consigue un efecto
multiplicativo importante si se configura el mdulo CCP2 en modo comparacin y su salida RC1/CCP2 se
conecta a la entrada de flancos del TMR1 (RC0/T1CKI) que se debe configurar para que trabaje en modo
contador.
V F El TMR1 y TMR2 son temporizadores o contadores que trabajan con 16 bits, que pueden ser ledos y escritos en
cualquier momento.
V F El mdulo CCP1 de los microcontroladores PIC trabajando en modo comparacin con evento especial de disparo

Hoja 4 de 2

V
V

F
F

puede utilizarse para realizar temporizaciones en combinacin con el mdulo TMR1 sin necesidad de efectuar
precargas de dicho contador/temporizador.
El mdulo TMR2 de los microcontroladores PIC no tiene posibilidad de contar flancos externos, slo puede
funcionar como temporizador.
El TMR1 puede operar como temporizador, contador sncrono y contador asncrono con prescalers de 1, 2, 4 y 8.
Un mdulo CCP en modo captura podra usarse para detectar la actuacin sobre un determinado pulsador
mediante interrupcin. Tambin podran usarse las entradas externas de los temporizadores
TMR0 y TMR1 trabajando como contadores.
Si se usa un cristal de 10Mhz, en teora, el siguiente cdigo genera un retardo de:..
set_timer0 (0x20);
setup_timer_0 (RTCC_DIV_2|RTCC_INTERNAL);
El PIC 16F877A posee 2 mdulos CCP (CCP1 y CCP2), los cuales se comportan de la misma forma sin
excepcin.
El modulo CCP utiliza el TMR1 para comparar con CCPRx y para generar la frecuencia de PWM.
Qu funcin realiza el modulo CCP con la siguiente configuracin:
setup_timer_1(T1_INTERNAL);
setup_ccp1(CCP_CAPTURE_RE);
El retardo del TMR2 se calcula segn:
Retardo= 4*Tosc*[Preescaler* (PR2+1)*Postcaler]
Que tipos de eventos pueden ser configurados cuando el mdulo CCP funciona como comparador.
Respuesta: Puesta a 1, puesta a 0 y sin cambio

El periodo de la seal generada por CCP en modo PWM est dado por:
Periodo=4*Tosc*PreescalerTMR2* (PR2+1)
Si se usa un cristal de 10Mhz qu funcin realiza el modulo CCP con la siguiente configuracin:
setup_timer_2(T2_DIV_BY_16,194,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(391);
Si se usa un cristal de 10Mhz, en teora, el siguiente cdigo genera un retardo de:..R=617 microsegundos
set_timer2 (0);
setup_timer_2 ( T2_DIV_BY_4, 0xc0, 2);
El modo PWM permite obtener en los pines CCPx una seal peridica en la que se puede modificar su ciclo de
trabajo.
El Ciclo de trabajo de la PWM generada por CCP est dado por:
Duty Cicle=Tosc*PreescalerTMR2* (CCPRxL:CCPxCON<5:4>)
El mdulo CCP2 de un microcontrolador PIC16F877 puede provocar que se lancen conversiones del mdulo
A/D interno a intervalos de tiempo constantes.
El TIMER2 es un modulo temporizador de 16 bits dividido en dos registros; TMR2 y PR2, que se pueden leer y
escribir, adems cuenta con un prescaler y un postcaler.
Cada mdulo CCP posee un registro de 16 bits que pueden utilizarse para; capturar, compara y modular anchos
de pulso.
El retardo del TMR1 se calcula segn:
Retardo= 4*Tosc*(65536-carga de TMR1)*Preescaler

Das könnte Ihnen auch gefallen