Autor Tema: Ayuda con este problema en lenguaje C  (Leído 1600 veces)

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

Desconectado Seon

  • PIC10
  • *
  • Mensajes: 7
Ayuda con este problema en lenguaje C
« en: 01 de Febrero de 2016, 14:36:54 »

Hola a todos  :-)

Soy nuevo en el foro asi que voy a intentar explicarme lo mejor posible

Resulta que para el colegio necesito hacer este codigo, usamos el mplab x con el compilador xc8 de lenguaje C y el PIC es el 16F84A. Aqui el problema:

Se necesita construir un contador de 1 digito de 0 a 9. Para eso se desea conectar un PIC16F84A a un display de 7 segmentos. Cada vez que se recibe un cambio de 0 a 1 en RA2 se desea que el display incremente su valor en 1 y si llega a 9 debera volver a 0 nuevamente en forma repetitiva. La señal recibida en RA2 es enviada en otro equipo y solo cada cambio de 0 a 1 debe ser considerado para incrementar la numeracion. El display esta conectado asi y debe mostrar un numero en el display: a=RB0 b=RB1 c=RB2 d=RB3 e=RB4 f=RB5 g=RB6

Alguien que me ayude a resolver esto o  alguien que tenga la amabilidad de terminarme el codigo asi ya lo puedo estudiar.

Esto es lo que hice pero no se si esta bien

Código: C
  1. // PIC16F84A Configuration Bit Settings
  2.  
  3. // 'C' source line config statements
  4.  
  5. #include <xc.h>
  6.  
  7. // #pragma config statements should precede project file includes.
  8. // Use project enums instead of #define for ON and OFF.
  9.  
  10. // CONFIG
  11. #pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
  12. #pragma config WDTE = OFF       // Watchdog Timer (WDT disabled)
  13. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (Power-up Timer is disabled)
  14. #pragma config CP = OFF         // Code Protection bit (Code protection disabled)
  15.  
  16. int nro=0;
  17.  
  18. void configuroPIC()
  19. {
  20.     TRISB=0b00000000;
  21.     TRISA=0b00000100;
  22. }
  23.  
  24. int main()
  25. {
  26.    
  27.  DeCeroaUno();
  28.  display();
  29.  DeUnoaCero();
  30.  Cero();
  31. }
  32.  
  33. void Cero()
  34. {
  35.     PORTBbits.RB0=1;
  36.     PORTBbits.RB1=1;
  37.     PORTBbits.RB2=1;
  38.     PORTBbits.RB3=1;
  39.     PORTBbits.RB4=1;
  40.     PORTBbits.RB5=1;
  41.     PORTBbits.RB6=1;
  42.     PORTBbits.RB7=1;
  43. }
  44. void DeCeroaUno()
  45. {
  46.     while(PORTAbits.RA2==1)
  47.     {
  48.     if(PORTAbits.RA2==1)
  49.     {
  50.         nro=nro+1;
  51.     }
  52.     }
  53. }
  54.  
  55. void DeUnoaCero()
  56. {
  57.  if(PORTAbits.RA2==1)
  58.  {
  59.  
  60.  }
  61.  }
  62. void display(int nr0)
  63. {
  64. if(nro==0)
  65. {    
  66.     PORTBbits.RB0=1;
  67.     PORTBbits.RB1=1;
  68.     PORTBbits.RB2=1;
  69.     PORTBbits.RB3=1;
  70.     PORTBbits.RB4=1;
  71.     PORTBbits.RB5=1;
  72. }
  73.  
  74. else if(nr0==1)
  75. {
  76.         PORTBbits.RB5=1;
  77.         PORTBbits.RB4=1;
  78. }
  79.  
  80.  
  81. else if(nro==2)
  82. {
  83.      PORTBbits.RB0=1;
  84.      PORTBbits.RB1=1;
  85.      PORTBbits.RB6=1;    
  86.      PORTBbits.RB4=1;
  87.      PORTBbits.RB3=1;
  88. }
  89.    
  90. else if(nro==3)
  91. {
  92.      PORTBbits.RB0=1;
  93.      PORTBbits.RB1=1;
  94.      PORTBbits.RB6=1;    
  95.      PORTBbits.RB2=1;
  96.      PORTBbits.RB3=1;
  97. }
  98. else if(nro==4)
  99. {
  100.      PORTBbits.RB5=1;
  101.      PORTBbits.RB1=1;
  102.      PORTBbits.RB2=1;    
  103.      PORTBbits.RB6=1;
  104.  
  105. }
  106.  else if(nro==5)
  107. {
  108.      PORTBbits.RB0=1;
  109.      PORTBbits.RB5=1;
  110.      PORTBbits.RB6=1;    
  111.      PORTBbits.RB2=1;
  112.      PORTBbits.RB3=1;
  113.      
  114.  
  115. }
  116. else if(nro==6)
  117. {
  118.      PORTBbits.RB0=1;
  119.      PORTBbits.RB5=1;
  120.      PORTBbits.RB6=1;    
  121.      PORTBbits.RB2=1;
  122.      PORTBbits.RB3=1;
  123.      PORTBbits.RB4=1;
  124.      
  125.          
  126.    
  127.    
  128.  
  129. }
  130. }
  131. //***RB0***
  132. //*       *  
  133. //*RB5   RB1
  134. //*       *
  135. //***RB6***
  136. //*       *
  137. //*RB4   RB2    
  138. //*       *
  139. //***RB3***


