Buenas otra vez. Finalmente lo estoy pasando todo a c (q esta resultando mas facil de lo q pensaba). El problema me surge con las interrupciones que no sé en que fallo. Utilizo la interrupcion de cambio de estado por el portb y luego para el sensor de altura necesito el timer0 con 16 bits, ya que el pulso que me devuelve el sensor es la distancia del sensor al objeto Bueno hechas todas las cuentas limpio los flags y activo otra vez las interrupciones pero el código se queda petado y no hace nada. No sé en que fallo y sé que tiene algo q ver con el timer porque si quito esa línea todo funciona correcamente. Aqui os dejo el código a ver si me podeis echar una mano
#include <18F4550.h>
#use delay (clock=4000)
int sensor_altura();
void main(){
port_b_pullups(true);
set_tris_a(0x3f);
set_tris_b(0x30);
set_tris_c(0x00);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_2);
#asm
bsf 0xfd5,4
bsf 0xfd5,3
#endasm
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
#asm
movlw 0x00;
movwf 0xff1;
movlw 0x00;
movwf 0xff0;
#endasm
write_eeprom(0x03,0);
write_eeprom(0x04,0);
write_eeprom(0x06,250);
write_eeprom(0x07,0);
write_eeprom(0x13,0);
write_eeprom(0x14,0);
write_eeprom(0x16,100);
write_eeprom(0x17,0);
write_eeprom(0x25,220);
write_eeprom(0x30,0);
write_eeprom(0x31,0);
write_eeprom(0x32,0);
write_eeprom(0x33,0);
write_eeprom(0x26,150);
write_eeprom(0x27,200);
sleep();
}
#INT_RB
void interrupcion() {
int8 estado=0;
int1 altura=0;
int1 peso=0;
int1 aforo=0;
disable_interrupts(GLOBAL);
disable_interrupts(INT_RB);
if(input_state(PIN_B4)==1){
delay_ms(5000);
altura=sensor_altura();
output_c(0x04);
delay_ms(2000);
output_c(0x00);
clear_interrupt(INT_RB);
clear_interrupt(INT_TIMER0);
goto fin;
}
fin:
enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);
}
int sensor_altura(){
int8 valor=0;
int8 altura_minima;
int8 altura_maxima;
int8 altura_l=0;
int8 altura_h=0;
double altura=0;
int8 altura_sensor=0;
int8 altura_ac_l=0;
int8 altura_ac_h=0;
int8 contador=1;
double altura_acumulada;
while(contador>0){
output_b(0x01);
delay_us(15);
output_b(0x00);
valor=input_state(PIN_A1);
while(valor==0){valor=input_state(PIN_A1);}
set_rtcc(0);
valor=input_state(PIN_A1);
while(valor==1){valor=input_state(PIN_A1);}
#asm
movff 0xfd6,0x1D;
movff 0xfd7,0x1E;
#endasm
altura=(altura_h*256)+altura_l;
altura_sensor=altura/58;
altura=read_eeprom(0x25);
altura_l=altura-altura_sensor;
write_eeprom(0x20,altura_l);
altura_ac_l=read_eeprom(0x30);
altura_ac_h=read_eeprom(0x31);
altura_acumulada=altura_ac_h*256+altura_ac_l;
altura=read_eeprom(0x20);
altura_acumulada+=altura;
if(altura_acumulada<255){
altura_ac_l=altura_acumulada;
write_eeprom(0x30,altura_ac_l);
contador--;
}else{
altura_ac_h=altura_acumulada/256;
altura_ac_l=altura_acumulada - (256*altura_ac_h);
write_eeprom(0x30,altura_ac_l);
write_eeprom(0x31,altura_ac_h);
contador--;
}
}
altura_ac_l=read_eeprom(0x30);
altura_ac_h=read_eeprom(0x31);
altura_acumulada=(altura_ac_h*256)+altura_ac_l;
altura_acumulada/=1;
altura_minima=read_eeprom(0x26);
altura_maxima=read_eeprom(0x27);
if(altura_acumulada>altura_maxima){return 0;}
else if(altura_acumulada<altura_minima){return 0;}
else
return 1;
}