Autor Tema: ayuda matriz de leds 5x5 i2c pcf8574, rs232 recibiendo string  (Leído 2187 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado joseluna2003

  • PIC10
  • *
  • Mensajes: 2
ayuda matriz de leds 5x5 i2c pcf8574, rs232 recibiendo string
« en: 19 de Julio de 2013, 03:13:31 »
amigos mi inquietud es la siguiente, hace poco que empece autodidactamente en el mundo de los microcontroladores pic, he leido un sin fin de guias, libros, ejemplos, etc; entonces ya he montado varios proyectos pero tengo uno en mente que no acabo de terminarlo.

NOTA://////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
aclaro que no he estudiado programacion ni electronica ni nada parecido asi que debe de haber cientos de errores en mi codigo, y quizas maneras mas faciles de realizar las tareas que describo.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

primero hablemos del circuito en cuestion el circuito se trata de una matriz de 5x5 leds multiplexados, conectados a un expansor de puertos i2c pcf8574, para controlar todas las 5 tierras activando un unl2003, las tres salidas sobrantes del puerto del pcf activan transistores a modo de switching para las 3 primeras lineas es decir 3 cargas positivas, las otras 2 lineas son controladas directamente con 2 salidas del micro activando transistores,

los transistores se activan con un 0 logico y el unl2003 con un 1 logico

el circuito lo diseñe para usarlo con el pic que obtuve cuando me empece a apasionar por los microcontroladores y su programacion, el pic en cuestion era el 12f629 el cual usaba los pines de la siguiente manera



12f629
A0=sda i2c al pcf8574
A1=scl i2c al pcf8574
A2=transistor para manejo del trasistor(activado con 0 logico) encargado de enviar la carga positiva a la linea 4
A3=rx rs232
A4=A2=transistor para manejo del trasistor(activado con 0 logico) encargado de enviar la carga positiva a la linea 4
A5=tx rs232

logre que el programa mostrara las letras contenidas en una variable o array de caracteres con scroll hacia la izquierda de una manera que supongo no es la mas eficiente,

luego obtuve un pic 16f887 y adapte el mismo circuito para utilizarlo con este pic y su oscilador interno a 8mhz

el problema esta en lo siguiente, he intentado de todas las maneras posibles enviar una cadena de caracteres incluyendo espacios por rs232 y asignarla a una variable que es la que se utiliza para escribir en la matriz.

creanme que he leido el manual del ccs, ejemplos, librerias, foros, he googleado muchisimo pero no he logrado realizar lo propuesto por mi mismo, agradeceria de verdad que puediesen darme una ayuda para poder seguir aprendiendo.

ojo no pido que me hagan el codigo, no tengo apuro tampoco, seguire intentando mientras espero sugerencias. voy a dedicarme ha hacer un diagrama del circuito para compartirlo con quien lo desee
Código: C
  1. #include <16F887.h>
  2. #device adc=8
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
  6. #FUSES NOPUT                    //No Power Up Timer
  7. #FUSES NOMCLR                   //Master Clear pin used for I/O
  8. #FUSES NOPROTECT                //Code not protected from reading
  9. #FUSES NOCPD                    //No EE protection
  10. #FUSES NOBROWNOUT               //No brownout reset
  11. #FUSES IESO                     //Internal External Switch Over mode enabled
  12. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  13. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  14. #FUSES NODEBUG                  //No Debug mode for ICD
  15. #FUSES NOWRT                    //Program memory not write protected
  16. #FUSES BORV40                   //Brownout reset at 4.0V
  17. #FUSES RESERVED                 //Used to set the reserved FUSE bits
  18.  
  19. #use delay(clock=8000000)
  20. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,)
  21. #use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3,force_hw)

