Autor Tema: problema al separar un número entero y mostrarlo en displays de 7 segmentos  (Leído 703 veces)

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

Desconectado Richi_Sambora

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 23
Estoy simulando un proyecto en Proteus donde muestro un número de tres dígitos (456) en una pantalla de 7 segmentos, pero en lugar de mostrar 456 muestra 006.......... los cálculos están bien hechos pero no No puedo entender dónde está el problema. cualquier ayuda es bienvenida!!.

este es el circuito:


este es el codigo:

Código: C
  1. /* Main.c file generated by New Project wizard
  2.  *
  3.  * Created:   mi. ene. 10 2024
  4.  * Processor: PIC16F84A
  5.  * Compiler:  CCS for PIC
  6.  */
  7.  
  8. #include <16F84a.h>
  9. #fuses NOWDT
  10. #use delay(clock=4000000)
  11. #define UNO                     0x0C // 00001100
  12. #define DOS                     0xB6 // 10110110
  13. #define TRES            0x9E // 10011110
  14. #define CUATRO  0xCC // 11001100
  15. #define CINCO           0xDA // 11011010
  16. #define SEIS                    0xFA // 11111010
  17. #define SIETE                   0x0E // 00001110
  18. #define OCHO            0xFE // 11111110
  19. #define NUEVE           0xCE // 11001110
  20. #define CERO            0x7E // 01111110
  21. #define ERROR     0b11110010
  22. #define  U 0x1
  23. #define  D 0x2
  24. #define  C 0x4
  25.  
  26. byte mostrar(int index){
  27.     switch(index) {
  28.         case 0: return CERO;
  29.         case 1: return UNO;
  30.         case 2: return DOS;
  31.                 case 3: return TRES;
  32.         case 4: return CUATRO; 
  33.         case 5: return CINCO;
  34.                 case 6: return SEIS;
  35.                 case 7: return SIETE;
  36.                 case 8: return OCHO;
  37.                 case 9: return NUEVE;
  38.                 default: return ERROR; // Manejar casos no definidos
  39.     }
  40. }
  41.  
  42. int main (void)
  43.  {
  44.         set_tris_a(0x00); // Configura todos los pines del Puerto A como salida
  45.         set_tris_b(0x01); // Configura RB0 como entrada, RB1-RB7 como salida
  46.         while(true){
  47.                 int numero = 456;
  48.                 int unidad = numero % 10;
  49.                 int decena = (numero / 10) % 10;
  50.                 //centena = numero / 100;      
  51.                
  52.        
  53.                 // unidad
  54.                 output_a(U);
  55.                 output_b(mostrar(unidad));
  56.                 delay_ms(10);
  57.                 output_a(0);
  58.                
  59.                 output_a(D);
  60.                 output_b(mostrar(decena));
  61.                 delay_ms(10);
  62.                 output_a(0);
  63.         }
  64.  }

Cualquier ayuda es bienvenida!!

Gracias!!
« Última modificación: 18 de Enero de 2024, 14:35:38 por Richi_Sambora »

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:problema al separar un número entero y mostrarlo en displays de 7 segmentos
« Respuesta #1 en: 18 de Enero de 2024, 13:05:55 »
Estoy simulando un proyecto en Proteus donde muestro un número de tres dígitos (456) en una pantalla de 7 segmentos, pero en lugar de mostrar 456 muestra 006.......... los cálculos están bien hechos pero no No puedo entender dónde está el problema.

El esquema es para un 16F84A pero el programa es para un 16F716

El código que subiste no muestra 006 sino 00

Motivos:
- 'numero' está declarado de 8 bits --> lo que estás guardando ahí es 200 (456=256+200)
- Le sacaste mostrar la centena --> Como va a mostrarla?
« Última modificación: 18 de Enero de 2024, 13:33:02 por Eduardo2 »

Desconectado Richi_Sambora

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 23
Re:problema al separar un número entero y mostrarlo en displays de 7 segmentos
« Respuesta #2 en: 18 de Enero de 2024, 14:37:43 »
perdon como no sabia si era un problema del pic probe con el 16F716

