TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: mimison3012 en 10 de Marzo de 2013, 15:45:26
-
buenas estoy haciendo un programa en ccs compiler de una alarma que cuando unos sensores detecten algo se activen unas cargas. ya tengo cuatro sensores conectados en RB4,RB5,RB6,RB7 estos seran sensados por la interrupcion de estos bits, y activen las cargas ya mencionadas. pero tambien quiero colocar un boton para apagar las cargas en cuanto uno regrese a la habitacion donde este instalada la alarma, el problema es que la interrupcion RB_ISR no me deja hacer esto si bien sensa mis entradas y activa las cargas y sale de esa interrupcion y continua con el programa, la interrupcion RB0 no me funciona, hice una subrutina aparte para poder apagar las cargas sin usar el RB0 pero aun asi tengo problemas con el RB_ISR. No se que pueda hacer, les dejo mi programa para que lo revisen.
#include "F:\PCW_CCS_LENGUAJE C_PIC\ALARMA.h"
//////////////////////////////
//INTERRUPCION POR RB
/////////////////////////////
#int_RB
void RB_isr(void)
{
delay_ms(20);
output_B(input_B());
output_high(SIRENA);
output_high(CIRCULINA);
output_high(LUCES);
}
////////////////////////////////
//INTERRUPCION POR RB0
///////////////////////////////
//#int_EXT
void EXT_isr(void)
{
delay_ms(20);
output_low(SIRENA);
output_low(CIRCULINA);
output_low(LUCES);
}
//////////////////////////////
//PROGRAMA PRINCIPAL
/////////////////////////////
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RB);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
// TODO: USER CODE!!
while(TRUE){
output_toggle(LED); // USO ESTE LED PARA VERIFICAR SI EL PROGRAMA SALE DE LA SUBRUTINA O SE QUEDA ENGANCHADA
delay_ms(200);
/////////////////////////////////////////////////////////////////
//RUTINA PARA APAGAR CARGAS EN VEZ DE USAR RB0
/////////////////////////////////////////////////////////////////
//if(input(PIN_B0)==0)
//{
//delay_ms(20);
//output_low(SIRENA);
//output_low(CIRCULINA);
//output_low(LUCES);
//}
////////////////////////////////////////////
///////////////////////////////////////////
}
}
-
Cheka con este codigo muy seguro de que te funcionara.
saludos
#include <16f876A.h> //pic a utilizar
#FUSES NOWDT
#FUSES XT
#FUSES NOBROWNOUT
#FUSES NOLVP
#use delay(clock=4000000)
#define SIRENA PIN_A0
#define CIRCULINA PIN_A1
#define LUCES PIN_A2
#define STROBE PIN_A3
#define LED PIN_C0
/*#INT_RB
void RB_isr(void)
{
int aux; //Declaracion de la variable aux.
output_bit(SIRENA,input(PIN_B7)); //Hacemos que RA0 sea igual a RB7.
output_bit(CIRCULINA,input(PIN_B6));
output_bit(LUCES,input(PIN_B5));
output_bit(STROBE,input(PIN_B4));
aux=input_B();
}*/
#INT_RB
void RB_isr(void)
{
int aux;
delay_ms(20);
output_high(SIRENA);
output_high(CIRCULINA);
output_high(LUCES);
output_high(STROBE);
aux=input_B();
}
#int_EXT
void EXT_isr(void)
{
delay_ms(20);
output_low(SIRENA);
output_low(CIRCULINA);
output_low(LUCES);
output_low(STROBE);
}
void main()
{
enable_interrupts(INT_RB);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
set_tris_b(0xFF);
output_a(0x00);
while(TRUE){
output_toggle(LED);
delay_ms(200);
}
}
La interrupcion RB que esta comentada funciona para ver los estados del puerto RB en el puerto RA, pero de cualquier forma el codigo resuelve tu problema.
saludos colega.
-
Lee el puerto b al final de la interrupción rb para que limpie la interrupción
puedes usar input_b() para hacerlo
-
Si solo ese detalle le faltaba al colega ppyote :mrgreen:
-
me parece q no especificas q tipo de flanco queres q se produzca la interrupcion. puede ser con ext_INT_edge(l_to_h); o ext_INT_edge(h_to_l);