Ya puedo programar el pic, pero tengo que sacarlo del circuito, los +6.3V en VCC están haciendo que no vaya bien.
Lo que funcionaba creo que era porque casualmente, la interrupción del timer0 caía sobre el momento justo, y activaba el triac.
Con este código no funciona. Debería, ¿no?
/********************************************************/
/* Proyecto regulador de luces para belén */
/********************************************************/
#include <16F88.h>
#FUSES NOWDT, HS, NOPUT, BROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, FCMEN, NOIESO, NOMCLR
#use delay(clock=20000000)
#use fast_io(A)
#use fast_io(B)
#byte PORTB = 0x06
#bit TRIAC1 = PORTB.1
#bit TRIAC2 = PORTB.2
#bit TRIAC3 = PORTB.3
#bit TRIAC4 = PORTB.4
/******************************************************/
/* Declaración de variables */
/******************************************************/
int i = 0;
int disparo = 0;
// Contador de pasos según el timer0, se pone a 0 en cada cruce por 0
int Pasos = 0;
// El valor que le damos al timer para que la interrupción se produzca cada 50 microsegundos -> 1 paso cada 0.4us
int Periodo = 131;//131;
#int_EXT
void CrucePor0()
{
Pasos = 0;
delay_ms(1);
Triac1 = 0;
delay_us(500);
Triac1 = 1;
Triac2 = !Triac2;
if (i == 0)
{
i = 1;
ext_int_edge(H_TO_L); // La próxima interrupción será de bajada
}
else
{
i = 0;
ext_int_edge(L_TO_H); // La próxima interrupción será de subida
}
}
#int_TIMER0
void TIMER0_isr()
{
set_timer0(Periodo);
Pasos++;
disparo = 50;
if(Pasos == disparo)
Triac1 = 0;
if(Pasos == disparo+20)
Triac1 = 1;
}
void main()
{
set_tris_B(0b11000001);
set_tris_A(0xFF);
// setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(INT_EXT);
// enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
ext_int_edge(L_TO_H);
// set_timer0(Periodo);
Triac1 = 1;
Triac2 = 0;
// Triac3 = 1;
// Triac4 = 1;
for(;;)
{
}
}
El Triac2 tiene conectado un led con su resistencia. Lo he puesto para ver si pasa por la interrupción externa, pero nada, ni se inmuta el led ese.
Un saludo. Au.