Hi, i´m still on that programm that I talked days ago. I managed to make progress in the code

Now i´m having problems with 2 functions, in one of them im repeating a function, so i have sent 40 bits to 20 displays. In the "multiplexado" (multiplexed) function, i need to use a variable from the repeating function. but i dont understand why this error message apears. I´m trying to use pointers, but i havent seen them in school yet. so i dont undestand ajsaj

so here its the main code

#include <Arduino.h>
#include "proto.h"

uint8_t valor_byte, filasx5[5];

int main(){

in_out(); 
conf_timer0();
numbers();
antirrebotes();
mandar_byte(valor_byte);
mandar_filas(filasx5);
clk_signal();
//multiplexado(valor_display);
sei(); 

while(1){

_delay_ms(2);

}
}


ISR(TIMER0_COMPA_vect){
mandar_byte(valor_byte);
mandar_filas(filasx5);
clk_signal();

static uint16_t frec=0, miles=0;
static int16_t valor_display=0; 
//variable para la frecuencia    variable del display

static uint8_t displaystat=0, unidad=0, decena=0, centena=0; 
//variable 

if(frec>50) //con este if controlamos la frecuencia de multiplexado
{ 
   frec=0;
multiplexado(valor_display);

}
}

and here its the library where i put my functions

#include "proto.h"

int caso = 0, dir = 0, on_off = 0;                                                      // caso del vector, dirección en la que va, variable para el encendido y apagado
uint8_t prevbot1, prevbot2, prevbot3, prevbot4, prevbot5, prevbot6, statbot1, statbot2, statbot3, 
statbot4, statbot5, statbot6; // estados de los botones y estados previos
uint16_t vel = 300;           
                                                          // variable para ajustar la velocidad al presionar los pulsadores 2, 3 y 4
uint16_t miles=0, numero=0; 
uint8_t unidad=0, decena=0, centena=0, filasx5;


uint8_t get_bot_stat(uint8_t botnum)
{
    if(botnum==1){ 
        return statbot1; 
    }
    if(botnum==2){ 
        return statbot2; 
    }
    if(botnum==3){ 
        return statbot3; 
    }
    if(botnum==4){ 
        return statbot4; 
    }
    if(botnum==5){ 
        return statbot5; 
    }
    if(botnum==6){ 
        return statbot6; 
    }
}

//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------

 void antirrebotes(void) // configuración de botones, antirrebotes, detección de flanco
{
    static uint8_t ctbot1 = 0, ctbot2 = 0, ctbot3 = 0, ctbot4 = 0, ctbot5=0, ctbot6=0;
    
    if (bot1 == 0)
    { // si el bot está pulsado
        if (ctbot1 < 100)
        {
            ctbot1++;
        } // si el cont vale menos que 100, aumentamos su valor
    }
    else
    {
        ctbot1 = 0; // si no está pulsado, el cont vale 0
    }
    if (ctbot1 > 10)
    {                 // si desde que toqué el botón pasaron 10ms
        statbot1 = 1; // el estado del boton es 1
    }
    else
    {
        statbot1 = 0; // sino el estado del boton es 0
    }
    //-----------------------------------------------------------------------------------------------

if(bot2==0){ //si el bot está pulsado
if(ctbot2<100){ctbot2++; } //si el cont vale menos que 255, aumentamos su valor
}
else{
  ctbot2=0; //si no está pulsado, el cont vale 0

}
if(ctbot2>10){  //si desde que toqué el botón pasaron 10ms
  statbot2=1; //el estado del boton es 1
}else{
  statbot2=0; //sino el estado del boton es 0 
 }

//----------------------------------

if(bot3==0){ //si el bot está pulsado
if(ctbot3<100){ctbot3++; } //si el cont vale menos que 255, aumentamos su valor
}
else{
  ctbot3=0; //si no está pulsado, el cont vale 0

}
if(ctbot3>10){  //si desde que toqué el botón pasaron 10ms
  statbot3=1; //el estado del boton es 1
}else{
  statbot3=0; //sino el estado del boton es 0 
}

//--------------------

if(bot4==0){ //si el bot está pulsado
if(ctbot4<100){ctbot4++; } //si el cont vale menos que 255, aumentamos su valor
}
else{
  ctbot4=0; //si no está pulsado, el cont vale 0
}
if(ctbot4>10){  //si desde que toqué el botón pasaron 10ms
  statbot4=1; //el estado del boton es 1
}else{
  statbot4=0; //sino el estado del boton es 0 
}

//----------------------------------------------------------------------------------------

if(bot5==0){ //si el bot está pulsado
if(ctbot5<100){ctbot5++; } //si el cont vale menos que 255, aumentamos su valor
}
else{
  ctbot5=0; //si no está pulsado, el cont vale 0

}
if(ctbot5>10){  //si desde que toqué el botón pasaron 10ms
  statbot5=1; //el estado del boton es 1
}else{
  statbot5=0; //sino el estado del boton es 0 
}

//--------------------

if(bot6==0){ //si el bot está pulsado
if(ctbot6<100){ctbot6++; } //si el cont vale menos que 255, aumentamos su valor
}
else{
  ctbot6=0; //si no está pulsado, el cont vale 0
}
if(ctbot6>10){  //si desde que toqué el botón pasaron 10ms
  statbot6=1; //el estado del boton es 1
}else{
  statbot6=0; //sino el estado del boton es 0
}
}
//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------

