Holas jeje aquí estoy de nuevo... tengo problemas con el puerto C resulta que ahí pondré una alarma pero el caso es que ni siquiera es capaz de activar un simple LED. Utilizaré las salidas C0-C3. Pero la instrucción que yo creía que activaría la salida C0 no lo hace correctamente, alquien sabe porque? Gracias.
Aquí está el código:
#include <16f876.h>
#device ADC=10
#use delay (clock=4000000)
#include <lcd3.c>
#byte porta=0x05
#byte portb=0x06
#byte portc=0x07
#byte tris_a=0x85
#byte tris_b=0x86
#byte tris_c=0x87
void main() {
int16 value;
int16 temp;
int16 a,b,x,z,i;
int8 laX,laY;
int8 menosX,menosY;
int8 canal;
lcd_init();
tris_a=0xFF;
tris_b=0x00;
tris_c=0x00;
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
canal=0;
lcd_gotoxy(1,1);
lcd_putc("T1= ");
lcd_gotoxy(10,1);
lcd_putc("T2= ");
lcd_gotoxy(1,2);
lcd_putc("T3= ");
lcd_gotoxy(10,2);
lcd_putc("T4= ");
while(TRUE) {
set_adc_channel(canal);
value=read_adc();
temp=((17*value)/85)-55;
//Test bits
//Si el bit de más peso es "1" entonces es negativo, de lo contrario es positivo
i=bit_test(temp,15); //Esta instrucción ya hace el complemento a 2
//La temperatura es de menor de 0
if(i==1||i==0){ //comprobar el bit de más peso para empezar en una posicion X o en otra
//tanto si es 1 como si es 0 hacer el bucle
switch(canal) //comprobar el canal
{
case 0: //es el canal 0
switch(i) //comprobar si es 1 o 0 para poner el signo negativo
{
case 0: //el bit de mas peso es "0" (positivo)
menosX=4;
menosY=1;
laX=4; //Empezar en la posicion 4 para no mostrar el signo "-"
laY=1;
break;
case 1: //el bit de mas peso es "1" (negativo)
//Deshacer el complemento a 2
temp=temp-1;
temp=~temp;
menosX=4;
menosY=1;
laX=5; //Empezar en la posicion 5 para mostrar el signo "-"
laY=1;
break;
}
break;
case 1: //es el canal 1
switch(i) //comprobar si es 1 o 0 para poner el signo negativo
{
case 0: //el bit de mas peso es "0" (positivo)
menosX=13;
menosY=1;
laX=13; //Empezar en la posicion 13 para no mostrar el signo "-"
laY=1;
break;
case 1: //el bit de mas peso es "1" (negativo)
//Deshacer el complemento a 2
temp=temp-1;
temp=~temp;
menosX=13;
menosY=1;
laX=14; //Empezar en la posicion 14 para mostrar el signo "-"
laY=1;
break;
}
break;
case 2: //es el canal 2
switch(i) //comprobar si es 1 o 0 para poner el signo negativo
{
case 0: //el bit de mas peso es "0" (positivo)
menosX=4;
menosY=2;
laX=4; //Empezar en la posicion 4 para no mostrar el signo "-"
laY=2;
break;
case 1: //el bit de mas peso es "1" (negativo)
//Deshacer el complemento a 2
temp=temp-1;
temp=~temp;
menosX=4;
menosY=2;
laX=5; //Empezar en la posicion 5 para mostrar el signo "-"
laY=2;
break;
}
break;
case 3: //es el canal 3
switch(i) //comprobar si es 1 o 0 para poner el signo negativo
{
case 0: //el bit de mas peso es "0" (positivo)
menosX=13;
menosY=2;
laX=13; //Empezar en la posicion 13 para no mostrar el signo "-"
laY=2;
break;
case 1: //el bit de mas peso es "1" (negativo)
//Deshacer el complemento a 2
temp=temp-1;
temp=~temp;
menosX=13;
menosY=2;
laX=14; //Empezar en la posicion 14 para mostrar el signo "-"
laY=2;
break;
}
break;
}
//Cálculos
a=temp/10;
z=temp%10;
b=a/10;
x=a%10;
switch(canal){
case 0:
lcd_gotoxy(1,1);
lcd_putc("T1= ");
break;
case 1:
lcd_gotoxy(10,1);
lcd_putc("T2= ");
break;
case 2:
lcd_gotoxy(1,2);
lcd_putc("T3= ");
break;
case 3:
lcd_gotoxy(10,2);
lcd_putc("T4= ");
break;
}
if(b==0 && x>0){
lcd_gotoxy(menosX,menosY);
lcd_putc("-");
lcd_putc(0); //volvemos a escribir
lcd_gotoxy(laX,laY);
lcd_putc(48+x); //volvemos a escribir
lcd_gotoxy(laX+1,laY);
delay_ms(2); //esperamos...
lcd_putc(48+z); //volvemos a escribir
lcd_gotoxy(laX+2,laY);
delay_ms(2); //esperamos...
lcd_putc(223); //volvemos a escribir
lcd_gotoxy(laX+3,laY);
delay_ms(1000);
lcd_enviar(LCD_COMANDO, LCD_HOME); //cursor al principio
}
else if(b==0 && x==0){
lcd_gotoxy(menosX,menosY);
lcd_putc("-");
lcd_putc(0); //volvemos a escribir
lcd_gotoxy(laX,laY);
delay_ms(2);
lcd_putc(48+z); //volvemos a escribir
lcd_gotoxy(laX+1,laY);
delay_ms(2); //esperamos...
lcd_putc(223); //volvemos a escribir
lcd_gotoxy(laX+2,laY);
delay_ms(1000);
lcd_enviar(LCD_COMANDO, LCD_HOME); //cursor al principio
}
else{
lcd_gotoxy(menosX,menosY);
lcd_putc("-");
lcd_putc(0); //volvemos a escribir
lcd_gotoxy(laX,laY);
delay_ms(2); //esperamos...
lcd_putc(48+b); //escribimos en el LCD
lcd_gotoxy(laX+1,laY); //posicionamos
delay_ms(2); //esperamos...
lcd_putc(48+x); //volvemos a escribir
lcd_gotoxy(laX+2,laY);
delay_ms(2); //esperamos...
lcd_putc(48+z); //volvemos a escribir
lcd_gotoxy(laX+3,laY);
delay_ms(2); //esperamos...
lcd_putc(223); //volvemos a escribir
lcd_gotoxy(laX+4,laY);
delay_ms(1000); //volvemos a esperar
lcd_enviar(LCD_COMANDO, LCD_HOME); //cursor al principio
}
}//Fin del else
switch(canal)
{
case 0:
canal=1;
break;
case 1:
canal=2;
break;
case 2:
canal=3;
break;
case 3:
canal=0;
break;
}
output_bit(PIN_C0,1); //Esto no funciona, debería activarse el bit 0 del puerto C
} //Fin del while
} //Fin del main
SOLUCIONADO: El fallo lo tenía en LCD3.C. Estaba haciendo referencia al puerto C como entrada cuando lo que se pretendía era usarlo como salida. Cambié todas las referencias al puerto C dentro del LCD3.C a set_tris_c(0x00); //Establecer como salida todos los bits del puerto C