Autor Tema: se puede mejorar este código de un cubo led 3x3x3?  (Leído 2863 veces)

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

Desconectado CcBeNiTocC

  • PIC10
  • *
  • Mensajes: 14
se puede mejorar este código de un cubo led 3x3x3?
« en: 17 de Enero de 2018, 21:35:20 »
buen día, quisiera saber si alguien sabe si este código se puede mejorar, ya que soy aprendis básico del lenguaje c en piccompiler.
es de un cubo led 3x3x3 con un pic 16f628a

 while(true){
for(j=0;j<=7;j++){
 for(i=0;i<=3;i++){
 output_a(0b0011);             //pisos
 output_b(0b10000000);         //puertos de leds
 delay_ms(time2);
 output_a(0b0101);
 output_b(0b00010000);
 delay_ms(time2);
 output_a(0b0110);
 output_b(0b00000010);
 delay_ms(time2);
  }
  for(i=0;i<=3;i++){
 output_a(0b0011);             //pisos
 output_b(0b01000000);         //puertos de leds
 delay_ms(time2);
 output_a(0b0101);
 output_b(0b00010000);
 delay_ms(time2);
 output_a(0b0110);
 output_b(0b00000001);
 delay_ms(time2);
  }
  for(i=0;i<=3;i++){
 output_a(0b0011);             //pisos
 output_b(0b00001000);         //puertos de leds
 delay_ms(time2);
 output_a(0b0101);
 output_b(0b00010000);
 delay_ms(time2);
 output_a(0b0110);
 output_b(0b00100000);
 delay_ms(time2);
  }
  for(i=0;i<=3;i++){
 output_a(0b0011);             //pisos
 output_b(0b00000100);         //puertos de leds
 delay_ms(time2);
 output_a(0b0101);
 output_b(0b00010000);
 delay_ms(time2);
 output_a(0b1110);
 output_b(0b00000000);
 delay_ms(time2);
  }
  for(i=0;i<=19;i++){
 output_a(0b0011);             //pisos
 output_b(0b00000010);         //puertos de leds
 delay_ms(time2);
 output_a(0b0101);
 output_b(0b00010000);
 delay_ms(time2);
 output_a(0b0110);
 output_b(0b10000000);
 delay_ms(time2);
  }
  for(i=0;i<=19;i++){
 output_a(0b0011);             //pisos
 output_b(0b00000001);         //puertos de leds
 delay_ms(time2);
 output_a(0b0101);
 output_b(0b00010000);
 delay_ms(time2);
 output_a(0b0110);
 output_b(0b01000000);
 delay_ms(time2);
  }
  for(i=0;i<=19;i++){
 output_a(0b0011);             //pisos
 output_b(0b00100000);         //puertos de leds
 delay_ms(time2);
 output_a(0b0101);
 output_b(0b00010000);
 delay_ms(time2);
 output_a(0b0110);
 output_b(0b00001000);
 delay_ms(time2);
  }
  for(i=0;i<=19;i++){
 output_a(0b1011);             //pisos
 output_b(0b00000000);         //puertos de leds
 delay_ms(time2);
 output_a(0b0101);
 output_b(0b00010000);
 delay_ms(time2);
 output_a(0b0110);
 output_b(0b00000100);
 delay_ms(time2);
  }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:se puede mejorar este código de un cubo led 3x3x3?
« Respuesta #1 en: 17 de Enero de 2018, 23:45:57 »
A que te referis con "mejorar" ?

- Que vaya mas rapido?
- Que ocupe menos espacio en el micro?
- Que sean menos instrucciones ?

¿Ese codigo esta completo? No veo donde cierra el primer for, por eso te pregunto.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:se puede mejorar este código de un cubo led 3x3x3?
« Respuesta #2 en: 18 de Enero de 2018, 20:50:09 »
Tampoco cierra el while, hemos de suponer que tras el cierre del ultimo for le falten otras dos llaves para el primer for y el while.

Desconectado CcBeNiTocC

  • PIC10
  • *
  • Mensajes: 14
Re:se puede mejorar este código de un cubo led 3x3x3?
« Respuesta #3 en: 18 de Enero de 2018, 23:55:05 »
si eso solo es parte del código la cosa es si se puede digamos que hacer de mejor forma, para que no ocupe tanto espacio en la memoria del pic, si hay alguna forma de crear ese mismo patron manejando alguna directiva diferente, ya que soy nuevo en esto y pues ya he programado 6 tipos de secuencia en mi cubo led 3x3x3, igual mente gracias por comentar  :)

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:se puede mejorar este código de un cubo led 3x3x3?
« Respuesta #4 en: 19 de Enero de 2018, 05:49:37 »
En cada bucle for se repite practicamente salvo los valores de los puertos led.

  Se me ocurre que te hagas una funcion void donde metas un solo bloque for y como atributo le mandas los tres valores de los puertos led como entero.

Código: C
  1. void led(led1,led2,led3) {
  2. for(i=0;i<=3;i++){
  3.  output_a(0b0011);             //pisos
  4.  output_b(led1);         //puertos de leds
  5.  delay_ms(time2);
  6.  output_a(0b0101);
  7.  output_b(led2);
  8.  Delay_ms(time2);
  9.  output_a(0b0110);
  10.  output_b(led3);
  11.  delay_ms(time2);
  12.   }
  13. }

Los valores de los output_b que ahora estas poniendo en binario lo pasas a decimal y se lo mandas como atributo a la función.

  Entonces en el main te quedas solo con el for general y dentro de él simplemente vas lcargando los tres atributos y enviando a la funcion.

  Sin probarlo, me atreveria a decir que algo quita.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re:se puede mejorar este código de un cubo led 3x3x3?
« Respuesta #5 en: 19 de Enero de 2018, 06:13:23 »
Yo lo haría en dos partes:

1º Una rutina por interrupciones que cada cierto tiempo copie los valores de una matriz al cubo led.

2º Una rutina que actualice los valores de la matriz según un patrón almacenado en memoria o que se genere por programa.

La matriz la haría con 3 enteros de 16 bit. Un entero por cada piso. En cada entero se ponen los 9 bit de un piso todos seguidos.

Esto te permite programar el cubo con más facilidad y que el código sea más visual. Por ejemplo una función para actualizar la matriz:

Código: C
  1. print_cubo(0b111000111,
  2.               0b000111000,
  3.               0b111000111);

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re:se puede mejorar este código de un cubo led 3x3x3?
« Respuesta #6 en: 19 de Enero de 2018, 06:18:58 »
Si quieres que ayudemos con los detalles del código, deberías comentarnos qué hace cada función.
No me queda claro por qué hay 4 bits para los 3 pisos del cubo, ni por qué hay 8 puertos para los 9 leds.

¿Cómo es el circuito?

Un saludo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:se puede mejorar este código de un cubo led 3x3x3?
« Respuesta #7 en: 19 de Enero de 2018, 16:21:10 »
La unica forma de ahorrar programa en ese caso es no repetir tanto lo mismo.

Pienso que la forma mas simple es la que propone remi04. Con algunas modificaciones, quedaria asi:

Código: C
  1. void led( int8 repetir, int8 led1, int8 led2, int8 led3) {
  2. for(i=0;i<=repetir;i++){
  3.  output_a(0b0011);             //pisos
  4.  output_b(led1);         //puertos de leds
  5.  delay_ms(time2);
  6.  output_a(0b0101);
  7.  output_b(led2);
  8.  Delay_ms(time2);
  9.  output_a(0b0110);
  10.  output_b(led3);
  11.  delay_ms(time2);
  12.   }
  13. }

Y tu programa en el main quedaria asi:

Código: C
  1. while(true){
  2.   for(j=0;j<=7;j++){
  3.     led(3,0b10000000,0b00010000,0b00000010);
  4.     led(3,0b01000000,0b00010000,0b00000001);
  5.     led(3,0b00001000,0b00010000,0b00100000);
  6.     led(3,0b00000100,0b00010000,0b00000000);
  7.     led(19,0b00000010,0b00010000,0b10000000);
  8.     led(19,0b00000001,0b00010000,0b01000000);
  9.     led(19,0b00100000,0b00010000,0b00001000);
  10.     led(19,0b00000000,0b00010000,0b00000100);


Por supuesto esto esta realizado con delays, y lo mejor como dice Picuino, seria usar interrupciones para dejar al micro haciendo otra cosa, sino facilmente el 95% del tiempo del micro se encuentra haciendo nada y no se utiliza, por ende se desaprovecha mucho del mismo. Pero si no tenes nada mas que hacer que eso nomas, entonces no hay problema.

Seguramente sea una mejora respecto al tamaño de codigo, pero no creo que llegue a ser una mejora demasiado grande, lo que si ganas es facilidad para realizar nuevas combinaciones.
Otra de las formas es usar punteros, el cual podrias llegar a reducir el codigo (funciones/instrucciones) escrito en C bastante mas, pero que no se si mejoraria en gran cantidad su tamaño, ademas tenes el costo de escribir los valores de los patrones a realizar en otro lado.
« Última modificación: 19 de Enero de 2018, 16:28:54 por KILLERJC »

Desconectado CcBeNiTocC

  • PIC10
  • *
  • Mensajes: 14
Re:se puede mejorar este código de un cubo led 3x3x3?
« Respuesta #8 en: 20 de Enero de 2018, 13:38:13 »
ok la cosa va así, las columnas de los leds son 9 y solo hay 8 puertos del mismo tipo y había una columna que ocupe otro puerto A, osea uso el puerto B para control de leds, y el puerto A y un bit lo uso para controlar la columna que falta. Para controlar las capas que activo , osea si activo el puerto B (1), el puerto A lo pongo en A(0) así fluye la corriente y se activa el led de la columna 1 piso 1, la cosa es que digamos que este es mi primer proyecto de programación y noto que tengo bastantes errores pero aun así funciona y he aprendido un montón, implementare cada una de sus respuestas  ya que están en lo cierto, la de remi04 me párese la mas acertada, ha y una pregunta un pic mejor que el 16f628a pero de 18 patas no mas grande, cual me recomiendan?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:se puede mejorar este código de un cubo led 3x3x3?
« Respuesta #9 en: 20 de Enero de 2018, 14:02:13 »
Citar
ha y una pregunta un pic mejor que el 16f628a pero de 18 patas no mas grande, cual me recomiendan?

Creo que pasa ya por:

- Que necesitas
- Que podes conseguir.

Si queres te podes ir a un PIC18 y buscar alguno que posea USB por ejemplo. Es mejor, tiene mucha mas memoria y conseguis de 18 pines.
Muchas veces esos modelos ( PIC16F84A, PIC16F628A ) son mucho mas caros que algunos nuevos micros que poseen muchas mas prestaciones y mayor espacio, ya que son bastantes viejitos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re:se puede mejorar este código de un cubo led 3x3x3?
« Respuesta #10 en: 20 de Enero de 2018, 17:45:58 »
un Atmega 328 con 28 pines.
Lo tienes integrado en placas Arduino desde 2 euros todo incluido (reguladores de tensión, conversor usb-rs232, 3 leds, pulsador reset, etc.)

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:se puede mejorar este código de un cubo led 3x3x3?
« Respuesta #11 en: 20 de Enero de 2018, 18:07:47 »
Yo me envicié con el 18F26K20, que creo que tambien te vale, y una delicia para la inmensa mayoria de proyectos que hacemos...

  Saludos


 

anything