#include <16f877.h>
#fuses hs,nowdt,put,nowrt,nolvp,noprotect
#use delay(clock=20000000)
#use fast_io(b)
#include <lcd.c>
int8 dato=0x00;
#int_ext
ext_isr()
{
delay_us(498);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,0);}
else{
bit_clear(dato,0);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,1);}
else{
bit_clear(dato,1);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,2);}
else{
bit_clear(dato,2);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,3);}
else{
bit_clear(dato,3);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,4);}
else{
bit_clear(dato,4);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,5);}
else{
bit_clear(dato,5);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,6);}
else{
bit_clear(dato,6);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,7);}
else{
bit_clear(dato,7);}
clear_interrupt(int_ext);
}
void main()
{
set_tris_b(0x03);
port_b_pullups(true);
output_low(PIN_B7);
output_low(PIN_B6);
lcd_init();
enable_interrupts(global);
enable_interrupts(int_ext);
ext_int_edge(l_to_h);
while(1)
{
printf(lcd_putc,"\ndato= %u",dato);
delay_ms(50);
}
}
Hola lucaspascual, de que velocidad es el clock externo? Te lo pregunto porque leyendo el código rápidamente veo que tienes muchos delays dentro de la interrupción, no sea que tengas un problema de tiempos. También veo que tienes una instrucción clear_interrupt(int_ext); al final de la interrupción. El CCS normalmente se encarga de setear o borrar los flags necesarios, de modo que creo que esa instrucción sobra en este caso. También veo que tienes una serie de instrucciones If - Else preguntando siempre por el estado del pin_b1 sin ninguna otra condición; lo que ocurre aquí es que estas instrucciones se ejecutan a mucha velocidad y solo vas a ver el resultado de la última. Por la misma razón, (cambia inmediatamente de estado alto a bajo) también vas a ver siempre el pin_b7 en estado bajo. Si tu velocidad de reloj externo lo permite, lo mejor sería solo activar una variable bandera (int1) dentro de la interrupción y según el estado de esta, ejecutar el código que creas conveniente en el main().Hola bmb muchas gracias por tomarte el trabajo de ver mi programa.
Saludos!
Algo asi seria con banderas,
[code#include <16f877.h>
#fuses hs,nowdt,put,nowrt,nolvp,noprotect
#use delay(clock=20000000)
#use fast_io(b)
#include <lcd.c>
int8 dato=0x00;
int1 bandera=0x00;
#int_ext
ext_isr()
{
bit_set(bandera,0);
}
void main()
{
set_tris_b(0x03);
output_low(PIN_B7);
output_low(PIN_B6);
port_b_pullups(TRUE);
lcd_init();
enable_interrupts(int_ext);
ext_int_edge(l_to_h);
enable_interrupts(global);
while(bandera==1)
{
delay_us(498);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,0);}
else{
bit_clear(dato,0);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,1);}
else{
bit_clear(dato,1);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,2);}
else{
bit_clear(dato,2);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,3);}
else{
bit_clear(dato,3);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,4);}
else{
bit_clear(dato,4);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,5);}
else{
bit_clear(dato,5);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,6);}
else{
bit_clear(dato,6);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,7);}
else{
bit_clear(dato,7);}
bit_clear(bandera,0);
printf(lcd_putc,"\ndato= %u",dato);
delay_ms(50);
}
}
]