Código: C
  1. //escrito para ccs 4 por Jose luna//
  2. //joseluna2003@cantv.net//
  3.  
  4. #include "C:\Users\monica\Documents\projectos con pic en ccs\16f887\led-mat-rs232-16f887.h"
  5. #include <string.h>
  6. #define PORT_BASE_ADDRESS 0x40 //direccion del expansor i2c pcf8574
  7.  
  8.  
  9. int1 flag2=0;   // bandera indicadora de ultimo caracter en la cadena mensaje
  10. int1 flag=0;   // reconocer si el caracter a mostrar es de 5x4 o de 5x5, escir si termina en una columna blanca o no
  11. int8 t1=2;     //tiempo del delay o duracion de la secuencia
  12. int8 p=20;     //veces que se ejecuta cada escena o frame de la animacion de scroll antes de pasar a la siguiente escena o frame
  13. int8 cont3=0;   //contador de veces que se ha mostrado un frame o escena
  14. int8 cont2=0;      // contador que se incrementa hasta encontrar la posicion en la tabla de un caracter solicitado
  15. int1 e=0;          //solo una variable para conocer el estado de un diodo activado por la interrupcion externa para comprobar que funciona
  16. char mensaje[50]="on";           // variable tipo array o cadena de caracteres contiene lo que debe mostrarse en la matriz
  17. int8 const lenbuff=32;           // longitud del buffer, esta parte es tomada de un ejemplo de redpic que fue el ultimo que intente hacer funcionar
  18. int1 flag3=0;                    // el flag 3 inidica que se introdujo un dato por el rs232
  19.  
  20.  
  21. int  xbuff=0x00;                       // Índice: siguiente char en cbuff
  22. char cbuff[lenbuff];                   // Buffer
  23. char rcvchar=0x00;                     // último caracter recibido
  24.  
  25. ////////////////////////
  26. ///letras de 5x4 y 5x5//
  27. ////////////////////////
  28. //cada letra contiene en orden las lineas que deben activarse para cada una de las 5 columnas
  29. const char letras[27][6]={                                          
  30.                   {'a',0x1f,0x05,0x05,0x1f,0x00},
  31.                   {'b',0x1f,0x15,0x15,0x0a,0x00},
  32.                   {'c',0x0e,0x1b,0x11,0x11,0x00},
  33.                   {'d',0x1f,0x11,0x1b,0x0e,0x00},
  34.                   {'e',0x1f,0x1f,0x15,0x15,0x00},
  35.                   {'f',0x1f,0x1f,0x05,0x05,0x00},
  36.                   {'g',0x1f,0x11,0x15,0x1d,0x00},
  37.                   {'h',0x1f,0x1f,0x04,0x1f,0x00},
  38.                   {'i',0x11,0x1f,0x1f,0x11,0x00},
  39.                   {'j',0x19,0x11,0x1f,0x11,0x00},
  40.                   {'k',0x1f,0x04,0x0a,0x11,0x00},
  41.                   {'l',0x1f,0x1f,0x10,0x10,0x00},
  42.                   {'m',0x1f,0x02,0x06,0x02,0x1f},
  43.                   {'n',0x1f,0x06,0x0c,0x1f,0x00},
  44.                   {'o',0x1f,0x11,0x11,0x1f,0x00},
  45.                   {'p',0x1f,0x1f,0x05,0x07,0x00},
  46.                   {'q',0x0f,0x09,0x1d,0x09,0x0f},
  47.                   {'r',0x1f,0x05,0x0d,0x1f,0x17},
  48.                   {'s',0x17,0x15,0x15,0x1d,0x00},
  49.                   {'t',0x01,0x1f,0x1f,0x01,0x00},
  50.                   {'u',0x1f,0x10,0x10,0x1f,0x00},
  51.                   {'v',0x03,0x06,0x18,0x06,0x03},
  52.                   {'w',0x1f,0x08,0x06,0x08,0x1f},
  53.                   {'x',0x11,0x1b,0x04,0x11,0x1b},
  54.                   {'y',0x01,0x12,0x0c,0x03,0x00},
  55.                   {'z',0x19,0x1d,0x17,0x13,0x00},
  56.                   {' ',0x00,0x00,0x00,0x00,0x00}
  57.                   };
  58.                  
  59.  
  60. int8 lineas=0;        //variable que indica con los 5 primeros bits las lineas que deben activarse(1 para linea activa)          
  61. unsigned int8 pcf=0;  //variable que controla el puerto del expansor, es decir se envia por i2c(L1,L2,L3,C1,C2,C3,C4,C5)
  62. int1 bita2=0;         // variable que maneja la lina 4(L4)
  63. int1 bita4=0;        //variable que maneja la linea 5(L5)
  64.  
  65.  
  66. //funcion para escribir en el puerto completo del expansor
  67. void write_to_port(unsigned char data_byte)
  68. {
  69.     i2c_start();
  70.     i2c_write(PORT_BASE_ADDRESS);
  71.     i2c_write(data_byte);
  72.     i2c_stop();
  73. }
  74. //funcion para escribir en la matriz de leds de 5x5 donde (se debe introducir el byte del puerto y los bits de los pines a2 y a4)
  75. void write_to_mat5x5(int8 pcf,int1 bita2, int1 bita4){
  76.    write_to_port(pcf);
  77.   output_bit (pin_A0, bita2);
  78.   output_bit (pin_A1, bita4);
  79. }
  80.  
  81.  
  82.  
  83. //funcion que muestra con scroll una cadena de caracteres introducida
  84. void escribir_en_matriz(char mensaje[]){
  85.  
  86. int8 col[5];  //array que contiene todos los bytes que representan las lineas activas para cada columna
  87. col[0]=0; //col[0] debe contener el byte que maneja todas las lineas activas para determinado caracter en la columna 0
  88. col[1]=0; //col[1] debe contener el byte que maneja todas las lineas activas para determinado caracter en la columna 1
  89. col[2]=0;
  90. col[3]=0;
  91. col[4]=0;
  92.  
  93. int8 tam_cad=strlen(mensaje); // determina el tamaño de la cadena
  94.  
  95. int8 cont=0;                  //inicializa el contador 0 que indicara en que caracter de la cadena mensaje estamos posicionados
  96.  
  97. for(cont=0;cont<tam_cad;cont++){  //este bucle ejecuta el codigo de la funcion tantas veces como el tamaño de la cadena
  98.  
  99. a1:                               // inicio de la funcion
  100. if(cont==(tam_cad-1)){flag2=1;}   //determina si esta en el ultimo caracter de la cadena
  101.  
  102. int1 coin=0;                      //esta variable determina la coincidencia encontrada entre el caracter en evaluacion de la cadena mensaje y la posicion en la tabla
  103. while (coin==0)                   //ejecuta esta parte del codigo hasta que encuentra la posicion del caracter en la tabla
  104. if (mensaje[cont]==letras[cont2][0]){ //si encuentra la coincidencia hace esto
  105. coin=1;
  106. int8 i=0;
  107. int8 pos=0;                  //variable que guarda la posicion que ocupa el caracter dentro de la tabla
  108. pos=cont2;
  109.  
  110.  
  111. int8 r=0;                    // es aqui donde se genera el scroll
  112. for(r=0;r<5;r++){
  113. col[0]=col[1];
  114. col[1]=col[2];
  115. col[2]=col[3];
  116. col[3]=col[4];
  117. col[4]=letras[pos][r+1];
  118.  
  119.  
  120.  
  121.  
  122.  
  123. while(cont3<p){
  124. for(i=0;i<5;i++){
  125. lineas=col[i];
  126. if(lineas==0&&pos!=26&&i==4){flag=1;goto salida_espacio_vacio;}
  127.  
  128. //se encarga de crear las variables que se necesitan para introducirlas en la funcion write to matrix por cada columna
  129. if (bit_test(lineas,0)){bit_clear(pcf,7);}else{bit_set(pcf,7);}
  130. if (bit_test(lineas,1)){bit_clear(pcf,6);}else{bit_set(pcf,6);}
  131. if (bit_test(lineas,2)){bit_clear(pcf,5);}else{bit_set(pcf,5);}
  132. if (bit_test(lineas,3)){bita2=0;}else{bita2=1;}
  133. if (bit_test(lineas,4)){bita4=0;}else{bita4=1;}
  134. bit_clear(pcf,0);
  135. bit_clear(pcf,1);
  136. bit_clear(pcf,2);
  137. bit_clear(pcf,3);
  138. bit_clear(pcf,4);
  139. bit_set(pcf,i);
  140.  
  141.  
  142.  
  143. write_to_mat5x5(pcf,bita2,bita4);
  144. delay_ms(t1);
  145.  
  146. if(pos==26&&i==2){;goto blanco;} //evalua si se trata de un espacio vacio y se dirije a la seccion del programa que denomine blanco
  147. }
  148. cont3++;
  149. }
  150.  
  151. salida_espacio_vacio:
  152.  
  153. cont3=0;
  154.  
  155. if(flag==1){flag=0;cont++;cont2=0;cont3=0;if(flag2==0){goto a1;}else{flag2=0;}}
  156. }
  157.  
  158. if(letras[pos][6]!=0x00){
  159. blanco:
  160. col[0]=col[1];
  161. col[1]=col[2];
  162. col[2]=col[3];
  163. col[3]=col[4];
  164. col[4]=0;
  165. int j=0;
  166. for(j=0;j<40;j++){
  167. for(i=0;i<5;i++){
  168. lineas=col[i];
  169. if (bit_test(lineas,0)){bit_clear(pcf,7);}else{bit_set(pcf,7);}
  170. if (bit_test(lineas,1)){bit_clear(pcf,6);}else{bit_set(pcf,6);}
  171. if (bit_test(lineas,2)){bit_clear(pcf,5);}else{bit_set(pcf,5);}
  172. if (bit_test(lineas,3)){bita2=0;}else{bita2=1;}
  173. if (bit_test(lineas,4)){bita4=0;}else{bita4=1;}
  174. bit_clear(pcf,0);
  175. bit_clear(pcf,1);
  176. bit_clear(pcf,2);
  177. bit_clear(pcf,3);
  178. bit_clear(pcf,4);
  179. bit_set(pcf,i);
  180. write_to_mat5x5(pcf,bita2,bita4);
  181. delay_ms(t1);}}
  182. }
  183.  
  184. cont2=0;
  185.  
  186. }else{
  187.  
  188. cont2++;
  189.  
  190.  
  191. }
  192.  
  193. }
  194.  
  195. }
  196.  
  197.  
  198. void addcbuff(char c){    
  199.   cbuff[xbuff++]=c;
  200. }
  201.  
  202.  
  203.  
  204.  
  205. #int_RDA
  206. void serial_isr() {
  207.  printf("int rs232 iniciado \r\n");
  208. printf("introduzca la frase a mostrar \r\n");
  209.  rcvchar=0x00;                       // Inicializo caracter recibido                    
  210.    if(kbhit()){                        // Si hay algo pendiente de recibir ...
  211.       rcvchar=getc();                  // lo descargo y ...
  212.       addcbuff(rcvchar);
  213.  
  214.    }
  215.    strcpy(mensaje,cbuff);
  216.     printf("int rs232 finalizado \r\n");
  217.      printf("mensaje= ,%s",mensaje);
  218. }
  219.  
  220.  
  221. #int_EXT
  222. void  EXT_isr(void)
  223. {
  224.  
  225.  printf("int ext iniciado \r\n");
  226. if (e==0){output_bit(pin_A2,1);e=1;}else{
  227. output_bit(pin_A2,0);e=0;}
  228.  printf("int ext finalizado\r\n");
  229.  
  230.  flag3=1;
  231.  
  232.  
  233. }
  234.  
  235.  
  236.  
  237.  
  238. void inicbuff(void){                   // Inicia a  cbuff -------------------
  239.    int i;
  240.  
  241.    for(i=0;i<lenbuff;i++){             // Bucle que pone a 0 todos los
  242.       cbuff[ i ]=0x00;                   // caracteres en el buffer
  243.    }
  244.    xbuff=0x00;                         // Inicializo el indice de siguiente
  245.                                        // caracter
  246. }
  247.  
  248.  
  249.  
  250.  
  251. void main()
  252. {
  253.  
  254.  
  255.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  256.    setup_adc(ADC_CLOCK_DIV_2);
  257.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  258.    setup_timer_1(T1_DISABLED);
  259.    setup_timer_2(T2_DISABLED,0,1);
  260.    setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
  261. enable_interrupts(INT_RDA);
  262.    disable_interrupts(INT_EXT);
  263.    enable_interrupts(GLOBAL);
  264.    setup_oscillator(OSC_8MHZ);
  265.    ext_int_edge(H_TO_L);
  266.      printf("buffer iniciado \r\n");
  267.    inicbuff();
  268.     write_to_mat5x5(0b00011111,0,0);
  269.   delay_ms(1000*t1);  
  270.   printf("programa iniciado \r\n");
  271.  
  272.  
  273.   flag=0;
  274.  
  275. //buble infinito
  276.  
  277. while(true){
  278.  
  279. enable_interrupts(INT_EXT);
  280. enable_interrupts(INT_RDA);
  281.  
  282.   printf("bucle iniciado \r\n");
  283.    printf("mensaje= ,%s",mensaje);
  284.  printf("\r\n");
  285.  
  286. escribir_en_matriz(mensaje);
  287.  
  288. }
  289. }


