Sie sind auf Seite 1von 8

NOMBRE

Control de Semforos
OBJETIVO
1. Reforzar el uso de interrupciones
2. Uso de los timers (TIMER0)
3. Clculo de resistencias y capacitores en un NE555
INTRODUCCIN AL PROGRAMA
En este programa tiene como objetivo aprender a usar interrupciones usando
tambin el timer del micro-controlador, como ejemplo usaremos los semforos que
estn ubicados entre el Instituto Tecnolgico de Quertaro y el ISSSTE, as como
el semforo que est entre Avenida Tecnolgico y Avenida Universidad, la cual
usaremos el botn de interrupcin para que el peatn pueda cruzar del Instituto
hacia el ISSSTE o viceversa. Como sabemos, la interrupcin no permite el uso de
delays por consiguiente debemos utilizar el timer.
Adems tambin utilizaremos otro tipo de cristal, al que estamos acostumbrados a
usar. Usaremos uno de 87KHz. Aqu podemos utilizar un generador de seales,
un cristal RC o usando un NE555 para poder generar la frecuencia requerida, ya
que los 87KHz no es un valor comercial de cristal.
MARCO TERICO
INTERRUPCIN EXTERNA POR RB0
La interrupcin por RB0 es una de las ms utilizadas, ella detecta cuando hay un
cambio en el bit 0 del puerto B, este cambio puede ser un flanco de bajada o un
flanco de subida, pero no ambos, esto se puede configurar mediante una funcin,
dicha seleccin se hace dependiendo del dispositivo conectado a la entrada.
Otro factor que se debe tener en cuenta cuando se configuran entradas en el
puerto B, es que este puerto cuenta con resistencias de PULL UP internas, las
cuales son muy tiles para dispositivos de entrada que no generan los dos niveles
lgicos.
Las funciones utilizadas para la configuracin de la interrupcin por RB0 son:
EXT_INT_EDGE(H_TO_L); determina un flanco de bajada para la interrupcin
EXT_INT_EDGE(L_TO_H); determina un flanco de subida para la interrupcin
PORT_B_PULLUPS(TRUE); Activa las resistencias de pull-up internas
ENABLE_INTERRUPTS (INT_EXT); Activa las interrupciones por RB0
ENABLE_INTERRUPTS (GLOBAL); Activa las interrupciones globales
USO DEL TIMER0
El Timer0 es un dispositivo puede funcionar conceptualmente de dos formas:
como contador de pulsos externos o como temporizador para calcular intervalos
de tiempo. En el caso que dicha seal provenga del reloj interno de instrucciones,
el Timer0 se utiliza para generar interrupciones peridicas a travs de una cuenta
programada. Ya que conocemos la frecuencia de funcionamiento y en base a un
valor cargado en el contador del timer podemos temporizar eventos.
En el caso que dicha seal sea de una fuente externa al microcontrolador, es
especialmente til para contar el nmero de pulsos que dicha seal genera en el
tiempo ya que cada pulso de dicha seal incrementa el TMR0.
Usando el timer como temporizador, podemos contar por ejemplo- periodos de 1
ms, acumulndolos en un registro auxiliar.
Como anteriormente se indic, la seal de reloj base de entrada al mdulo Timer0
se puede obtener de dos maneras: con un oscilador externo a travs de la patilla
RA4/T0CKI, o bien con el oscilador interno de instrucciones. Tambin podemos
indicar si el disparo se realizar por flanco ascendente o flanco descendente de la
seal.
La configuracin la podemos realizar con los siguientes bits de control:
T0SC (Timer0 Clock Select) en el registro OPTION_REG[5]: Indica el origen
del reloj del contador: oscilador interno o seal externa
T0SE (Timer0 Set Edge) en el registro OPTION_REG[4]: Cuando se
selecciona seal externa, indica el flanco activo que se usar.
PRESCALER
El prescaler es un circuito que permite modificar la frecuencia del reloj de entrada
del
Timer0, dividiendo esta y generando una nueva seal de menor frecuencia a la
salida que ser la seal de reloj de entrada al registro TMR0. El prescaler es una
facilidad para cuando la seal de entrada es demasiado rpida para nuestros
propsitos y necesitamos ralentizarla.
El prescaler tambin se puede utilizar con el registro WDT (Watch Dog Timer) del
PIC, pero en este caso recibe el nombre de postescaler ya que se usa a la salida
del WDT, no pudiendo estar asignado a la vez al Timer0 o al WDT.
OPTION_REG, y permite dividir la frecuencia de una seal por 1, 2, 4, 8, 16, 32,
64, 128 o 256. En caso de utilizar un divisor por 1, la seal de salida es la de
entrada sin ningn cambio.
SWITCH CASE
SWITCH es un caso particular de una decisin mltiple:
Switch (expresion) {
Case (constante) 1:
Sentencias;
Break;
Default:
Sentencias;
Break;
}
Evala la expresin y en orden a la constante adecuada realiza las sentencias
asociadas. Si ninguno de los CASE corresponde a la constante se ejecuta
DEFAULT este comando es opcional.
El comando break provoca la salida del SWITCH de los contrario se ejecuta el
siguiente case. No pueden existir dos case con las misma constante.
DIAGRAMA DE FLUJO

