Buen dia para todos, estoy en lidiando con un proyecto y ya no tengo mas vueltas para darle con un problema que no tiene sentido para mi...
Resulta que tengo un pic, manejando 10 display de 7 segmentos, multiplexados, y con un 4511 para ahorrar pines, hasta ahi todo bien, funciona
muy bien, no hay problemas, ahora bien, cuando agrego una comunicacion serie, simple, con los pines de la usart del pic, la comunicacion funciona
de primera, recibo en la PC bien los datos, pero... pero... los display que que manejo con los pines del puerto C, dejan de funcionar, quedan siempre
en nivel bajo, les paso el codigo a ver si es un BUG mio o de CCS, prube a compilarlo con el 3.124 y el 4.130 y hace los mismo.
#include <16f886.h> // Definiciones del PIC 16F873
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NOMCLR,NODEBUG,PUT
#use delay(clock=8000000) // Oscilador a 4 Mhz
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, enable=PIN_C5, ERRORS)// RS232 Est疣dar
#priority RTCC,RDA,TBE
#pragma use fast_io(A)
#pragma use fast_io(B)
#pragma use fast_io(C)
#pragma use fast_io(E)
#define pDig0 pin_B4
#define pDig1 pin_B5
#define pDig2 pin_B6
#define pDig3 pin_B7
#define pDig4 pin_A0
#define pDig5 pin_C0
#define pDig6 pin_C1
#define pDig7 pin_C2
#define pDig8 pin_C3
#define pDig9 pin_C4
// VARIABLES EN RAM ///////////////////////////////////////////////////////////
int rTarea=1; //Maquina de estados
int16 rT1s=1023;
//VARIABLES DE MUX DISPLAY
int rDispON=0; //nro de display encendido, de 0 a 9 , de derecha a izq
int rDigito=0; //valor a mostra en el display actualmente encendido
//VARIABLES DE FRECUENCIAS
int rCentCom=1;
int rDecCom=2;
int rUniCom=4;
int rDec1Com=3;
int rDec2Com=0;
int rCentNav=1;
int rDecNav=2;
int rUniNav=7;
int rDec1Nav=5;
int rDec2Nav=9;
// Variables comunicacion
int1 fEscOK=0; //el mensaje recibido es para este esclavo
int1 fCmdExe=0; //ejecutar comando
char nEsclavo=0x31; //Direccion de la placa
int rTinactiv=2; //Tiempo para asegurar inactividad en la red
int rCHKSUM=0; //registro de checksum
int rxCount=0; //contador de bytes recibidos
int txCount=0;
int txPoint=0;
int txBuff[12];
#int_RTCC
void RTCC_isr() { // Interrupci Timer 0
output_b (rDigito);
output_low(pDig0);
output_low(pDig1);
output_low(pDig2);
output_low(pDig3);
output_low(pDig4);
output_low(pDig5);
output_low(pDig6);
output_low(pDig7);
output_low(pDig8);
output_low(pDig9);
switch (rDispON){
case 0: output_high(pDig0);
rDigito=rCentCom;
break;
case 1: output_high(pDig1);
rDigito=rDecCom;
break;
case 2: output_high(pDig2);
rDigito=rUniCom;
break;
case 3: output_high(pDig3);
rDigito=rDec1Com;
break;
case 4: output_high(pDig4);
rDigito=rDec2Com;
break;
case 5: output_high(pDig5);
rDigito=rCentNav;
break;
case 6: output_high(pDig6);
rDigito=rDecNav;
break;
case 7: output_high(pDig7);
rDigito=rUniNav;
break;
case 8: output_high(pDig8);
rDigito=rDec1Nav;
break;
case 9: output_high(pDig9);
rDigito=rDec2Nav;
break;
}
if (++rDispOn > 9) rDispOn=0;
if (--rT1s==0){
fCmdExe=1;
rT1s=750;
}
}
//,,,,,,,,,,,,Programa Principal /////////////////////////////////////////////////////////
void main() {
delay_ms(500);
setup_oscillator(OSC_8MHZ);
//++++++++++++++++++Configura puertos analogicos++++++++++++++++++++++++++++++
setup_adc( ADC_OFF );
setup_adc_ports( NO_ANALOGS );
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16);
setup_comparator(NC_NC_NC_NC); //no comparadores
//Seteos puertos
set_tris_a (0b11111110);
output_a(0);
output_b(0);
set_tris_b (0b00000000);
output_c(0);
set_tris_c (0b10000000);
set_tris_e (0b00001000);
//enable_interrupts(int_rda); // Habilita Interrupci RDA
//enable_interrupts(int_RTCC); // Habilita Interrupci TIMER0
output_b(0);
rDigito=0;
//enable_interrupts(global); // Habilita interrupciones
output_low(pDig4);
/////////BUCLE PRINCIPAL//////////
do {
output_b (5);
output_high(pDig8);
//printf("Hola...");
delay_ms(1000);
} while (TRUE);
}
El nro BCD a mostrar sale por el puerto B (nible bajo), y pDig8 es el pin C3, que satura el transistor que esta en el
catodo comun del display, no hay interrupciones habilitadas, nada, solo se ejecuta el bucle del main
si yo saco los comentarios del printf, el display deja de funcionar, comento esa linea y el display anda.
Aguardo alguna soga, como para salir del pantano...
Saludos.
Alejandro.