Autor Tema: Programa en C para hacer un turnero con PIC 16f887  (Leído 2616 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado yesvari85

  • PIC10
  • *
  • Mensajes: 6
Programa en C para hacer un turnero con PIC 16f887
« en: 01 de Octubre de 2015, 13:38:31 »
Buenos días compañeros espero que estén muy bien, les escribo para pedirles por favor una orientación.

Les quiero pedir la colaboración por favor para que me ayuden a organizar las ideas que tengo para realizar el programa que me piden en el pdf que anexo, tengo las ideas de las estructura del programa pero no sé como empezar para escribir el código, hasta el momento ya escribí el programa para que me enciendan los tres display de 7 segmentos que son de ánodo común.

trabajo3


Programa Display:

#INCLUDE <16f887.h>
#FUSES INTRC_IO, NOMCLR, NOWDT
#USE delay(clock=4mhz)
#BYTE PORTB=0X06
#BYTE PORTE=0X09
#BYTE TRISB=0X86
#BYTE TRISE=0X89

INT CONST DISPLAY[10]={0x80,0xf2,0x48,0x60,0x32,0x24,0x04,0xf8,0x00,0x3 0};

INT UNIDAD=0;
INT DECENA=0;
INT CENTENA=0;

VOID MAIN (){

TRISB=0b00000000;
TRISE=0b00000000;

UNIDAD=6;
DECENA=9;
CENTENA=4;


WHILE (TRUE){

PORTB= DISPLAY[UNIDAD];
BIT_CLEAR(PORTE,0);
BIT_SET(PORTE,1);
BIT_SET(PORTE,2);
DELAY_MS(5);
PORTB=0XFF;

PORTB= DISPLAY[DECENA];
BIT_SET(PORTE,0);
BIT_CLEAR(PORTE,1);
BIT_SET(PORTE,2);
DELAY_MS(5);
PORTB=0XFF;

PORTB= DISPLAY[CENTENA];
BIT_SET(PORTE,0);
BIT_SET(PORTE,1);
BIT_CLEAR(PORTE,2);
DELAY_MS(5);
PORTB=0XFF;

}
}

Y estas son las ideas que tengo para escribir el código pero la verdad no sé como empezar para que me funciones, le agradecería mucho la asesoría.

#INCLUDE <16f887.h>
#FUSES INTRC_IO, NOMCLR, NOWDT
#USE delay(clock=4mhz)
Ubicar puertos en la RAM

while() { //para que me repita el bucle
visual_display(); // Indico la visualización con el
bit_bandera=0; // debo incluir el bit bandera pero no sé usarlo :(
if (bit_test(bandera,0)==0){ // preguntar por el estado del bit bandera
if(bit_test(portc,0)==1){ // preguntar por el estado del pulsador de los asesores
Mostrar el número del asesor;
incrementar el turno;

Aqui debo convertir la variable a BCD para visualizarla en el display con esta instrucción:
conver_hex_bcd(); // no se como implementarla el el programa

bit_bandera=1;
} // todo este ciclo se repite 5 veces para los 5 asesores

Si el puerto c==0{
poner bit_bandera=0;
}

Para restablecer el bit bandera tengo esta instrucción
x=portc;
x=x&0x1F;
si (x==0);{
bit_bandera=0
}


Esas son las leves ideas que tengo de como estructurar el programa pero la verdad no sé como escribirlo, si me pueden ayudar les agradecería infinitamente.

Saludos y muchas gracias de nuevo!!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Programa en C para hacer un turnero con PIC 16f887
« Respuesta #1 en: 01 de Octubre de 2015, 15:01:09 »
Bueno como que es simple, pero que se puede complicar, por ejemplo se podria hacer que lso displays se actualizen por una interrupcion de un timer asi simplificar el programa principal, pero no te voy a complicar demasiado la vida.

Lamentablemente no dice que hace cada boton, yo voy a dar unos valores por gusto nomas a cada uno.


Código: C
  1. while (1)
  2. {
  3.  
  4.         Muestro_en_display();
  5.  
  6.         if(!(input_c()&0x1F) { bit_bandera=0; } // Esta todo en 0 el puerto C entonces puedo poner mi bandera a 0
  7.  
  8.         if(!bit_bandera && input_c()&0x1F) // PuertoC 000a aaaa AND 0001 1111 Si algo esta presionado va a quedar como true, si ademas bit_bandera es 0 entra
  9.         {
  10.        
  11.                 bit_bandera=1;
  12.                 switch(input_c()&0x1F)
  13.                 {
  14.                 case 0x01:              // Caso que se presiono solamente boton C1 ( PORTC0 )
  15.                         Unidad++;
  16.                         Sonido();
  17.                         break;
  18.                 case 0x02:              // Caso que se presiono solamente boton C2 ( PORTC1 )
  19.                         Unidad--;
  20.                         Sonido();
  21.                         break;
  22.                 case 0x04:              // Caso que se presiono solamente boton C3 ( PORTC2 )
  23.                         Asesor++;
  24.                         Sonido();
  25.                         break;
  26.                 case 0x08:              // Caso que se presiono solamente boton C4 ( PORTC3 )
  27.                         Asesor--;
  28.                         Sonido();
  29.                         break;
  30.                 case 0x10:              // Caso que se presiono solamente boton C5 ( PORTC4 )
  31.                         Reset();        // Asesor=Unidad=Decena=0
  32.                         Sonido();
  33.                         break;
  34.                 default:                // Caso que se presiono varios botones, lo descarto.
  35.                         break;
  36.                 }
  37.                 // Ahora corrijo todo lo malo que puede existir;
  38.                 if (Unidad==10) {Unidad=0; Decena++;}   // Se pasaron las unidades aumento decenas, luego corrijo decenas
  39.                 if (Unidad>10) {Unidad=9; Decena--;}    // Me pase para atras?, es decir unidad era 0 y lo reste.
  40.                 if (Decena==10) {Decena=0;}             // Se pasaron las decenas, lo pongo a 0
  41.                 if (Decena>10) {Decena=9;}              // Me pase para atras?, es decir decena era 0 y lo reste.
  42.                 if (Asesor==6) {Asesor=1;}              // Supongo 5 asesores, y que comienzan con el numero 1. Se pasaron los asesores, lo pongo a 1
  43.                 if (Asesor==0) {Asesor=5;}              // Me pase para atras?, es decir asesor llego a 0 entonces pongo el ultimo, todo suponiendo que es ciclico
  44.        
  45.         }
  46. }

El codigo no me gusta para nada. es MALO lo que hice pero es para que te des una idea.
Una cosa a notar, es que mostrar en los displays si pones una demora en algun boton vas a hacer que un display se encuentre encendido mas que otro, asi que ojo con las demoras.

Desconectado yesvari85

  • PIC10
  • *
  • Mensajes: 6
Re: Programa en C para hacer un turnero con PIC 16f887
« Respuesta #2 en: 01 de Octubre de 2015, 15:32:37 »
Bueno como que es simple, pero que se puede complicar, por ejemplo se podria hacer que lso displays se actualizen por una interrupcion de un timer asi simplificar el programa principal, pero no te voy a complicar demasiado la vida.

Lamentablemente no dice que hace cada boton, yo voy a dar unos valores por gusto nomas a cada uno.


Código: C
  1. while (1)
  2. {
  3.  
  4.         Muestro_en_display();
  5.  
  6.         if(!(input_c()&0x1F) { bit_bandera=0; } // Esta todo en 0 el puerto C entonces puedo poner mi bandera a 0
  7.  
  8.         if(!bit_bandera && input_c()&0x1F) // PuertoC 000a aaaa AND 0001 1111 Si algo esta presionado va a quedar como true, si ademas bit_bandera es 0 entra
  9.         {
  10.        
  11.                 bit_bandera=1;
  12.                 switch(input_c()&0x1F)
  13.                 {
  14.                 case 0x01:              // Caso que se presiono solamente boton C1 ( PORTC0 )
  15.                         Unidad++;
  16.                         Sonido();
  17.                         break;
  18.                 case 0x02:              // Caso que se presiono solamente boton C2 ( PORTC1 )
  19.                         Unidad--;
  20.                         Sonido();
  21.                         break;
  22.                 case 0x04:              // Caso que se presiono solamente boton C3 ( PORTC2 )
  23.                         Asesor++;
  24.                         Sonido();
  25.                         break;
  26.                 case 0x08:              // Caso que se presiono solamente boton C4 ( PORTC3 )
  27.                         Asesor--;
  28.                         Sonido();
  29.                         break;
  30.                 case 0x10:              // Caso que se presiono solamente boton C5 ( PORTC4 )
  31.                         Reset();        // Asesor=Unidad=Decena=0
  32.                         Sonido();
  33.                         break;
  34.                 default:                // Caso que se presiono varios botones, lo descarto.
  35.                         break;
  36.                 }
  37.                 // Ahora corrijo todo lo malo que puede existir;
  38.                 if (Unidad==10) {Unidad=0; Decena++;}   // Se pasaron las unidades aumento decenas, luego corrijo decenas
  39.                 if (Unidad>10) {Unidad=9; Decena--;}    // Me pase para atras?, es decir unidad era 0 y lo reste.
  40.                 if (Decena==10) {Decena=0;}             // Se pasaron las decenas, lo pongo a 0
  41.                 if (Decena>10) {Decena=9;}              // Me pase para atras?, es decir decena era 0 y lo reste.
  42.                 if (Asesor==6) {Asesor=1;}              // Supongo 5 asesores, y que comienzan con el numero 1. Se pasaron los asesores, lo pongo a 1
  43.                 if (Asesor==0) {Asesor=5;}              // Me pase para atras?, es decir asesor llego a 0 entonces pongo el ultimo, todo suponiendo que es ciclico
  44.        
  45.         }
  46. }

El codigo no me gusta para nada. es MALO lo que hice pero es para que te des una idea.
Una cosa a notar, es que mostrar en los displays si pones una demora en algun boton vas a hacer que un display se encuentre encendido mas que otro, asi que ojo con las demoras.

Muchas gracias!!, la idea de los botones es que cada asesor tenga uno y son 5 asesores o sea 5 botones, entonces si el asesor 1 presiona el boton en un displar aparece el número 1 del asesor que presionó el boton y el contador se debe incrementar. Y asi es con cada asesor debe aparecer el número del asesor e incrementar el conteo. De pronto me puedes hacer el favor de explicarme pero con If es que con switch no entiendo. Muchas gracias y disculpa por la molestia.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Programa en C para hacer un turnero con PIC 16f887
« Respuesta #3 en: 01 de Octubre de 2015, 15:54:42 »
el switch es lo mismo que hacer muchos if.. seria equivalente a hacer algo asi lo que o hice con switch:

if ( un solo boton presionado y no varios)
{
      if ( boton1 presionado) { xxx , y salgo de aca no continuo con los demas if si entra aca }
      if ( boton2 presionado) {xxxx, y salgo de aca no continuo con los demas if si entra aca}
      if ( boton3 presionado) {xxxx, y salgo de aca no continuo con los demas if si entra aca}
      if ( boton4 presionado) {xxxx, y salgo de aca no continuo con los demas if si entra aca}
      if ( boton5 presionado) {xxxx, y salgo de aca no continuo con los demas if si entra aca}
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Programa en C para hacer un turnero con PIC 16f887
« Respuesta #4 en: 02 de Octubre de 2015, 13:54:03 »
Para ambos que respondieron. Como ya me dijeron como era el programa se puede achicar un poco mas
Código: C
  1. int aux,i;
  2.     bool bit_bandera;
  3.  
  4.     while (1)
  5.     {
  6.      
  7.         Muestro_en_display();
  8.      
  9.         aux = input_c()&0x1F;
  10.      
  11.         if(!bit_bandera && aux)         // PuertoC 000a aaaa AND 0001 1111 Si algo esta presionado va a quedar como true, si ademas bit_bandera es 0 entra
  12.         {
  13.  
  14.                 bit_bandera=1;          // Set de bandera.
  15.                 for(i=0;i<5;i++)                        //Reviso todos las entradas, a la primer entrada activa procedo a tomar ese valor
  16.                 {
  17.                         if(bit_test(aux,i)) break;
  18.                 }
  19.                 Asesor=i+1;             // Valor de asesor depende del bit
  20.                 Unidad++;               // Incremento 1 unidad
  21.        
  22.                 // Ahora corrijo todo lo malo que puede existir;
  23.                 if (Unidad==10) {Unidad=0; Decena++;}   // Se pasaron las unidades aumento decenas, luego corrijo decenas
  24.                 if (Decena==10) {Decena=0;}             // Se pasaron las decenas, lo pongo a 0
  25.  
  26.         }
  27.  
  28.     }

Le falta agregar el sonido nomas. Y le quite el switch para que no exista mas problemas. Otra cosa interesante es si pudieran desabilitar las entradas un ratito luego de haber tomado un valor, de esa forma se evita que algun "animal de persona" presione 3 veces seguidas un boton para incrementar y se incremente exactamente 3 veces

Desconectado yesvari85

  • PIC10
  • *
  • Mensajes: 6
Re: Programa en C para hacer un turnero con PIC 16f887
« Respuesta #5 en: 02 de Octubre de 2015, 14:14:51 »
Para ambos que respondieron. Como ya me dijeron como era el programa se puede achicar un poco mas
Código: C
  1. int aux,i;
  2.     bool bit_bandera;
  3.  
  4.     while (1)
  5.     {
  6.      
  7.         Muestro_en_display();
  8.      
  9.         aux = input_c()&0x1F;
  10.      
  11.         if(!bit_bandera && aux)         // PuertoC 000a aaaa AND 0001 1111 Si algo esta presionado va a quedar como true, si ademas bit_bandera es 0 entra
  12.         {
  13.  
  14.                 bit_bandera=1;          // Set de bandera.
  15.                 for(i=0;i<5;i++)                        //Reviso todos las entradas, a la primer entrada activa procedo a tomar ese valor
  16.                 {
  17.                         if(bit_test(aux,i)) break;
  18.                 }
  19.                 Asesor=i+1;             // Valor de asesor depende del bit
  20.                 Unidad++;               // Incremento 1 unidad
  21.        
  22.                 // Ahora corrijo todo lo malo que puede existir;
  23.                 if (Unidad==10) {Unidad=0; Decena++;}   // Se pasaron las unidades aumento decenas, luego corrijo decenas
  24.                 if (Decena==10) {Decena=0;}             // Se pasaron las decenas, lo pongo a 0
  25.  
  26.         }
  27.  
  28.     }

Le falta agregar el sonido nomas. Y le quite el switch para que no exista mas problemas. Otra cosa interesante es si pudieran desabilitar las entradas un ratito luego de haber tomado un valor, de esa forma se evita que algun "animal de persona" presione 3 veces seguidas un boton para incrementar y se incremente exactamente 3 veces

Uy amigo eres un sensei en programación, increíble que un trabajo que me imaginaba con un código enorme quede así de corto, muy inteligente!! muchísimas gracias!!!

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:Programa en C para hacer un turnero con PIC 16f887
« Respuesta #6 en: 15 de Octubre de 2015, 00:44:35 »
Yo personalmente pienso que deberia hacer el codigo por su cuenta, sino no se aprende nada, sin animo de ofender a nadie.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Programa en C para hacer un turnero con PIC 16f887
« Respuesta #7 en: 15 de Octubre de 2015, 01:58:42 »
Yo soy de la idea de no pedir ayuda hasta que no encuentre realmente solucion y hubiera probado de todo o pensado creo que todo.
Al final son ellos quienes deciden si aprender o no. Si toman el codigo y ni lo miran y lo ponen asi nomas o si intentan entenderlo y luego utilizarlo. El codigo completo tampoco se los di, le falta una parte importante que es la del sonido y displays,

Sonido/display que si lo hacen con un delay van a colgar todos los botones y no iban a responder. Por eso no estan agregados tampoco :P
Ademas justo por este mismo (turnero) tema se abrieron 2 post de distintos usuarios con un dia de separacion. Con el mismo problema y utilizando el mismo codigo.

Con esto me refiero a que no me ofendo por tu critica, sino que aprender o no va a ser cuestion de ellos, el que no quiere aprender no lo va a hacer. Le des pistas o codigos, o lo que sea.


 

anything