Buenas!!!!el ejemplo de hoy se trata de manejar el periferico interno ccp(modulos de captura: comparacion y modulacion de anchuras de pulsos), el cual puede actuar de las siguientes maneras: Como captura, como comparacion o como modulacion de anchura de pulsos(PWM). En este ejemplo lo vamos a configurar como comparacion. Es decir por la patita RB3/ccp1 conectaremos una señal de pulsos la cual generara una interrupcion cada flanco de subida(un 1 logico por dicho pin) pero si pulsamos el boton conectado a la patita RB0/int generara una interrupcion externa(ya programada e el ejemplo anterior...)la cual cambiara el modo de comparacion, pasando este a capturar y generar una interrupcion por el pin RB3/ccp1 cada flanco descendente es decir de bajada(un 0 logico por dicho pin)...bueno y la interrupcion lo que hace es simplemente aumentar indice de contador para mostrar numeros del 0 al 9 en bcd....lo importante es saber programar los perifericos! aqui el programa:
////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR"05
// 29/Septiembre/05
//
// Programa: Uso del CCP1 como comparador ascendente/descendente
// Version: 0.0
//
// Dispositivo: PIC 16F648A Compilador: CCS vs3.227
// Entorno IDE: MPLAB IDE v7.20 Simulador: Proteus 6.7sp3
//
// Notas: Contador 0 al 9 usando interrupcion ccp1 por el pin B3/ccp1. Si no pulsamos
// el boton, la cuenta del contador sera cada flanco ascendente que entre por
// la patita RB3/ccp1, en cambio si pulsamos el boton, la cuenta del contador sera
// cada flanco descendente que reciba el pin RB3/ccp1. Tener en cuenta que hay que
// poner la directiva NOLVP para que el pin B4 sea de salida. Aparte se a programado
// mediante la instruccion INTRC el oscilador interno de 4MHz asi tendremos las
// patitas RA7 Y RA6 libres.
//
// Conexiones: A0 -> A
// A1 -> B
// A2 -> C
// A3 -> D
// B0 -> Interrupcion externa
// B3 -> Interrupcion ccp1
// BCD:
// d c b a NUM
// 0 0 0 0 0
// 0 0 0 1 1
// 0 0 1 0 2
// 0 0 1 1 3
// 0 1 0 0 4
// 0 1 0 1 5
// 0 1 1 0 6
// 0 1 1 1 7
// 1 0 0 0 8
// 1 0 0 1 9
//////////////////////////////////////////////////////////////////////////////////
#include <16f648a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP //ordenes para el programador
#fuses INTRC //oscilador interno
#use delay (clock=4000000) //Fosc=4Mhz
#use standard_io(b)
#use fixed_io(a_outputs=PIN_A0,PIN_A1,PIN_A2,PIN_A3)
///VARIABLES GLOBALES
char i=0; //contador para tabla BCD
char tabBCD[10]={0b0000,0b0001,0b0010,0b0011,0b0100,0b0101,0b0110,0b0111,0b1000,0b1001};//BCD 0-9
boolean var=0; //variable para captura en alto(var=0) o en bajo(var=1)
///LLAMADA FUNCION INTERRUPCION
#INT_CCP1
void ccp1()
{
if(i>9) //¿se ha mostrado digito 9?
i=0; //SI -> restaura valor indice(para mostrar digito 0)
output_a(tabBCD[ i ]); //muestra por porta digito 7 segmentos
i++; //incremento contador indice tabBCD
}
#INT_EXT
void IntRB0()
{
var=!var; //complementa valor de modo
if(!var) //¿var!=0?
setup_ccp1(CCP_CAPTURE_RE); //SI -> ccp1 modo captura configurado flanco ascendente
else
setup_ccp1(CCP_CAPTURE_FE); //NO -> ccp1 modo captura configurado flanco descendente
}
///PROGRAMA
void main(void)
{
setup_ccp1(CCP_CAPTURE_RE); //ccp1 modo captura configurado flanco ascendent
enable_interrupts(int_ext); //activar interrupcion externa
ext_int_edge(H_TO_L); //configuracion:interrupcion cuando señal esta en baja
enable_interrupts(INT_CCP1); //activar interrupcion en ccp1
enable_interrupts(GLOBAL); //todas las interrupciones desactivadas
for( ; ; ){} //bucle infinito esperando interrupcion
}
Fijarse bien en la simulacion en PROTEUS en la patita RB3/ccp1 cuando hay un cuadrado rojo o azul, el rojo indica entrada en alta y el azul en baja asi pulsando el boton sabreis como esta configurado el ccp1 en comparacion en flanco ascendente o descendente.
