Bueno, os mando el trozo de codigo que no me funciona.Se trata de una serie de semaforos que estan conectados al pic de la siguiente forma.Como son muchos y no se disponen de suficientes patillas para todos los leds, lo primero que he hecho es dividir los 12 semaforos en dos grupos de 6(los que hay en cada sentido).Para utilizar menos patillas he utilizado demultiplexoser de forma que utilizo tres patillas para la seleccion de la salida y otras tres (una para color) para el encendido de los leds(utilizo tres patillas para cada grupo de semaforo pero las mismas señales de seleccion).
#include <18f4620.h>
#use delay(clock=8000000)
#fuses XT,INTRC_IO,NOPUT,NOBROWNOUT,NOWDT,NOLPT1OSC,NOCPB,NOCPD
#fuses NOWRT,NOPBADEN,NOMCLR,NOSTVREN,NODEBUG,NOPROTECT,NOLVP
#use fast_io(B)
#use fast_io(D)
#byte PORTB = 0xF81
#byte PORTD = 0xF83
#bit SEL1 = 0xF81.0
#bit SEL2 = 0xF81.1
#bit SEL3 = 0xF81.2
#bit V_DER = 0xF81.3
#bit A_DER = 0xF81.4
#bit R_DER = 0xF81.5
#bit V_IZQ = 0xF83.5
#bit A_IZQ = 0xF83.6
#bit R_IZQ = 0xF83.7
boolean S01v,S01a,S01r,S02v,S02a,S02r,S03v,S03a,S03r,S04v,S04a,S04r; //variables que modifico y que posteriormente
boolean S05v,S05a,S05r,S06v,S06a,S06r,S07v,S07a,S07r,S08v,S08a,S08r; // iran a las entradas de los demultiplexoser
boolean S09v,S09a,S09r,S10v,S10a,S10r,S11v,S11a,S11r,S12v,S12a,S12r;
int con;
#int_Timer0
void IntTM0 ()
{
switch (con) {
case 0: SEL1 = 0; SEL2 = 0; SEL3 = 0; //selecciona el semaforo 1
V_DER = S01v; A_DER = S01a; R_DER = S01r; //pone en los puertos los valores que deben tener los leds
V_IZQ = S02v; A_IZQ = S02a; R_IZQ = S02r;
break;
case 1: SEL1 = 0; SEL2 = 0; SEL3 = 1; //selecciona el semaforo 2
V_DER = S03v; A_DER = S03a; R_DER = S03r;
V_IZQ = S04v; A_IZQ = S04a; R_IZQ = S04r;
break;
case 2: SEL1 = 0; SEL2 = 1; SEL3 = 0; //selecciona el semaforo 3
V_DER = S05v; A_DER = S05a; R_DER = S05r;
V_IZQ = S06v; A_IZQ = S06a; R_IZQ = S06r;
break;
case 3: SEL1 = 0; SEL2 = 1; SEL3 = 1; //selecciona el semaforo 4
V_DER = S07v; A_DER = S07a; R_DER = S07r;
V_IZQ = S08v; A_IZQ = S08a; R_IZQ = S08r;
break;
case 4: SEL1 = 1; SEL2 = 0; SEL3 = 0; //selecciona el semaforo 5
V_DER = S09v; A_DER = S09a; R_DER = S09r;
V_IZQ = S10v; A_IZQ = S10a; R_IZQ = S10r;
break;
case 5: SEL1 = 1; SEL2 = 0; SEL3 = 1; //selecciona el semaforo 6
V_DER = S11v; A_DER = S11a; R_DER = S11r;
V_IZQ = S12v; A_IZQ = S12a; R_IZQ = S12r;
break;
};
if (con==5){
con = 0;
} else {
con++;
};
}
void main ()
{
set_tris_B(0b00000000); //puerto B como salida
set_tris_D(0b00000000); //puerto D como salida
enable_interrupts(INT_TIMER0);
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
set_timer0(216);
enable_interrupts(GLOBAL);
S01v = 1; S01a = 0; S01r = 0; //por ahora solo he inicializado los semaforos a un valor
S02v = 0; S02a = 0; S02r = 1;
S03v = 0; S03a = 0; S03r = 1;
S04v = 0; S04a = 0; S04r = 1;
S05v = 1; S05a = 0; S05r = 0;
S06v = 0; S06a = 0; S06r = 1;
S07v = 1; S07a = 0; S07r = 0;
S08v = 0; S08a = 0; S08r = 1;
S09v = 1; S09a = 0; S09r = 0;
S10v = 0; S10a = 0; S10r = 1;
S11v = 1; S11a = 0; S11r = 0;
S12v = 0; S12a = 0; S12r = 1;
con = 1;
for(;
{ };
}
Bueno, a ver que os parece mi programa.
Si teneis alguna duda sobre el funcionamiento no dudeis en preguntar.Gracias