Autor Tema: Teclado U-Control  (Leído 5972 veces)

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

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Teclado U-Control
« Respuesta #15 en: 24 de Julio de 2007, 08:47:34 »
Te cuento que soy un improvizado en esto de la electronica, todo lo estoy haciendo para manejar mi acuario. No se nada de eletronica, aclaro esto antes de que digas que bolu%#.

pablo, ya verás que en este foro nadie te tratará de bolu%# por no saber de electrónica... muchos empezaron de cero aquí mismo y no por ello los han defenestrado de ninguna forma.

Mientras pongas entusiasmo, ganas, esfuerzo y demuestres voluntad de aprender nadie te negará la ayuda aquí!! eso te lo garantizo.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Teclado U-Control
« Respuesta #16 en: 24 de Julio de 2007, 08:54:12 »
pablo, ya verás que en este foro nadie te tratará de bolu%# por no saber de electrónica... muchos empezaron de cero aquí mismo y no por ello los han defenestrado de ninguna forma.

Mientras pongas entusiasmo, ganas, esfuerzo y demuestres voluntad de aprender nadie te negará la ayuda aquí!! eso te lo garantizo.


Coincido con Maunix. Yo tambien empece aqui, en el foro, hace un año, y nunca me senti "discriminado",todo lo contrario, me han ayudado muchisimo!

Respecto del teclado, debido a que estoy mudando la web, ahora el link para acceder al circito ese es http://www.ucontrol.com.ar/wiki/index.php/Teclado_con_PIC16F628A

Saludos!
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Teclado U-Control
« Respuesta #17 en: 28 de Julio de 2007, 23:21:52 »
No ya se siempre tuve la mejor, aclaro para que se entiendan mis preguntas.
Aca aprendi de cero a programar en c y pude hacerme un controlador con display y todo, para mi todo un logro, siempre me gusto la electronica y nunca pude hacer nada por desconocimiento, ahora con los pics me siento todo un electronico. Algun dia llegare a aprender electronica en serio. Por ahora lo reemplazo con programacion y con estos maravillosos pics, que para lo que necesito son maravillosos.
En la semana compro nuevamante el pic y lo pruebo.
Disculpen la demora en la respuesta pero estube de viaje.

Como siempre mas que agradecido.
Pablo

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Teclado U-Control
« Respuesta #18 en: 31 de Julio de 2007, 01:33:51 »
Bueno, volvi al ruedo, como no me tenia confianza compre 2 micros, gracias a dios porque al rato ya habia quemado 1 juro que esta vez no tengo idea como.

Despues de luchar con mi codigo encontre uno por la web y lo modifique para la distribucion y necesitades propias.
Le conecte a la salida 1 led en cada pata para ver que pasaba cuando pulsaba un boton y algunos botones no funcionaron pero puede se de la placa porque en el proteus funciona bien.
El defecto que tiene es que cuando no presiono nada se prenden y se apagan algunos de los leds. Esto indica que cuando lo quira usar va a estar enviando datos como si hubiera presionado una tecla.
Por mas de que lo intente no encontre como quitar ese parpadeo.
Si le ven algu defecto al codigo por favor tirenme una soga.
Gracias.
Pablo

Código: [Seleccionar]
#include <16F628A.h>     
#FUSES NOWDT      //      Watch Dog Timer
#FUSES NOPUT        //      Power Up Timer
#FUSES NOPROTECT  //      Code not protected from reading
#FUSES NOBROWNOUT   //    Reset when brownout detected
#FUSES NOMCLR     //      Master Clear pin enabled
#FUSES NOLVP      //      No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES INTRC_IO   //      Internal RC Osc, no CLKOUT
#use delay(clock=4000000)
#byte port_a=0x05
#byte port_b=0x06
#use fast_io(a)
#use fast_io(b)


char c;


void delay()
{
delay_ms(5);
}

