Hola a todos..
Tengo un inconveniente, no me ingresa en la interrupciòn del CCP1.
El objetivo es que cada vez que se presiona un pulsador (activo por nivel
bajo) se incremente el valor de la variable que luego harà mostrar el dato
correspondiente dentro de la estructura switch.
Agradezco sugerencias del motivo porque no se incrementa dicha variable.
Les dejo el codigo a continuacion es bastante simple, no se porque no entra
dicha interrupcion. EN PROTEUS FUNCIONA A LA PERFECCION.
Saludos a todos
#include <18F452.h>
#use standard_io (A)
#use standard_io (B)
#use standard_io (C)
#use standard_io (D)
#use delay(clock=20000000) // EL USE DELAY DEBE IR ANTES DEL INCLUDE LCD420.C YA QUE EL MISMO USA DELAYS.
#use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
#include <LCD420.C>
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD, HS PARA 20 MHz
#FUSES NOPROTECT //Código sin Protección para Lectura
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOWRT //Program memory not write protected
#FUSES NOCPD //No EE protection
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPUT //No Power Up Timer
#define SDO PIN_C5
#define SCK PIN_C3
#define SDI PIN_C4
///////////////////////////////////////////////////////////////////////////////
//////////////////////// VARIABLES GLOBALES ///////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
unsigned int8 vector_1 [17], vector_3 [14], vector_5 [9]; //int8 es lo mismo que int, va de 0 a 255, el signed int va desde -128 a +127
signed int8 vector_2 [4], vector_4 [72], vector_6 [21];
unsigned int16 vector_3_16[7]={0};
signed int16 vector_4_16[36]={0};
unsigned int32 vector_5_32[3]={0};
signed int32 vector_6_32[7]={0};
int1 parametros_modificados=0;
int pantalla=0; // Utilizado para cambiar de pantalla a mostrar en el LCD
int variables_a_recibir [cantidad_datos_recibir];
int variables_a_enviar [cantidad_datos_enviar]={2, 2, 5, 5, 10, 10, 30, 0}; // Lo inicializo con los valores por defecto, en el otro programa hay que multiplicar para hacer la equivalencia a segundos!!!!
int estado_rs232=0; //Me indica el estado de la comunicacion, Finalizada=0, En curso=1
int cantidad_recibida=0;
int1 parametros_no_enviados=0;
int contador=0; // Variable utilizada para la interrupcion por desbordamiento del timer1, el mismo desborda cada 3 segundos, por lo que debe desbordar dos veces para contar 6 seg.
int1 pedir_datos=0; // Cuando esta variable sea 1 hay que pedir datos a la otra placa (cada 6 segundos)
int1 programando_parametros=0; // Cuando esta variable sea 1, significa que se estan programando los parámetros
//*****************************************************************************************//
// FUNCIÓNES DE INTERRUPCIÓN DEL MÓDULO CCP1 (PULSADOR CAMBIO MENU) //
//*****************************************************************************************//
#INT_CCP1 // Los registros CCP son de 16Bits.
void CCP1_int()
{
if (pantalla < cantidad_pantallas){
pantalla++;}
else {
pantalla=0;
lcd_putc("\f");
}
}
//*****************************************************************************************//
// FUNCIÓN PARA MOSTRAR LOS DATOS SEGÚN LA PANTALLA EN EL LCD //
//*****************************************************************************************//
// Según el dato solicitado "pantalla", se muestra la pantalla correspondiente
void mostrar_dato()
{
switch(pantalla){
case 0: // PROGRAMACION DE PARAMETROS
lcd_gotoxy(1,1);
printf(lcd_putc, " Pantalla 01 ");
lcd_gotoxy(1,2);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,3);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,4);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
delay_ms(300);
break;
case 1: // INFORMACION GENERAL 1
lcd_gotoxy(1,1);
printf(lcd_putc, " Pantalla 02 ");
lcd_gotoxy(1,2);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,3);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,4);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
delay_ms(300);
break;
case 2: // DATOS ELECTRICOS 1
lcd_gotoxy(1,1);
printf(lcd_putc, " Pantalla 03 ");
lcd_gotoxy(1,2);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,3);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,4);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
delay_ms(300);
break;
case 3: // DATOS ELECTRICOS 2
lcd_gotoxy(1,1);
printf(lcd_putc, " Pantalla 04 ");
lcd_gotoxy(1,2);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,3);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,4);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
delay_ms(300);
break;
case 4: // DATOS ELECTRICOS 3
lcd_gotoxy(1,1);
printf(lcd_putc, " Pantalla 05 ");
lcd_gotoxy(1,2);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,3);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,4);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
delay_ms(300);
break;
case 5: // DATOS ELECTRICOS 4
lcd_gotoxy(1,1);
printf(lcd_putc, " Pantalla 06 ");
lcd_gotoxy(1,2);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,3);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,4);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
delay_ms(300);
break;
case 6: // DATOS ELECTRICOS 5
lcd_gotoxy(1,1);
printf(lcd_putc, " Pantalla 07 ");
lcd_gotoxy(1,2);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,3);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,4);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
delay_ms(300);
break;
case 7: // DATOS MECANICOS 1
lcd_gotoxy(1,1);
printf(lcd_putc, " Pantalla 08 ");
lcd_gotoxy(1,2);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,3);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,4);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
delay_ms(300);
break;
case 8: // DATOS MECANICOS 2
lcd_gotoxy(1,1);
printf(lcd_putc, " Pantalla 09 ");
lcd_gotoxy(1,2);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,3);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,4);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
delay_ms(300);
break;
case 9: // DATOS MECANICOS 3
lcd_gotoxy(1,1);
printf(lcd_putc, " Pantalla 10 ");
lcd_gotoxy(1,2);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,3);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,4);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
delay_ms(300);
break;
case 10: // DATOS MECANICOS 4
lcd_gotoxy(1,1);
printf(lcd_putc, " Pantalla 11 ");
lcd_gotoxy(1,2);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,3);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,4);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
delay_ms(300);
break;
case 11: // PARADA DE EMERGENCIA !!
lcd_gotoxy(1,1);
printf(lcd_putc, " Pantalla 12 ");
lcd_gotoxy(1,2);
printf(lcd_putc, "PARADA DE EMERGENCIA");
lcd_gotoxy(1,3);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
lcd_gotoxy(1,4);
printf(lcd_putc, " xxxxxxxxxxxxxxxxxx ");
delay_ms(300);
break;
}
}
//*****************************************************************************************//
// FUNCIÓN CONTADORA DE 1 SEGUNDO //
// (Interrupcion por desbordamiento del TIMER1) //
// Esta función se llamará automaticamente cada ve que el timer1 se desborde //
//*****************************************************************************************//
#int_TIMER0
void contadora_segundos (){ //Cada vez que pasen 3 segundos el timer0 desborda y entra en esta funcion
contador++;
if (contador == 2){ // Si la variable contador es igual a 2, significa que pasaron 6 segundos (ya que entro 2 veces en la interrupcion)
contador= 0;
pedir_datos= 1;
} // Dentro de este if levanto la bandera enviar datos para que envie datos por rs-232
set_timer1 (6942); // Cargandole este valor, hace que se se llame a la interrupcion cada 3 segundos, ya que el timer desborda a los 3 segundos.
} // Cierro la funcion contadora_segundos
///////////////////////////////////////////////////////////////////////////////
//////////////////////// PROGRAMA PRINCIPAL ///////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void main(void)
{
lcd_init(); // INICIO EL LCD
delay_ms(500); // ESPERO UN TIEMPO
lcd_putc('\f'); // LIMPIO PANTALLA
presentacion(); // Presentación en LCD.
// HABILITACION DE INTERRUPCIONES
//----------> Configuro el timer1 que contara los segundos <-----------------------//
setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_256 ); //TMR1 Interno y preescaler de 1:8
set_timer0 (6942); // Cargo el timer con dicho valor para que al cabo de 500 ms desborde el timer1 y llame a la interrupcion (cada medio segundo)
enable_interrupts(int_timer0); //Activa interrupción del timer1
//---------------------------------------------------------------------------------//
enable_interrupts (int_RDA); // Habilito la interrupción que se llamará cada vez que llegue un nuevo dato por RS-232
//setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); // Configuración TMR1.
setup_ccp1(CCP_CAPTURE_FE); // Modo Captura. RE: Flanco Bajada (ya que activa por nivel bajo).
enable_interrupts(INT_CCP1); // Habilito la interrupcion del modulo CCP1 (pulsador cambio pantalla).
enable_interrupts (global); // Habilito todas las interrupciones
output_low(SCK); // Pongo a cero el pin SCK (usado para comunicacion SPI)
while (1)
{
mostrar_dato (); // Llamo a la funcion que mostrara los datos en pantalla segun la opcion (dentro del CCP1)
}
}