Autor Tema: Multiplaxar display y comunicacion serie.  (Leído 2309 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ALE1973

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 230
Multiplaxar display y comunicacion serie.
« en: 29 de Agosto de 2013, 08:52:27 »
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.

Código: [Seleccionar]
#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.

Desconectado ALE1973

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 230
Re: Multiplaxar display y comunicacion serie.
« Respuesta #1 en: 29 de Agosto de 2013, 23:50:45 »
Buenas, hoy continue con las pruebas, sin exito, como me quedaban dudas sobre la version del compilador hice la prueba de compilar y probar con la version 5.11 del CCS, y nada
la misma falla o comportamiento, transmito algo serialmente, y todos los pines del puerto C van a nivel 0Vcc, probe el micro en un protoboard, ya que pense que podria ser
la plaqueta donde esta montado, y lo mismo, esto tiene pinta de no ser un error, si no mal configurado, pero no encuentro nada.

Saludos.
Alejandro.

Desconectado ALE1973

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 230
Re: Multiplaxar display y comunicacion serie.
« Respuesta #2 en: 01 de Septiembre de 2013, 18:43:48 »
Buenas, después de unas pruebas, logre que funcione, pero para mi no es lógico lo que esta haciendo...
Si suprimo la directiva "use_fastio(C)", funciona, o por lo menos los pines del puerto C quedan en alto,
es como si cuando se ejecuta la instrucción printf... todo el puerto C pasa a ser de entrada, ya que no responde
a ningún output_high().
En otro proyecto use siempre la opción de yo poner la función de cada pin (entrada o salida), incluso usando
comunicación, y en esta ocasión, no funciona, así que estimo después de todo esto es que se trata de otro bug
del CCS, voy a ver si encuentro una versión mas vieja del compilador y hago la prueba, a alguien le paso lo mismo?


Saludos.
Alejandro.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Multiplaxar display y comunicacion serie.
« Respuesta #3 en: 01 de Septiembre de 2013, 20:16:32 »
Que tal ALE1973
Te comento que el RS232 el pin Tx siempre queda en alto y si lo utilizas para manejar el display te podria dar problemas  :shock:
Abria que ver el esquematico que empleas para ver si es eso.

Saludos

Desconectado ALE1973

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 230
Re: Multiplaxar display y comunicacion serie.
« Respuesta #4 en: 01 de Septiembre de 2013, 23:11:09 »
Gracias Ralf, si... el TX siempre esta en alto, RC0 hasta RC4 son los que activan los display, configurados como salidas, cuando activo la transmision
no interesa como quieras escribirlos, siempre quedan en alto... eso es lo que para mi esta andando mal.
como dije en el mensaje anterior, si saco la opcion de fast_io los pines de los display puedo ponerlos en alto o bajo,
si activo esa opcion, deja de funcionar, eso es lo que no me cierra, voy a seguir probando.

Saludos


 

anything