CDIGO DEL PROGRAMA
#INCLUDE <16f887.h>
#use delay(clock= 87000)
#fuses RC,NOWDT,NOPUT
#fuses NOMCLR,NOPROTECT,NOBROWNOUT,
#fuses NOLVP, NOWRT
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#byte B=0x06 //PuertoB
#byte sem1=0x08 //PuertoC
#byte sem=0x07 //PuertoD
#bit r_uni=0x07.0 //rojo_universidad
#bit a_uni=0x07.1 //amarillo_universidad
#bit v_uni=0x07.2 //verde_universidad
#bit a_tec=0x08.5 //amarillo_tecnolgico
#bit r_tec=0x08.4 //rojo_tecnolgico
#bit v_tec=0x08.6 //verde_tecnolgico
int i=0;
//Funcin Inicializar Micro
void inicio (void){
sem1=0;
sem=0;
B=0;
set_tris_d(0);
set_tris_c(0);
set_tris_b(1);
enable_interrupts(GLOBAL);
ext_int_edge(L_TO_H);
enable_interrupts(INT_EXT);
}
//Funcin Interrupcin Externa
#INT_EXT
void atender(void){
v_tec=0;
setup_timer_0(RTCC_INTERNAL);
setup_timer_0(RTCC_DIV_256);
set_rtcc(234);
enable_interrupts(INT_RTCC);
disable_interrupts(INT_EXT);
}
//Funcin Timer0
#int_TIMER0
void semaforo(void){
i++;
switch(i){
case 1:
v_tec=1;
set_timer0(234);
break;
case 2:
v_tec=0;
set_timer0(234);
break;
case 3:
v_tec=1;
set_timer0(234);
break;
case 4:
v_tec=0;
a_tec=1;
set_timer0(170);
break;
case 5:
a_tec=0;
r_tec=1;
set_timer0(85);
break;
case 6:
r_tec=0;
v_tec=1;
i=0;
enable_interrupts(INT_EXT);
ext_int_edge(L_TO_H);
enable_interrupts(GLOBAL);
disable_interrupts(INT_TIMER0);
break;
}
}


//Programa Principal
void main(void){
inicio();
v_tec=1;
while(TRUE){
v_uni=1;
delay_ms(3000);
v_uni=0;
delay_ms(250);
v_uni=1;
delay_ms(250);
v_uni=0;
delay_ms(250);
v_uni=1;
delay_ms(250);
v_uni=0;
delay_ms(250);
v_uni=1;
delay_ms(250);
v_uni=0;
a_uni=1;
delay_ms(1000);
a_uni=0;
r_uni=1;
delay_ms(2000);
r_uni=0;
}
}
DIAGRAMA DE CONEXIONES

RESULTADOS Y OBSERVACIONES
En esta prctica al no tener a la mano el generador de seales, se utiliz un
NE555, donde se utilizaron valores de R1 Y R2 de 820 y un capacitor de 10 nF,
logrando generar los 87KHz. En la simulacin se tuvo algunos contratiempos, ya
que al generar la interrupcin no generaba nada, donde se prefiri armar el circuito
donde aqu si funcion. Donde podemos concluir que en la simulacin puede salir
y en el armado no salga o viceversa. Adems de haber aprendido de generar el
oscilador RC y principalmente lograr los objetivos propuestos en este reporte.
BIBLIOGRAFA
http://profesor-rangel.blogspot.mx/p/interrupcion-externa-por-rb0.html
http://galeon.com/leo-tronics/TutorialTimer0.pdf
http://picmania.garcia-cuervo.net/electronica_basica_555.php