ahi corrigo el codigo

Código: C
  1. /* Main.c file generated by New Project wizard
  2.          *
  3.          * Created:   mi. ene. 10 2024
  4.          * Processor: PIC16F84A
  5.          * Compiler:  CCS for PIC
  6.          */
  7.          
  8.         #include <16F84a.h>
  9.         #fuses NOWDT
  10.         #use delay(clock=4000000)
  11.         #define UNO                     0x0C // 00001100
  12.         #define DOS                     0xB6 // 10110110
  13.         #define TRES            0x9E // 10011110
  14.         #define CUATRO  0xCC // 11001100
  15.         #define CINCO           0xDA // 11011010
  16.         #define SEIS                    0xFA // 11111010
  17.         #define SIETE                   0x0E // 00001110
  18.         #define OCHO            0xFE // 11111110
  19.         #define NUEVE           0xCE // 11001110
  20.         #define CERO            0x7E // 01111110
  21.         #define ERROR     0b11110010
  22.         #define  U 0x1
  23.         #define  D 0x2
  24.         #define  C 0x4
  25.          
  26.         byte mostrar(int index){
  27.             switch(index) {
  28.                 case 0: return CERO;
  29.                 case 1: return UNO;
  30.                 case 2: return DOS;
  31.                         case 3: return TRES;
  32.                 case 4: return CUATRO;  
  33.                 case 5: return CINCO;
  34.                         case 6: return SEIS;
  35.                         case 7: return SIETE;
  36.                         case 8: return OCHO;
  37.                         case 9: return NUEVE;
  38.                         default: return ERROR; // Manejar casos no definidos
  39.             }
  40.         }
  41.          
  42.         int main (void)
  43.          {
  44.                 set_tris_a(0x00); // Configura todos los pines del Puerto A como salida
  45.                 set_tris_b(0x01); // Configura RB0 como entrada, RB1-RB7 como salida
  46.                 while(true){
  47.                         int numero = 456;
  48.                         int unidad = numero % 10;
  49.                         int decena = (numero / 10) % 10;
  50.                         int centena = numero / 100;      
  51.                        
  52.                
  53.                         // unidad
  54.                         output_a(U);
  55.                         output_b(mostrar(unidad));
  56.                         delay_ms(10);
  57.                         output_a(0);
  58.                         // Decena
  59.                         output_a(D);
  60.                         output_b(mostrar(decena));
  61.                         delay_ms(10);
  62.                         output_a(0);
  63.                         // Centena
  64.                         output_a(C);
  65.                         output_b(mostrar(centena));
  66.                         delay_ms(10);
  67.                         output_a(0);
  68.                 }
  69.          }
« Última modificación: 18 de Enero de 2024, 15:28:13 por Richi_Sambora »

Desconectado Richi_Sambora

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 23
Re:problema al separar un número entero y mostrarlo en displays de 7 segmentos
« Respuesta #3 en: 18 de Enero de 2024, 15:33:09 »
simplifique un poco el codigo con el mismo resultado:

Código: C
  1. /* Main.c file generated by New Project wizard
  2.  *
  3.  * Created:   mi. ene. 10 2024
  4.  * Processor: PIC16F84A
  5.  * Compiler:  CCS for PIC
  6.  */
  7. #include <16F84A.h>
  8. #use delay(clock=4000000,crystal)//Crystal Externo 4MHz
  9. #FUSES XT,NOWDT
  10. Byte CONST display[10]= {0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0x0E,0xFE,0xCE};
  11. #BYTE PORTA= 5
  12. #BYTE PORTB= 6
  13. #define  U 0x1
  14. #define  D 0x2
  15. #define  C 0x4
  16. int16 numero;
  17. int unidad,decena,centena;
  18.  
  19. //#define ERROR     0b11110010
  20.  
  21.  
  22. int main (void)
  23.  {
  24.         set_tris_a(0b11111000); // Configura todos los pines del Puerto A como salida
  25.         set_tris_b(0x01); // Configura RB0 como entrada, RB1-RB7 como salida
  26.         while(true){
  27.                 numero=456;
  28.                 unidad = numero % 10;
  29.                 decena = (numero / 10) % 10;
  30.                 centena = numero / 100;      
  31.                 //unidad
  32.                 output_a(U);
  33.                 PORTB = (display[unidad]);  
  34.                 delay_ms(10);
  35.                 output_a(0);           
  36.                 //decena
  37.                 output_a(D);
  38.                 PORTB = (display[decena]);  
  39.                 delay_ms(10);
  40.                 output_a(0);           
  41.                 //centena
  42.                 output_a(C);
  43.                 PORTB = (display[centena]);  
  44.                 delay_ms(10);
  45.                 output_a(0);           
  46.                
  47.                
  48.         }
  49.  }