void conf_timer0(void) // función para configurar el timer0
{
    TCCR0A |= (1 << WGM01);              // modo CTC
    TCCR0B |= (1 << CS01) | (1 << CS00); // prescaler 64
    OCR0A = 249;                         // valor de comparación para 1ms
    TIMSK0 |= (1 << OCIE0A);             // habilitar interrupción para el contador A
    sei();                               // habilitar interrupciones globales
}

//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------

void in_out(void){ //in and out de la integradora AED 5to
DDRC &= ~((1 << PC0) | (1 << PC1) | (1 << PC2) | (1 << PC3) | (1 << PC4) | (1 << PC5)); //entrada, pulsadores
DDRB |= ((1 << PB0) | (1 << PB1) | (1 << PB3) | (1 << PB4) | (1<<PB5)); //salida, leds y displays
DDRD |= ((1 << PD2) | (1 << PD3) | (1 << PD4) | (1 << PD5) | (1 << PD6)); //salida, displays
PORTD|= ((1<<PC0) | (1<<PC1) | (1 << PC2) | (1 << PC3) | (1 << PC4) | (1 << PC5)); //pull up interna 
}

//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------

void numbers(void){    

if(get_bot_stat(1)==1 && prevbot1==0){

/*if(numero>9){
    numero=0;
}*/
numero++;
}

if(get_bot_stat(2)==1 && prevbot2==0){
   /* if(numero>)*/
numero+= 10;
}

if(get_bot_stat(3)==1 && prevbot3==0){
numero+= 100;
}

if(get_bot_stat(4)==1 && prevbot4==0){
numero+= 1000;
}

//descomponemos el número en unidad, decena, centena y miles  
unidad= numero % 10;
decena= (numero / 10) % 10;
centena = ( numero / 100) % 10;
miles = ( numero / 1000) % 10;

}

//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------

void multiplexado(uint16_t valor_display){ //valor display se usa para multiplexar las columnas //this function is used to multiplex columns where the 20 displays are

numbers();
extern uint8_t ct_byte;

switch(valor_display){
  case 0:
  //apagamos los transistores
PORTD &=~((1<<PD3) | (1<<PD4) | (1<<PD5) | (1<<PD6));

//enviamos datos al primer display
mandar_filas(filasx5[ct_byte]);

}

}

//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------

void mandar_byte(uint8_t dato_byte){ //mandamos 1 BYTE (8bits)
for(uint8_t ctbits=0; ctbits<8; ctbits++){ //with "mandar_byte", im sending one by one  a byte to an arduino port, using a clock signal

if((dato_byte & 1) !=0){
   PORTD |= (1<<PD2);
   }
   else{
PORTD &=~ (1<<PD2);
   }
}
dato_byte>>1;

clk_signal();
}

//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------

void mandar_filas(void){ /*uso "*", eso es un puntero, lo que hace es decir que quiero leer lo que
esa variable contiene, su valor */
   for(uint8_t ct_byte=0; ct_byte<5; ct_byte++){
    mandar_byte(filasx5[ct_byte]); /* filasx5 hace que al mandar 5 veces (5 filas) los 40 bits, se muestren los numeros
    que queremos en los displays deseados */
   } 
} // with "mandar_filas", i´m repeating the previous function 5 times, so i have the 40 bits that i mentioned before.

//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------

void clk_signal(void){ //this is the clock signal function

PORTB |= (1<<PB0);
PORTB &=~ (1<<PB0); 

}

lib\proto\proto.cpp: In function 'void multiplexado(uint16_t)':
lib\proto\proto.cpp:208:29: error: invalid types 'uint8_t {aka unsigned char}[uint8_t {aka unsigned char}]' for array subscript
mandar_filas(filasx5[ct_byte]);
^

filasx5 isn't an array.

hard to knwo what your program is doing with both symbol names and comments in spanish.

can you explain what you're trying to do and what i need to understand about your program to understand that explanation

Also, please reformat your code with AUTO FORMAT in the IDE, so the code structure is more visible.
(( Or you can manage the indents and balancing of elements manually if you’re confident.))

Indents, brackets and oddities will become more apparent.

1 Like

Post the verbose error log in code tags

Post this.