char kbd_getc()          // función que explora todo el teclado
{
   port_b=0b00000001;                  // verifica columna 1
   if(bit_test(port_a,0)==1)
   {delay();
   return ('1');}                     // si se presiono el uno devuelve 1
   if(bit_test(port_a,1)==1)
   {delay();
   return ('2');}                     // si se presiono el cuatro devuelve 4
   if(bit_test(port_a,3)==1)
   {delay();
   return ('3');}                     // si se presiono el siete devuelve 7
   if(bit_test(port_a,4)==1)
   {delay();
   return ('4'); }                   // si se presiono el * devuelve 10 = A

   port_b=0b00000010;                  // verifica columna 2
   if(bit_test(port_a,0)==1)
   {delay();
   return ('5');}                     // si se presiono el dos devuelve 2
   if(bit_test(port_a,1)==1)
   {delay();
   return ('6');}                     // si se presiono el cinco devuelve 5
   if(bit_test(port_a,3)==1)
   {delay();
   return ('7');}                     // si se presiono el ocho devuelve 8
   if(bit_test(port_a,4)==1)
   {delay();
   return ('8');}                    // si se presiono el cero devuelve 0

   port_b=0b00000100;                  // verifica columna 3
   if(bit_test(port_a,0)==1)
   {delay();
   return ('9');}                     // si se presiono el tres devuelve 3
   if(bit_test(port_a,1)==1)
   {delay();
   return ('A');}                     // si se presiono el seis devuelve 6
   if(bit_test(port_a,3)==1)
   {delay();
   return ('B'); }                    // si se presiono el nueve devuelve 9
   if(bit_test(port_a,4)==1)
   {delay();
   return 'C';  }                  // si se presiono el # devuelve 11 = B

   // si se tiene una matriz 4x3 no se usará el pin RB3
   port_b=0b00001000;                  // verifica columna 4
   if(bit_test(port_a,0)==1)
   {delay();
   return ('D');}                    // si se presiono la C devuelve 12 = C
   if(bit_test(port_a,1)==1)
   {delay();
   return ('E');}                    // si se presiono la D devuelve 13 = D
   if(bit_test(port_a,3)==1)
   {delay();
   return ('F');}                    // si se presiono la E devuelve 14 = E
   if(bit_test(port_a,4)==1)
   {delay();
   return ('*');}                    // si se presiono el F devuelve 15 = F
   if((bit_test(port_a,0)==0)&&(bit_test(port_a,1)==0)&&(bit_test(port_a,3)==0)&&(bit_test(port_a,4)==0))
      return (0);                    // devuelve 16 en caso de no haber presionado ningun pulsador
   // podria colocarse otra alternativa en caso de que no se presione ningun pulsador
}