« Última modificación: 18 de Enero de 2024, 16:38:05 por Richi_Sambora »

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:problema al separar un número entero y mostrarlo en displays de 7 segmentos
« Respuesta #4 en: 18 de Enero de 2024, 15:52:41 »
Que a la variable numero la hayas declarado de 8bits no te dice nada?

Desconectado Richi_Sambora

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 23
Re:problema al separar un número entero y mostrarlo en displays de 7 segmentos
« Respuesta #5 en: 18 de Enero de 2024, 16:01:05 »
Perdon pero no conozco mucho de programacion pic.

como deberia declararla?

8 bits maximo 255 como entero no?
« Última modificación: 18 de Enero de 2024, 16:22:16 por Richi_Sambora »

Desconectado Richi_Sambora

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 23
Re:problema al separar un número entero y mostrarlo en displays de 7 segmentos
« Respuesta #6 en: 18 de Enero de 2024, 16:36:57 »
ahi solucione muchas gracias por el dato.

Código: C
  1. /* Main.c file generated by New Project wizard
  2.  *
  3.  * Created:   mi. ene. 10 2024
  4.  * Processor: PIC16F84A
  5.  * Compiler:  CCS for PIC
  6.  */
  7. #include <16F84A.h>
  8. #use delay(clock=4000000,crystal)//Crystal Externo 4MHz
  9. #FUSES XT,NOWDT
  10. Byte CONST display[10]= {0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0x0E,0xFE,0xCE};
  11. #BYTE PORTA= 5
  12. #BYTE PORTB= 6
  13. #define  U 0x1
  14. #define  D 0x2
  15. #define  C 0x4
  16. int16 numero,unidad,decena,centena;
  17.  
  18. //#define ERROR     0b11110010
  19.  
  20.  
  21. int main (void)
  22.  {
  23.         set_tris_a(0b11111000); // Configura todos los pines del Puerto A como salida
  24.         set_tris_b(0x01); // Configura RB0 como entrada, RB1-RB7 como salida
  25.         while(true){
  26.                 numero=456;
  27.                 unidad = numero % 10;
  28.                 decena = (numero / 10) % 10;
  29.                 centena = numero / 100;      
  30.                 //unidad
  31.                 output_a(U);
  32.                 PORTB = (display[unidad]);  
  33.                 delay_ms(10);
  34.                 output_a(0);           
  35.                 //decena
  36.                 output_a(D);
  37.                 PORTB = (display[decena]);  
  38.                 delay_ms(10);
  39.                 output_a(0);           
  40.                 //centena
  41.                 output_a(C);
  42.                 PORTB = (display[centena]);  
  43.                 delay_ms(10);
  44.                 output_a(0);           
  45.                
  46.                
  47.         }
  48.  }

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:problema al separar un número entero y mostrarlo en displays de 7 segmentos
« Respuesta #7 en: 18 de Enero de 2024, 16:43:02 »
unidad,decena y centena no necesitan ser int16.

Desconectado miguelsaldo

  • PIC10
  • *
  • Mensajes: 4
Re:problema al separar un número entero y mostrarlo en displays de 7 segmentos
« Respuesta #8 en: 04 de Febrero de 2024, 07:24:39 »
Me pasó algo parecido hace un tiempo y me rompí la cabeza pensando que era...


 

anything