Hola buenas, estoy usando el puerto C como selector de columnas para una matriz de led, y para mi asombro, el pin C6 nunca cambia de estado, con lo que la 7ª columna nunca se enciende, he probado a intercambiar el cable que va del pic al C6 por el del C7 y funciona perfectamente.
Basicamente, consigo que todos los pines del puerto C se pongan a 1, excepto C6. (He hecho una chapucilla cambiando temporalmente el pin_c6 por pin_b1, pero realmente necesito usar el pin_c6)
Miré para que se puede usar el C6 en el datasheet, y solo sirve de Digital I/O,EUSART asynchronous transmit y EUSART synchronous clock (RX/DT). He mirado a ver si es que tenia que desactivar algo, pero no encontré nada.
Adjunto codigo fuente:
#include <18f4525.h>
#fuses NOWDT
#use delay(clock=8000000)
#define value 0x0f //(0xf = 4bits de profundidad)
int dutyr=0x0,dutyg=0x0,dutyb=0x0,cont=0,c=0;
int b0a=0,a4a=0,color=0;
int despl=0;
#int_timer2
void tmr()
{
int b0, a4;
b0=input(pin_b0);
a4=input(pin_a4);
if(!cont)
switch(despl)
{
case 0 : output_c(0x00);
output_high(pin_c0);
despl++;
break;
case 1 : output_c(0x00);
output_high(pin_c1);
despl++;
break;
case 2 : output_c(0x00);
output_high(pin_c2);
despl++;
break;
case 3 : output_c(0x00);
output_high(pin_c3);
despl++;
break;
case 4 : output_c(0x00);
output_high(pin_c4);
despl++;
break;
case 5 : output_c(0x00);
output_high(pin_c5);
despl++;
break;
case 6 : output_c(0x00);
output_high(pin_c6);
despl++;
break;
case 7 : output_c(0x00);
output_high(pin_c7);
despl++;
break;
default : output_c(0x00);
despl++;
if(despl>0x0F)
despl=0;
break;
}
if(cont<=dutyr && dutyr!=0x00)
output_HIGH(pin_a0);
else
output_low(pin_a0);
if(cont<=dutyg && dutyg!=0x00)
output_high(pin_a1);
else
output_low(pin_a1);
if(cont<=dutyb && dutyb!=0x00)
output_high(pin_a2);
else
output_low(pin_a2);
if(cont>=value)
cont=0;
else
cont++;
c++;
if(c>=15)
c=0;
if(!b0&&!a4){}
else
{
if(!a4 && a4a)
{
color++;
if(color>2)
color=0;
}
if(!b0 && b0a)
switch (color)
{
case 0 : dutyr++;
if(dutyr>0x0f)
dutyr=0x00;
break;
case 1 : dutyg++;
if(dutyg>0x0f)
dutyg=0x00;
break;
case 2 : dutyb++;
if(dutyb>0x0f)
dutyb=0x00;
break;
}
}
b0a=b0;
a4a=a4;
}
void main(void)
{
setup_oscillator(OSC_8MHZ |OSC_NORMAL | OSC_PLL_ON);
set_tris_a(0x00010000);
set_tris_b(0b00000001);
set_tris_c(0x00);
setup_timer_2(T2_DIV_BY_1, 50,1);
enable_interrupts(GLOBAL);
enable_interrupts(INT_timer2);
while(1);
}