El programa muestra los caracteres perfectamente con el scroll , enciende y apaga el led controlado por la interrupcion externa lo que necesito es que reciba una cadena de caracteres por rs232 y la guarde en la variable mensaje y ya he probado de todo, necesito ayuda estoy varado en el medio del desierto.

doy gracias por adelantado al que se tome el tiempo de leer mi inquietud y mi codigo y al que me ofrezca sugerencias.

Desconectado camhost1

  • PIC12
  • **
  • Mensajes: 51
Re: ayuda matriz de leds 5x5 i2c pcf8574, rs232 recibiendo string
« Respuesta #1 en: 23 de Julio de 2013, 18:42:25 »
lo que necesito es que reciba una cadena de caracteres por rs232 y la guarde en la variable mensaje y ya he probado de todo, necesito ayuda estoy varado en el medio del desierto.

Hola joselna2003, lo que intentas hacer se puede hacer de la siguiente forma: utiliza la cabecera INPUT.c, en donde podrás guardar un string dentro de un vector, echale una ojeada (se encuentra en la carpeta drivers del ccs) y cuentas si entendiste como se utiliza, espero te sirva saludos.

Desconectado joseluna2003

  • PIC10
  • *
  • Mensajes: 2
Re: ayuda matriz de leds 5x5 i2c pcf8574, rs232 recibiendo string
« Respuesta #2 en: 23 de Julio de 2013, 23:17:30 »
amigo camhost1 gracias por tu respuesta, desde ahora mismo voy a revisar el driver o la libreria que me referenciaste para ver de que se trata, luego publicare mis avances


 

anything