Gracias.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda con este problema en lenguaje C
« Respuesta #1 en: 01 de Febrero de 2016, 15:51:21 »
Código: C
  1. // PIC16F84A Configuration Bit Settings
  2.  
  3. // 'C' source line config statements
  4.  
  5. #include <xc.h>
  6.  
  7. // #pragma config statements should precede project file includes.
  8. // Use project enums instead of #define for ON and OFF.
  9.  
  10. // CONFIG
  11. #pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
  12. #pragma config WDTE = OFF       // Watchdog Timer (WDT disabled)
  13. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (Power-up Timer is disabled)
  14. #pragma config CP = OFF         // Code Protection bit (Code protection disabled)
  15.  
  16. short int       contador=0;
  17. short int       tabla[10] = {   0b0000000,      // Numero 0
  18.                         0b0000000,      // Numero 1
  19.                         0b0000000,      // 2
  20.                         0b0000000,      // 3
  21.                         0b0000000,      // 4
  22.                         0b0000000,      // 5
  23.                         0b0000000,      // 6
  24.                         0b0000000,      // 7
  25.                         0b0000000,      // 8
  26.                         0b0000000};     // 9
  27.  
  28.  
  29. void main() {
  30.  
  31.         // Aca la configuracion de los puertos,TRIS, etc
  32.         TRISA = 0xFF;           // Puerto A como entradas
  33.         TRISB = 0;              // Puerto B como salidas
  34.         PORTB = tabla[0];       // Que el display comienze con el valor de 0
  35.  
  36.         while(1)                // Loop principal
  37.         {
  38.                 if(PORTAbits.RA2)                               // RA2 en 1?
  39.                 {
  40.                         delay_ms(10);                           // Espero, antirebote
  41.                         contador++;                             // Aumento el numero en 1
  42.                         if(contador==10) { contador=0; }        // Si se paso a 10, lo pongo en 0
  43.                         PORTB = tabla[contador];                // Muestro el valor nuevo
  44.                         while(PORTAbits.RA2);                   // Espero que suelte el boton (asi no cuenta varias veces
  45.                 }
  46.         }
  47. }

En donde dice tabla,, ahi tenes para cada numero tenes que ponerle un 1 o un 0 para que se encienda el segmento de cada led.. Supongamos que tenes el 7 segmento de catodo comun
Para el 0 deberias encender los segmentos: abcdef
Segun te dieron especificado: a=RB0 b=RB1 c=RB2 d=RB3 e=RB4 f=RB5 g=RB6

Entonces el primer valor es:

0b0111111,   // Numero 0

Recorda que RB0 es el de la derecha, es decir Rb7 Rb6 Rb5 Rb4 Rb3 Rb2 Rb1 Rb0.

Una cosa mas a notar en C,,, en tu main deberia haber SIEMPRE SIEMPRE un loop infinito, por eso esta el while(1), para que repita siempre eso.
« Última modificación: 01 de Febrero de 2016, 19:42:16 por KILLERJC »

Desconectado Seon

  • PIC10
  • *
  • Mensajes: 7
Re:Ayuda con este problema en lenguaje C
« Respuesta #2 en: 01 de Febrero de 2016, 19:43:07 »
Gracias, el tema es que tengo que armar una funcion para el cambio de estado, es decir una funcion de cero a uno, otra funcion que incremente el display, otra funcion que muestre y otra funcion de 1 a 0.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda con este problema en lenguaje C
« Respuesta #3 en: 01 de Febrero de 2016, 19:53:35 »
Justamente no necesitas eso... es absolutamente insolito, mala programacion, etc, cambiar eso por algo asi:

Código: C
  1. void CambiarPuerto(short int x) {
  2.         PORTB = tabla[x];                // Muestro el valor nuevo     
  3. }

Por que simplemente es MALO.

Como ves son 5 lineas ( podrian ser 4 lo cual te voy a mostrar luego ). las cuales lo unico que podrias meter en una funcion, complicando las cosas seria estas 2 lineas y una funcion de "setup":

Código: C
  1. contador++;                             // Aumento el numero en 1
  2.                         if(contador==10) { contador=0; }        // Si se paso a 10, lo pongo en 0

Creando una funcion para "aumentar" el numero ese. Pero aun asi, si quisiera lo hago es una linea a ese codigo:

Código: C
  1. if(++contador==10) { contador=0; }        // Aumento en 1, Si se paso a 10, lo pongo en 0

Respecto a la funcion de "setup" o configuracion inicial, crear una funcion que tenga estas 3 lineas:

Código: C
  1. TRISA = 0xFF;           // Puerto A como entradas
  2.         TRISB = 0;              // Puerto B como salidas
  3.         PORTB = tabla[0];       // Que el display comienze con el valor de 0

Nuevamente complicando las cosas, por que estarias agregando como minimo 3 lineas mas al codigo haciendolo menos legible.
Pero bueno, vos elegis, yo te dejo el codigo.

Desconectado Seon

  • PIC10
  • *
  • Mensajes: 7
Re:Ayuda con este problema en lenguaje C
« Respuesta #4 en: 01 de Febrero de 2016, 23:18:46 »
Son las locuras de mi profesor, nos obliga a hacerlo de esa manera por eso preguntaba como carajo hacerlo sino seria mucho mas facil. Gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda con este problema en lenguaje C
« Respuesta #5 en: 01 de Febrero de 2016, 23:23:10 »
Yo entiendo el punto de vista de tu profesor en que intenta hacerles aprender a escribir funciones, usar mas variables, etc.

Pero el problema es TAN sencillo que en C no vale la pena, o no hay como hacerlo sin que legible para una persona que recien arranca programando.
Ademas no veo provechoso enseñar a hacer codigo de una manera "incorrecta".

Fuera ASM, entonces si podemos hacer un par de "subrutinas" por que son mas lineas de codigo, pero por eso nomas.

Lamento no poder ser de mas ayuda.
« Última modificación: 02 de Febrero de 2016, 00:13:38 por KILLERJC »


 

anything