Por fin he podido crear la interrupción para el encendido en un sentido.
Ahora me estoy peleando para poder hacer el del otro sentido que me da muchos problemas, pués no se porqué se me cruzan y me producen resultados indeseados.
El codigo para generar un PWM mediante programación:
#define led1 pin_b1
#define led2 pin_b2
#define led3 pin_b3
#define led4 pin_b4
#define led5 pin_b5
#define led6 pin_b6
#define ON output_high
#define OFF output_low
#define IN input
#define sdalt pin_a2
#define sbaix pin_a1
long D, B;
long temps=200;
long pwm;
int T0=0, T1, T2, T3, T4, T5, T6;
long pujant=0;
long baixant=0;
#int_RTCC
RTCC_isr(){
pwm++;
temps--;
//Amb B memoritzem el pas pel sensor, sinó sortiria del prog ja que sbaix=0 només unes dècimes de seg
if(temps==0){
// if(baixant==1){
if(T0==0 && B!=0 && D==0){
T1++;
if(T1==100)
T0++;}
if(T0==1 && B!=0 && D==0){
T2++;
if(T2==100)
T0++;}
if(T0==2 && B!=0 && D==0){
T3++;
if(T3==100)
T0++;}
if(T0==3 && B!=0 && D==0){
T4++;
if(T4==100)
T0++;}
if(T0==4 && B!=0 && D==0){
T5++;
if(T5==100)
T0++;}
if(T0==5 && B!=0 && D==0){
T6++;
if(T6==100)
T0++;}
//Després de tots els increments passem a programar els apagats
if(T0==6 && B==0 && D!=0){
T1--;
if(T1==0)
T0--;}
if(T0==5 && B==0 && D!=0){
T2--;
if(T2==0)
T0--;}
if(T0==4 && B==0 && D!=0){
T3--;
if(T3==0)
T0--;}
if(T0==3 && B==0 && D!=0){
T4--;
if(T4==0)
T0--;}
if(T0==2 && B==0 && D!=0){
T5--;
if(T5==0)
T0--;}
if(T0==1 && B==0 && D!=0){
T6--;
if(T6==0)
T0=0;
}
temps=200;} //S'ha de fer també la programació de l'nterrupció pel cas invers fent com si es mirés en un mirall.
if(pwm<T1){ //copiar aquest bloc per cada led, aquesta part pot anar al programa
ON(led1);
}
else{
OFF(led1);
}
if(pwm<T2){
ON(led2);
}
else{
OFF(led2);
}
if(pwm<T3)
ON(led3);
else
OFF(led3);
if(pwm<T4)
ON(led4);
else
OFF(led4);
if(pwm<T5)
ON(led5);
else
OFF(led5);
if(pwm<T6)
ON(led6);
else
OFF(led6);
//després de tots els pwm
if (pwm==100) pwm=0; //aquí marquem una freq de 50Hz
}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL|RTCC_div_1|RTCC_8_bit);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_oscillator(False);
enable_interrupts(INT_RTCC);
enable_INTERRUPTS(GLOBAL);
// TODO: USER CODE!!
D=0;
B=0;
OFF(led1);
OFF(led2);
OFF(led3);
OFF(led4);
OFF(led5);
OFF(led6);
while(true){
if(IN(sbaix)==0 && D==0 && B==0){
B++;
}
if(IN(sdalt)==0 && D==0 && B!=0)
B--;
if(IN(sdalt)==0 && D==0 && B==0){
D++;
}
if(IN(sbaix)==0 && D!=0 && B==0)
D--;
}}
A ver si entre todos podemos finalizarlo.
Yo lo he realizado con un 18f2550, y solo lo he provado en la placa de desarrollo.
Espero le sirva a alguien.
Un saludo a todos.