Autor Tema: Corrimiento de matrices LED  (Leído 2235 veces)

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

Desconectado gioalex07

  • PIC10
  • *
  • Mensajes: 27
Corrimiento de matrices LED
« en: 03 de Noviembre de 2017, 19:20:36 »
Hola comunidad

Tengo este programa para realizar corrimiento en una matriz LED de 7x7. Cuando decido realizar la simulación en proteus, aparece la letra A seguido de 2 espacios apagados luego la letra B y dos espacios en blanco. En teoría cuando terminaran los espacios de la letra B de nuevo debería aparecer la letra A pero solo aparece basura que prende aleatoriamente.

Si alguno puede ayudarme para resolver dicho dilema le agradeceria


Adjunto codigo


#include <xc.h>
#define _XTAL_FREQ 4000000
int v[34]={0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b00000001,0b00000000,0b01101110,0b01101110,0b11101110,0b00000000,0b00000001,0b01111111,0b01111111,0b000000000,0b00000000,0b00110110,0b00110110,0b00110110,0b01001001,0b01001001,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111};

void main(void) {
   
    ADCON1=0xFF;
    ADCON2=0xFF;
    OSCCONbits.IRCF=110; // Define el cristal interno que se va a utilizar en este caso 4MHz
    OSCCONbits.SCS=11;  // Define el reloj que se va a utilizar en este caso el interno
    TRISA=0b00000000;
    TRISB=0b00000000;
    int i=0,j=0,k=0;
    while(1){
        for(j=0;j<34;j++){
            for(k=0;k<30;k++){
          for(i=0;i<7;i++){
        PORTB=v[i+j];;
                  PORTA=1<<i;
                  __delay_ms(2);
                  PORTA=0b0000000;
          }
       }
        }
    }
    return;
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Corrimiento de matrices LED
« Respuesta #1 en: 03 de Noviembre de 2017, 20:01:20 »
Código: C
  1. int v[34]= {    0b01111111,0b01111111,0b01111111,0b01111111,            //1
  2.                 0b01111111,0b01111111,0b01111111,0b01111111,            //2
  3.                 0b00000001,0b00000000,0b01101110,0b01101110,            //3
  4.                 0b11101110,0b00000000,0b00000001,0b01111111,            //4
  5.                 0b01111111,0b00000000,0b00000000,0b00110110,            //5
  6.                 0b00110110,0b00110110,0b01001001,0b01001001,            //6
  7.                 0b01111111,0b01111111,0b01111111,0b01111111,            //7
  8.                 0b01111111,0b01111111,0b01111111,0b01111111             //8
  9.            };

8 * 4 = 32, y tenes 34 elementos.

Código: C
  1. for(j=0;j<34;j++){
  2.             for(k=0;k<30;k++){
  3.           for(i=0;i<7;i++){
  4.         PORTB=v[i+j];;
  5.                   PORTA=1<<i;
  6.                   __delay_ms(2);
  7.                   PORTA=0b0000000;
  8.           }
  9.        }
  10.         }

Demasiados for, no se para que. pero al hacer i + j y usarlo de indice, siendo que j puede llegar a 33 e i puede llegar a 6, eso te deja con un indice de 39 lo cual es mayor aun que la cantidad de elementos que tenes en el array.

Si queres mostrar en una matriz 7x7, porque no directamente organizas tus datos asi:

Código: C
  1. int v[5][7]= {  
  2.                 {0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111},         //Letra A
  3.                 {0b01111111,0b00000001,0b00000000,0b01101110,0b01101110,0b11101110,0b00000000},         //Letra B
  4.                 {0b00000001,0b01111111,0b01111111,0b00000000,0b00000000,0b00110110,0b00110110},         //Letra C
  5.                 {0b00110110,0b01001001,0b01001001,0b01111111,0b01111111,0b01111111,0b01111111},         //Letra D
  6.                 {0b01111111,0b01111111,0b01111111,0b01111111,0b00000000,0b00000000,0b00000000}          //Letra E
  7.              };

De esa forma el primer indice es para indicar la letra. Y luego tenes el 2do indice que son para las columnas o filas, segun estes manejando, De alli luego revisas que nunca supere los 7 al mostrar las filas, y que nunca supere los 5 para las letras. Observa tambien que tuve que agregar 3 datos ( 0x00 ) al final para completar los 7 valores.

Desconectado gioalex07

  • PIC10
  • *
  • Mensajes: 27
Re:Corrimiento de matrices LED
« Respuesta #2 en: 03 de Noviembre de 2017, 20:18:12 »
Aca está el codigo arreglado pero no visualiza bien..


#include <xc.h>
#define _XTAL_FREQ 4000000

//aca seria [2][10] pero pues no funciona la visualización. Con [20] visualiza A, 2 espacios, B, dos espacios, B de nuevo y cuando termina aparece A de forma abrupta
int v[20]={0b00000001,0b00000000,0b01101110,0b01101110,0b01101110,0b11101110,0b00000000,0b00000001,0b11111111,0b11111111,
              0b00000000,0b01110110,0b01110110,0b01110110,0b01110110,0b01110110,0b10000001,0b11000011,0b11111111,0b11111111};
int vectorA[8] = {0b00000001,0b00000000,0b11101110,0b11101110,0b11101110,0b11101110,0b00000000,0b00000001};
int vectorB[8] = {0b00000000,0b01110110,0b01110110,0b01110110,0b01110110,0b01110110,0b10000001,0b11000011};

void letra(int vector[]);
//void corrimiento(int (*vector1)[10]);
void corrimiento(int vector1[]);
int i,j,k = 0;

void main(void){
   
   OSCCONbits.SCS = 11;
   OSCCONbits.IRCF = 110;

   ADCON1bits.PCFG0=1;
   ADCON1bits.PCFG1=1;
   ADCON1bits.PCFG2=1;
   ADCON1bits.PCFG3=1;
   
   TRISD = 0;
   TRISB = 0;
   TRISAbits.RA0 = 1;
   TRISAbits.RA1 = 1;
   
   SPPCONbits.SPPEN = 0;
   PORTEbits.RDPU = 1;
   
   
   
   while (1){
      while((PORTAbits.RA0 == 0) && (PORTAbits.RA1 == 0)){
    LATD = 0;
      }
      __delay_ms(20);
     
      while((PORTAbits.RA0 == 1) && (PORTAbits.RA1 == 0)){
    letra(vectorA);
      }
      __delay_ms(20);
     
      while((PORTAbits.RA0 == 0) && (PORTAbits.RA1 == 1)){
    letra(vectorB);
      }
      __delay_ms(20);
     
      while((PORTAbits.RA0 == 1) && (PORTAbits.RA1 == 1)){
    if((PORTAbits.RA0 == 0) && (PORTAbits.RA1 == 1)){
       letra(vectorB);
    }
    else if((PORTAbits.RA0 == 1) && (PORTAbits.RA1 == 0)){
       letra(vectorA);
    }
    else{
       corrimiento(v);
    }
      }
      __delay_ms(20);
     
   }
     
 }
 
 void letra(int vector[]){
    for(i = 0; i < 8; i++){
    PORTD = 1<<i;
    PORTB = vector;
    __delay_ms(2);
         PORTD = 0b0000000;
    }
 }
 
 /*
 void corrimiento(int (*vector1)[10]){
    for(j = 0; j<10; j++){
            for(k = 0; k<25; k++){
          for(i = 0; i<8; i++){
        PORTB = (*(*(vector1+i)+j));
                  PORTD = 1<<i;
                  __delay_ms(2);
                  PORTD = 0b0000000;
          }
       }
        }
 }
 */
 void corrimiento(int vector1[]){
    for(j = 0; j<20; j++){
            for(k = 0; k<25; k++){
          for(i = 0; i<8; i++){
        PORTB = vector1[i+j];
                  PORTD = 1<<i;
                  __delay_ms(2);
                  PORTD = 0b0000000;
          }
       }
        }
 }
« Última modificación: 04 de Noviembre de 2017, 00:09:56 por gioalex07 »

Desconectado gioalex07

  • PIC10
  • *
  • Mensajes: 27
Re:Corrimiento de matrices LED
« Respuesta #3 en: 04 de Noviembre de 2017, 12:44:26 »
Alguno puede ayudarme ..

Gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Corrimiento de matrices LED
« Respuesta #4 en: 04 de Noviembre de 2017, 12:52:51 »
Decime cuales pines tenes conectado a la matriz, y armate la letra A y B.
Por que si decis que es una matriz de 7x7, no se porque tenes 8 datos.

Ejemplo:

PORTB maneja todas las filas
PORTD maneja las columnas, la primer columna es RD0, la segunda es RD1 y asi consecutivamente.

----

Explica eso y lo arreglamos.

Desconectado gioalex07

  • PIC10
  • *
  • Mensajes: 27
Re:Corrimiento de matrices LED
« Respuesta #5 en: 04 de Noviembre de 2017, 14:07:04 »
Ya lo logré ! Era extender solo el arreglo para que repitiera la letra siguiente

Gracias y perdona la molestia