void main()                      // programa principal
{
   set_tris_b(0x00);             // define RB0 a RB3 (columnas) como salidas y RB4 a RB7 (filas) como entradas
   port_b=0;                     // inicializa puerto B
   set_tris_a(0xff);             // define puerto A como todas entradas excepto RA0
   port_a=0;                     // inicializa puerto A
   port_b_pullups(TRUE);         // activa pull up del puerto b, no hará falta conectar resistencias

   while(true)                   // bucle de trabajo
   {
      while(1)
      {
         do
         {
            c=kbd_getc();
           
         }while(c==0);
         if(c=='1') {
            port_b = 0b00010000;
            delay_ms(50);
         } else if(c=='2') {
            port_b = 0b00100000;
            delay_ms(50);
         } else if(c=='3') {
            port_b = 0b00110000;
            delay_ms(50);
         } else if(c=='4') {
            port_b = 0b01000000;
            delay_ms(50);
         } else if(c=='5') {
            port_b = 0b01010000;
            delay_ms(50);
         } else if(c=='6') {
            port_b = 0b01100000;
            delay_ms(50);
         } else if(c=='7') {
            port_b = 0b01110000;
            delay_ms(20);
         } else if(c=='8') {
            port_b = 0b10000000;
            delay_ms(50);
         } else if(c=='9') {
            port_b = 0b10010000;
            delay_ms(50);
         } else if(c=='A') {
            port_b = 0b10100000;
            delay_ms(50);
         } else if(c=='B') {
            port_b = 0b10110000;
            delay_ms(50);
         } else if(c=='C') {
            port_b = 0b11000000;
            delay_ms(50);
         } else if(c=='D') {
            port_b = 0b11010000;
            delay_ms(50);
         } else if(c=='E') {
            port_b = 0b11100000;
            delay_ms(50);
         } else if(c=='F') {
            port_b = 0b11110000;
            delay_ms(50);
         } else {
            port_b = 0b00000000;
            delay_ms(50);
         }
         
      }         
   }

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Teclado U-Control
« Respuesta #19 en: 31 de Julio de 2007, 17:16:23 »
Bueno solucione el tema del parpadeo pero ahora si que no entiendo nada.
El programa en el proteus funciona a la perfeccion pero cuando lo pruebo no funciona bien.
Les cuento que es lo que pasa.

La distribucion la hice de esta forma

Entradas para verificar
A0 A1 A2 A3

1   2   3   4  B0       

5   6   7   8  B1

9   A   B  C  B2

D   E   F       B3


Las teclas D,E y F funcionan bien, lo probe con leds en las salidas.
La tecla 1, 5 y 9 manda como si hibiera presionado el 1
La teclas 2, 6 y A manda como si hubiera presionado el 2
La 3, 7 y B Nada
La 4, 8 y C como si hubiera presionado la tecla 3

No me doy cuenta que puede ser porque en el proteus funciona y desde la escaso de mis conocimientos el circuito esta bien hecho.

Se les ocurre que puede ser?
Muchas gracias.

Código: [Seleccionar]
#include <16F628A.h>     
#FUSES NOWDT      //      Watch Dog Timer
#FUSES NOPUT        //      Power Up Timer
#FUSES NOPROTECT  //      Code not protected from reading
#FUSES NOBROWNOUT   //    Reset when brownout detected
#FUSES NOMCLR     //      Master Clear pin enabled
#FUSES NOLVP      //      No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES INTRC_IO   //      Internal RC Osc, no CLKOUT
#use delay(clock=4000000)
#byte port_a=0x05
#byte port_b=0x06
#use fast_io(a)
#use fast_io(b)


char c;


void delay()
{
delay_ms(0);
}

char kbd_getc()          // función que explora todo el teclado
{
   port_b=0b00000001;                  // verifica columna 1
   if(bit_test(port_a,0)==1)
   {delay();
   return ('1');}                     // si se presiono el uno devuelve 1
   if(bit_test(port_a,1)==1)
   {delay();
   return ('2');}                     // si se presiono el cuatro devuelve 4
   if(bit_test(port_a,2)==1)
   {delay();
   return ('3');}                     // si se presiono el siete devuelve 7
   if(bit_test(port_a,3)==1)
   {delay();
   return ('4'); }                   // si se presiono el * devuelve 10 = A

   port_b=0b00000010;                  // verifica columna 2
   if(bit_test(port_a,0)==1)
   {delay();
   return ('5');}                     // si se presiono el dos devuelve 2
   if(bit_test(port_a,1)==1)
   {delay();
   return ('6');}                     // si se presiono el cinco devuelve 5
   if(bit_test(port_a,2)==1)
   {delay();
   return ('7');}                     // si se presiono el ocho devuelve 8
   if(bit_test(port_a,3)==1)
   {delay();
   return ('8');}                    // si se presiono el cero devuelve 0

   port_b=0b00000100;                  // verifica columna 3
   if(bit_test(port_a,0)==1)
   {delay();
   return ('9');}                     // si se presiono el tres devuelve 3
   if(bit_test(port_a,1)==1)
   {delay();
   return ('A');}                     // si se presiono el seis devuelve 6
   if(bit_test(port_a,2)==1)
   {delay();
   return ('B'); }                    // si se presiono el nueve devuelve 9
   if(bit_test(port_a,3)==1)
   {delay();
   return 'C';  }                  // si se presiono el # devuelve 11 = B

   // si se tiene una matriz 4x3 no se usará el pin RB3
   port_b=0b00001000;                  // verifica columna 4
   if(bit_test(port_a,0)==1)
   {delay();
   return ('D');}                    // si se presiono la C devuelve 12 = C
   if(bit_test(port_a,1)==1)
   {delay();
   return ('E');}                    // si se presiono la D devuelve 13 = D
   if(bit_test(port_a,2)==1)
   {delay();
   return ('F');}                    // si se presiono la E devuelve 14 = E
   if(bit_test(port_a,3)==1)
   {delay();
   return ('*');}                    // si se presiono el F devuelve 15 = F
   if((bit_test(port_a,0)==0)&&(bit_test(port_a,1)==0)&&(bit_test(port_a,2)==0)&&(bit_test(port_a,3)==0))
      return (0);                    // devuelve 16 en caso de no haber presionado ningun pulsador
   // podria colocarse otra alternativa en caso de que no se presione ningun pulsador
}

void main()                      // programa principal
{
   set_tris_b(0x00);             // define RB0 a RB3 (columnas) como salidas y RB4 a RB7 (filas) como entradas
   port_b=0;                     // inicializa puerto B
   set_tris_a(0b0001111);             // define puerto A como todas entradas excepto RA0
   port_a=0;                     // inicializa puerto A
   port_b_pullups(TRUE);         // activa pull up del puerto b, no hará falta conectar resistencias

   while(true)                   // bucle de trabajo
   {
      while(1)
      {
         do
         {
            c=kbd_getc();
           
         }while(c==0);
         if(c=='1') {
            port_b = 0b00010000;
            delay_ms(50);
         } else if(c=='2') {
            port_b = 0b00100000;
            delay_ms(50);
         } else if(c=='3') {
            port_b = 0b00110000;
            delay_ms(50);
         } else if(c=='4') {
            port_b = 0b01000000;
            delay_ms(50);
         } else if(c=='5') {
            port_b = 0b01010000;
            delay_ms(50);
         } else if(c=='6') {
            port_b = 0b01100000;
            delay_ms(50);
         } else if(c=='7') {
            port_b = 0b01110000;
            delay_ms(50);
         } else if(c=='8') {
            port_b = 0b10000000;
            delay_ms(50);
         } else if(c=='9') {
            port_b = 0b10010000;
            delay_ms(50);
         } else if(c=='A') {
            port_b = 0b10100000;
            delay_ms(50);
         } else if(c=='B') {
            port_b = 0b10110000;
            delay_ms(50);
         } else if(c=='C') {
            port_b = 0b11000000;
            delay_ms(50);
         } else if(c=='D') {
            port_b = 0b11010000;
            delay_ms(50);
         } else if(c=='E') {
            port_b = 0b11100000;
            delay_ms(50);
         } else if(c=='F') {
            port_b = 0b11110000;
            delay_ms(50);
         } else {
//            port_b = 0b00000000;
//            delay_ms(1050);
         }
         port_b = 0;
         //while((bit_test(port_a,0)==1)||(bit_test(port_a,1)==1)||(bit_test(port_a,3)==1)||(bit_test(port_a,4)==1))
         //{}
         
      }         
   }

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Teclado U-Control
« Respuesta #20 en: 31 de Julio de 2007, 21:47:37 »
Agrego algo mas al ultimo comentario, acabo de agregarle un sonido a cada tecla y lo probe en la placa.
Lo raro es que hace un sonido distinto en cada tecla pero sigue haciendo cualquier cosa en el encendido de los leds.

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Teclado U-Control
« Respuesta #21 en: 01 de Agosto de 2007, 21:32:39 »
Sigo, probando no quiero parecer pesado, perdon si parece.
Acabo de hacer una prueba con soft el tester.
Anule el barrido y deje prendida toda una fila, por ejemplo la fila 2 prendi el PIN B1 mido con el tester y mide 5v pero cuando presiono el boton de la columna 1 el PIN se pone en 0 obviamente el que recepciona tambien en 0v.

Por ahi sirve de algo, estoy seguro que es tema de configuracion.

Gracias.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Teclado U-Control
« Respuesta #22 en: 02 de Agosto de 2007, 01:39:40 »
Hola Pablo.

No puedo decirte cuál es la instrucción que efectúa lo que necesitás. Pero me parece que tu error se debe a que tenés algunos pines del puertoA configurados como analógicos(por defecto se inicializa así).
No suelo programar uC en C(en realidad, hace rato que no programo uC alguno...). Probá poniendo:

#use standard_io(A)

y fijate si ocurre el milagro. :mrgreen: :mrgreen:
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Teclado U-Control
« Respuesta #23 en: 02 de Agosto de 2007, 10:39:20 »
encontre esto en tu codigo

Código: C
  1. void main()                      // programa principal
  2. {
  3.    set_tris_b(0x00);             // define RB0 a RB3 (columnas) como salidas y RB4 a RB7 (filas) como entradas
  4.    port_b=0;                     // inicializa puerto B
  5.    set_tris_a(0b0001111);             // define puerto A como todas entradas excepto RA0
  6.    port_a=0;                     // inicializa puerto A
  7.    port_b_pullups(TRUE);         // activa pull up del puerto b, no hará falta conectar resistencias

ahi configuras los puertos, pero el portA del 16f628a se comporta por defecto como entradas análogas para los comparadores de tiene en su hardware, tienes que configurar esta catracteristica, hacer CMCON = 0x07, CMCON es el registro que controla los comparadores, con ese valor 0x07 lo pones en digital todo el portA. Saludos  :mrgreen:
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Teclado U-Control
« Respuesta #24 en: 02 de Agosto de 2007, 15:35:25 »
Bruno probe lo que me dijiete pero no pasa nada sigue igual

Micro_cadaver vos decis que ponga esto?

Código: [Seleccionar]
#byte CMCON
void main() {
    setup_comparator(NC_NC_NC_NC);
    COMCON = 0x07;
}

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Teclado U-Control
« Respuesta #25 en: 02 de Agosto de 2007, 15:41:17 »
no pero...

no conozco el CCs pero me imagino que sabras cual es la direccion del registro CMCON, entonces declaralo asi como el portb y porta, luego ponle cmcon = 0x07; al menos eso yo hago otros compiladores de C, o sino averigua las funciones que tiene el CCS para desactivar los comparadores.

a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Teclado U-Control
« Respuesta #26 en: 04 de Agosto de 2007, 17:59:32 »
Supuestamente con setup_comparator puedo configurar lo que me decias antes.
Pero igual creo que el 628 por lo poco que entiendo no tiene entradas analogicas.
Sigo sin poder hacerlo funcionar.
La verdad no entiendo porque, porque en realidad no es algo complicado, de hecho en la simulacion funciona.

Si alguien se da cuenta de que le falta al codigo sigo esperando su ayuda.
Gracias.
Pablo

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Teclado U-Control
« Respuesta #27 en: 04 de Agosto de 2007, 18:02:38 »
Pablo. Podés investigar por tu cuenta.

¿Por qué no lees el datasheet del 628? http://ww1.microchip.com/downloads/en/DeviceDoc/40044F.pdf

El 16F628 TIENE entradas analógicas. Hay que leer más...
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Teclado U-Control
« Respuesta #28 en: 04 de Agosto de 2007, 20:07:41 »
Bruno ya te aclare que no se electronica, igualmente ya habia entrado para mi chino y por lo poco que entiendo sigo sin ver que tiene entradas analogicas.
Me podes decir en que pagina lo dice asi no cometo el mismo error la proxima.
Mediante codigo tambien intente configurar las entradas analogicas para eliminarlas setup_adc_ports y no me lo permitio de ahi que crei estar mas seguro de que lo los tenia, tambien entre en el archivo .h y no encontre nada relacionado con los analogicos.
Si es asi puede que no este configurando bien el puerto y de ahi todos mis problemas, pero no se con que indicarlo porque te repito no me deja poner setup_adc_ports.

Gracias

Desconectado ESTECA55

  • PIC24H
  • ******
  • Mensajes: 1404
Re: Teclado U-Control
« Respuesta #29 en: 04 de Agosto de 2007, 21:48:09 »
Hay que esforzarse por ser el mejor, no creerse el mejor