Contador de vueltas para bobinadora.docx

23
Contador de vueltas para bobinadora http://www.micropic.es/mpblog/2010/10/contador-de-vueltas-para-bobinadora/ 17 octubre, 2010 Este proyecto que nos envía el amigo Roberto González, tiene como objetivo contar las vueltas que da un motor por medio de un sensor de efecto Hall, usándolo para bobinar transformadores. El sistema puede funcionar de dos formas: una es contar las vueltas del motor y otra de ellas es indicarle el número de vueltas que tiene que dar. De esta forma podemos desbobinar un transformador y saber el número de vueltas que tiene la bobina y/o bobinar un número de vueltas determinado, alcanzado éste número de vueltas se corta la alimentación del motor. Al iniciar el sistema entramos en un menú en el cual podemos seleccionar la opción deseada. Al circuito se le pueden dar otro tipo de aplicaciones, teniendo presente que está diseñado para contar. Circuito El núcleo principal del circuito está basado en un PIC 16F628. No se ha utilizado el PIC 16F84 debido a que el programa que hemos desarrollado ocupa más de 1k de memoria. Si el programa se desarrolla en ensamblador es posible que se pueda economizar memoria y quepa en el 16F84. Aunque si miramos los precios de los componentes el 16F628, que tienes mayores prestaciones, es más económico que el 16F84. El microcontrolador cuenta los pulsos proporcionados por un sensor de efecto Hall. Para ello debemos añadir al motor que elijamos, un pequeño imán en el eje, para que con cada vuelta que dé el motor se genere un pulso en el sensor Hall. En mi caso he utilizado un atornillador eléctrico de los que se desechan porque las baterías ya no sirven. El atornillador le he conectado a una fuente de alimentación externa que le impulsa. Por otro lado e independiente de la alimentación del motor, se usa otra alimentación para la electrónica asociada al PIC. Esto se ha hecho así porque en una primera aproximación vimos que los picos que generaba el motor (consume bastante corriente) se introducían en la electrónica y generaban comportamientos indeseados. A raíz de esta experiencia, se decidió añadir un optoacoplador para aislar la electrónica del relé que da paso a la alimentación del motor. Como interface con el usuario se ha puesto un teclado matricial de 4×3 y un LCD. El teclado sirve para dar las órdenes al sistema y con el LCD podemos ver en que punto nos encontramos. El esquema es el mostrado en la figura de la siguiente pagina. Como sensor HALL se ha usado el A1104 de la marca Allegro, que hemos adquirido en web www.amidata.es . Se trata de un sensor que nos da un pulso a la salida cuando detecta un campo magnético, es un sensor del tipo switch. La

Transcript of Contador de vueltas para bobinadora.docx

Page 1: Contador de vueltas para bobinadora.docx

Contador de vueltas para bobinadorahttp://www.micropic.es/mpblog/2010/10/contador-de-vueltas-para-bobinadora/

17 octubre, 2010

Este proyecto que nos envía el amigo Roberto González, tiene como objetivo contar las vueltas que da un motor por medio de un sensor de efecto Hall, usándolo para bobinar transformadores.

El sistema puede funcionar de dos formas: una es contar las vueltas del motor y otra de ellas es indicarle el número de vueltas que tiene que dar. De esta forma podemos desbobinar un transformador y saber el número de vueltas que tiene la bobina y/o bobinar un número de vueltas determinado, alcanzado éste número de vueltas se corta la alimentación del motor.

Al iniciar el sistema entramos en un menú en el cual podemos seleccionar la opción deseada.

Al circuito se le pueden dar otro tipo de aplicaciones, teniendo presente que está diseñado para contar.

CircuitoEl núcleo principal del circuito está basado en un PIC 16F628. No se ha utilizado el PIC

16F84 debido a que el programa que hemos desarrollado ocupa más de 1k de memoria. Si el programa se desarrolla en ensamblador es posible que se pueda economizar memoria y quepa en el 16F84. Aunque si miramos los precios de los componentes el 16F628, que tienes mayores prestaciones, es más económico que el 16F84.

El microcontrolador cuenta los pulsos proporcionados por un sensor de efecto Hall. Para ello debemos añadir al motor que elijamos, un pequeño imán en el eje, para que con cada vuelta que dé el motor se genere un pulso en el sensor Hall. En mi caso he utilizado un atornillador eléctrico de los que se desechan porque las baterías ya no sirven. El atornillador le he conectado a una fuente de alimentación externa que le impulsa.

Por otro lado e independiente de la alimentación del motor, se usa otra alimentación para la electrónica asociada al PIC. Esto se ha hecho así porque en una primera aproximación vimos que los picos que generaba el motor (consume bastante corriente) se introducían en la electrónica y generaban comportamientos indeseados. A raíz de esta experiencia, se decidió añadir un optoacoplador para aislar la electrónica del relé que da paso a la alimentación del motor.

Como interface con el usuario se ha puesto un teclado matricial de 4×3 y un LCD. El teclado sirve para dar las órdenes al sistema y con el LCD podemos ver en que punto nos encontramos. El esquema es el mostrado en la figura de la siguiente pagina.

Como sensor HALL se ha usado el A1104 de la marca Allegro, que hemos adquirido en web www.amidata.es. Se trata de un sensor que nos da un pulso a la salida cuando detecta un campo magnético, es un sensor del tipo switch. La salida del sensor es mosfet con drenador abierto, por eso el añadir una resistencia entre +5v y la salida del sensor.

SoftwareEl micro ha sido programado en lenguaje C, concretamente el código está realizado en

CCS. Utilizamos dos rutinas proporcionadas por este compilador para manejar el teclado matricial y el LCD. Hemos modificado las rutinas para que usen el puerto B, en el caso del teclado matricial y para que usen 8 bits para control del LCD a través del puerto B, para el LCD.

Básicamente el programa utiliza el TIMER0 como contador de eventos de nivel bajo a alto que son introducidos por RA4 procedentes del sensor HALL.

Page 2: Contador de vueltas para bobinadora.docx

Inicialmente el programa inicializa el teclado, el LCD, pone RA4 como entrada y el resto como salidas. Es necesario activas las resistencias de pull-up asociadas al puerto RB.

Tras inicializar el TIMER_0 para que cuente eventos por el pin RA4 en los flancos de bajo a alto, entramos en un bucle en el que se esperan órdenes desde el teclado.

En primer lugar se muestra en el LCD un mensaje del proyecto, el cual saltaremos tras pulsar cualquier tecla.

Esto da paso al menú de opciones del sistema:

Page 3: Contador de vueltas para bobinadora.docx

Elegiremos una de las opciones pulsando en el teclado numérico 1 ó 2. La opción 1 permite controlar el motor con start/stop y contar los pulsos que le llegan por el sensor.

La opción 2 nos habilita el teclado para introducir el valor de cuenta en el cual se debe parar el motor. Tras introducir este valor, con la tecla start/stop se pone en marcha el motor parando cuando se haya llegado al final de la cuenta.

Se puede salir de cualquier menú pulsando la tecla ‘#’. Si en el menú principal pulsamos la tecla ‘#’ el micro entra en estado sleep y no se vuelve a ejecutar el programa hasta que reseteamos el micro con el pulsador.

La tecla ‘*’ en cualquiera de los menús 1 ó 2, es la encargada de la función start/stop, es decir, al pulsarla por primera vez acciona el relé que alimenta al motor y al pulsarla por segunda vez para el motor. Esto sirve para un control manual de la bobinadora, puesto que puede ocurrir que el hilo se atasque, se rompa u otros percances, que requieren parar el motor y volverlo a poner en marcha una vez solucionado.

Page 4: Contador de vueltas para bobinadora.docx

Primero se hizo todo el proyecto en la placa MicroPic Trainer, de hay que en los comentarios del programa se adjunta el estado de los interruptores para que funcione correctamente el teclado y el LCD.

Tras la depuración del proyecto hemos hecho un circuito impreso cuya imagen adjuntamos más adelante.

// Debe recordarse que las líneas RA0-RA2 actúan ahora como salida de // señales de control hacia el LCD. Al estar conectadas con sendos interruptores// en la MicroPIC Trainer, estos deben estar a nivel lógico "1" permanentemente, // es decir en la posición marcada como 0 en la placa// Datos del LCD conectado al puerto B// Teclado conectado al puerto B: Columna 0,1,2 a B5,B6 y B7. // Fila 0,1,2 y 3 a B1, B2,B3 y B4// RA3 conecto la salida para el motor. En un principio funciona como salida // de enable. Se puede estudiar posibilidad de implementar un control PWM // para la velocidad. RA4 entrada para el Timer0#include#include

#FUSES NOWDT //No Watch Dog Timer#FUSES XT#FUSES NOPUT //No Power Up Timer#FUSES NOPROTECT#use delay(clock=4000000)

#use fast_io(A)#use fast_io(B)

#bit puertoA3 = 5.3 //Usado para control on/off motor

void menu1(void);void menu2 (void);int16 contar(void);int16 introducir_valor(void);

char cadena1[]={"f1-Contar Vueltn2-Introd. Vuelt"};int desbordamiento=0;

void main(){ char caracter; port_b_pullups(TRUE); lcd_init(); kbd_init(); set_tris_a(0x10); //A4 como entrada puertoA3=0; //inicializo motor con 0 //lcd_enviar(LCD_COMANDO,LCD_CURSOR_BLINK); No activo cursor ni blinker

setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1); printf (lcd_putc,"Contador de Pulsosn By Rober ",);

do caracter=kbd_getc(); while (caracter=='�'); printf(lcd_putc,"%s",cadena1); while (1){ caracter=kbd_getc();

Page 5: Contador de vueltas para bobinadora.docx

switch (caracter) { case '1': desbordamiento=0; set_timer0(0); menu1(); printf(lcd_putc,"%s",cadena1); break; case '2': desbordamiento=0; set_timer0(0); menu2(); printf(lcd_putc,"%s",cadena1); break; case '*': printf(lcd_putc,"f BY BY"); sleep(); }};

}

int16 contar(){int cuenta=0;int16 n;

cuenta=get_timer0();

if (cuenta==255){set_timer0(0);desbordamiento++;}n=256*desbordamiento+cuenta;

lcd_gotoxy(10,2);printf(LCD_PUTC,"%Lu",n);

return(n);}

void menu1(){char caracter;int contador_parcial=0;int motor_off=1;int tecla_enter=0; //control de la tecla asterisco pulsada primera vez=1, pulsada otra vez =0printf(lcd_putc,"f* Motor On/offn# salir");

do{caracter=kbd_getc();

switch (caracter){case '*':if (tecla_enter==0)

Page 6: Contador de vueltas para bobinadora.docx

{printf(lcd_putc,"fMotor ONn cuenta:");set_timer0(contador_parcial);tecla_enter=1;motor_off=0;set_tris_a(0x10);puertoA3=1; //activo motor}else{lcd_gotoxy(1,1);contador_parcial=get_timer0();printf(lcd_putc,"Motor OFF");motor_off=1;tecla_enter=0;set_tris_a(0x10);puertoA3=0; // motor apagado}break;case '#':tecla_enter=0;motor_off=1;set_tris_a(0x10);puertoA3=0;break;}

if (tecla_enter)contar();}while (caracter!='#');}

int16 introducir_valor(){char caracter;char numeros[6];int contador_caracter=0;int16 vueltas;

printf(lcd_putc,"fN. Vueltas (4cifras)n ");

lcd_enviar(LCD_COMANDO,LCD_CURSOR_ON); // activo cursor y blinker

do{

caracter=kbd_getc();

if (caracter!='�'){printf(lcd_putc,"%c"caracter);numeros[contador_caracter]=caracter;contador_caracter++;}}while (caracter!='#'&&contador_caracter<=4);numeros[contador_caracter]='�';vueltas=atol(numeros);

Page 7: Contador de vueltas para bobinadora.docx

lcd_enviar(LCD_COMANDO,LCD_CLEAR);lcd_enviar(LCD_COMANDO,LCD_HOME);

printf(lcd_putc,"f* Motor On/offn# salir");return (vueltas);}

void menu2(){char caracter;int16 vueltas;int motor_off=1;int tecla_enter=0; //*es la tecla enter y asi controlo si la he pulsado 1 o ninguna vez

int16 n;

vueltas=introducir_valor();

do{caracter=kbd_getc();

switch (caracter){case '*':if (tecla_enter==0){tecla_enter=1;motor_off=0;printf(lcd_putc,"fON Fin: %Luncuenta:",vueltas);set_tris_a(0x10);puertoA3=1; //Activo motor}else{lcd_gotoxy(1,1);printf(lcd_putc,"Off Fin: %Lun cuenta:",vueltas);motor_off=1;tecla_enter=0;set_tris_a(0x10);puertoA3=0; //motor apagado}break;case '#':tecla_enter=0;motor_off=1;set_tris_a(0x10);puertoA3=0; //motor apagadobreak;}

if (tecla_enter){n=contar();

if (vueltas==n) /*debo parar motor*/{motor_off=2; /*Usado para salir de la función*/

Page 8: Contador de vueltas para bobinadora.docx

set_tris_a(0x10);puertoA3=0; //apago motor}}}while (caracter!='#'&&motor_off!=2);if (motor_off==2){printf(lcd_putc,"fSe han Bobinado: n %Lu Vueltas",n);docaracter=kbd_getc();while (caracter=='�');}}

PCB

Adjuntamos el PCB construido para montar toda la circuitería:

El montaje final del proyecto se muestra en las siguientes imágenes:

Espero que este artículo te haya sido de utilidad. Si es así te agradecería que lo comentaras en nuestro foro.

Page 9: Contador de vueltas para bobinadora.docx

teclado 4x4 en el puerto D en....ccs c Junio 27, 2009, 10:37:54

Hola a todos soy nuevo en el foro, pero me parece grandioso todo esto, nota un nivel alto a nivel de usuario, espero poder aportar alguna cosita que sepa y tengan dudas como también poder solicitar su ayuda en más de una vez.

Bueno estoy aquí por que he echo un pequeño código en CCS C para el pic 16f877a donde manejo un teclado matricial 4x4, pero el punto es que me quedo muy robusto y no se como hacer que quede mas presentable y que no tenga que consumir tanto tiempo en leer líneas, si me pudieran ayudar a mejorarlo seria de gran ayuda. por otra parte no puedo ocupar el puerto A por que lo tengo configurado para otras cosas, el B lo tengo para el manejo de una LCD 20x4 y parte del puerto C estoy ocupando los 2 CCP por ende me esta quedando solo el puerto D libre y el C en parte, bueno les dejo el para ver si me pueden echar una manito. De antemano gracias.

Código:#include <16F877a.h>#device adc=10#FUSES NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT #use delay (clock=20000000) //Fosc=20Mhz#define use_portb_lcd TRUE //definir salida del puerto B para la lcd#include<lcd.c> //libreria manejo lcd#use standard_io(D)

int i,j,x;char Teclas[4][4]={{'1','2','3','A'}                   {'4','5','6','B'}                   {'7','8','9','C'}                   {'D','0','E','F'}};void main(){ lcd_init();         //inicializa lcd while(TRUE){ i++; switch( i ) { case 1: output_high(PIN_D4);      output_high(PIN_D5); output_high(PIN_D6); output_low(PIN_D7); break; case 2: output_high(PIN_D4);      output_high(PIN_D5); output_low(PIN_D6); output_high(PIN_D7); break; case 3: output_high(PIN_D4);      output_low(PIN_D5); output_high(PIN_D6); output_high(PIN_D7); break; case 4: output_low(PIN_D4);      output_high(PIN_D5); output_high(PIN_D6); output_high(PIN_D7);

Page 10: Contador de vueltas para bobinadora.docx

break; case 5: break; default: }if(i==5){i=0;}if(!input(PIN_D0)){j=0;x=i;}if(!input(PIN_D1)){j=1;x=i;}if(!input(PIN_D2)){j=2;x=i;}if(!input(PIN_D3)){j=3;x=i;}printf(lcd_putc,"tecla:%c",Teclas[j][x]);                  //...presentacionlcd_gotoxy(1,1);}}

Bueno les dejo la simulación en proteus + el código en C + el hex...

  teclado 4x4 pull-up.rar (18.21 KB - descargado 443 veces.)

darck_khronos Respuesta #1: Junio 28, 2009, 12:06:56

Porqué no usas la librería kdb y combinas tu display y tu teclado en el mismo puerto

Suky Respuesta #2: Junio 28, 2009, 12:17:05

No creo que sea necesario usar un mismo puerto para los 2. Yo cambiaría el LCD al puerto D, y aprovecharía la interrupción por cambio de estado en RB4-RB7 para detectar la pulsación de alguna tecla.

Código: (c)#use fast_io(b)

char Teclas[17]={'1','2','3','A',                         '4','5','6','B',                         '7','8','9','C',                         'D','0','E','F',' '};

char Tecla;

void main(){   set_tris_b(0xF0);   output_b(0x00);   enable_interrupts(INT_RB);   enable_interrupts(GLOBAL);

}

#int_RBvoid  RB_isr(void) {   Tecla=TestTeclado(); //Testea la Tecla Pulsada.-   printf("Tecla=%c",Tecla);   output_b(0x00); // Se puede usar interrupción por RB4-RB7, y con esto queda                   // en espera de una proxima interrupcion.-}

int TestTeclado(void){   int i,j,Filas;   Filas=0x0E; //xxxx1110.   output_b(Filas);   i=0;   for(j=0;j<4;j++){

Page 11: Contador de vueltas para bobinadora.docx

      if(input(PIN_B4)==0){break;}      i++;      if(input(PIN_B5)==0){break;}      i++;      if(input(PIN_B6)==0){break;}      i++;      if(input(PIN_B7)==0){break;}      i++;      //rotate_left(&Filas,1);      shift_left(&Filas,1,1);      output_b(Filas);   //Trasladamos el 0 a siguiente Pin.   }   return(Teclas[i]);}

darck_khronos Respuesta #3: Junio 28, 2009, 12:28:20

Apoyo lo que comenta Suky y de paso activas las pullUps

japifer_22 Respuesta #4: Junio 28, 2009, 12:55:12O gran maestro suky aki = me lo encuentro y siempre ayudándome en todo gracias.lo que pasa que e intentado activar la LCD 16x2 y me funciona bien pero al cambiarla a 20x4 no me funciona y no se porque por eso tuve que ingeniármela en hacer eso ^^ saludos

darck_khronos Respuesta #5: Junio 28, 2009, 01:01:00 Cita de: japifer_22 en Junio 28, 2009, 12:55:12 o gran maestro suky aqui igual me lo encuentro y siempre ayudándome en todo gracias.Lo que pasa que e intentado activar la LCD 16x2 y me funciona bien pero al cambiarla a 20x4 no me funciona y no se porque por eso tuve que ingeniármela en hacer eso ^^ saludos

Por si aun lo intentas con la de 16x2 aquí te dejo un diagrama para conectar la lcd y el teclado

japifer_22 Respuesta #6 : Junio 28, 2009, 01:11:43

suky te comento que yo tengo una rutina que hice con las librerías de keypad y me funciona, activar el teclado con el puerto B y la LCD 16x2 en el puerto D, pero a la hora de pasar la LCD a 20x4 no me funciona y se queda en el puerto B la función de esta misma, en conjunto con la función del teclado pero el punto que aquí hacen cortocircuito. saludos

Código:

Page 12: Contador de vueltas para bobinadora.docx

#include <16F877a.h>#device adc=10#FUSES NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT #use delay (clock=20000000) //Fosc=20Mhz#define use_portd_lcd TRUE //definir salida del puerto D para la lcd#include<lcd.c> //libreria manejo lcd

#include <keypad.c>   //Libreria de teclado 4x4

unsigned char key;   //Variable global tecla

// Interrupcion RB4 - RB7 /////////////////////////////////////////////////////

#INT_RBvoid interrupt_keypad()               {   key=read_keypad();         //Asigna la tecla pulsada   clear_interrupt(INT_RB);   //Limpia bandera RBIF

   lcd_putc('\f');            //   lcd_gotoxy(1,1);         //Visualiza en el lcd   lcd_putc(key);            //                           }

// Programa Principal /////////////////////////////////////////////////////////

void main() {   init_keypad();   lcd_init();

   lcd_putc("\fEsperando...");

   while(true)   {   }   }

japifer_22 Respuesta #7: Junio 28, 2009, 01:13:20

Hola darck_khronos gracias por la ayuda pero el puerto A lo tengo ocupado saludos

Suky Respuesta #8: Junio 28, 2009, 01:19:17

japifer_22, adjunta la librería de 20x4 para ver como cambiar de puerto.darck_khronos, en el esquemático que has colocado veo un led en RA5, y este pin no tiende driver de salida, se puede usar como entrada o como Mclr.

japifer_22 Respuesta #9: Junio 28, 2009, 02:42:25

Hola suky aquí te dejo la librería mas mi simulación en proteus + el C + el hex de mi programa.. Gracias salu2s

  para suky.rar (33.52 KB - descargado 246 veces.)

japifer_22 Respuesta #10: Junio 28, 2009, 02:49:06

Hola me equivoque te pase la librería del keypad aquí esta la lcd420

Page 13: Contador de vueltas para bobinadora.docx

  para suky.rar (35.1 KB - descargado 155 veces.)

Suky Respuesta #11: Junio 28, 2009, 11:14:45

Cita de: japifer_22 en Junio 28, 2009, 02:42:25 Hola suky aquí te dejo la librería mas mi simulación en proteus + el C + el hex de mi programa.. Gracias salu2s

Adjunto la librería modificada, y además de otra que es mucho más flexible para otra ocasión.

  Libreria Modificada.rar (14.46 KB - descargado 264 veces.)

japifer_22 Respuesta #12: Junio 28, 2009, 03:20:06

Muchísimas gracias suky me funciona de maravilla te pasaste una vez mas dándome la solución a mis problemas gracias.

japifer_22 Respuesta #13: Junio 28, 2009, 04:28:45

Estaba pensado,..... Como hago para formar un valor de dos o mas dígitos con la keypad, o por ejemplo con decimal, me refiero a que como hago por ejemplo el numero 10.5 con la keypad y que aparezca en la lcd ese numero, si solo yo pulso el 1 el 0 el ... y el 5 como uno todo eso para formar

un numero nomas ?.

Ariel Respuesta #14: Junio 28, 2009, 04:41:49

Hola!usa una variable, y haces algo así como

Variable = 0Variable = variable + 1erdigito x 10Variable = variable + 2erdigitoVariable = variable + 3erdigito/10

Eso si, respetando los tipos, y la sintaxis de C .  Saludos!

japifer_22 Respuesta #15: Junio 28, 2009, 04:53:54

Hola ariel vi tu trabajo con la calculadora excelente te felicito....bueno vamos a ver que tal anda lo que me dijiste salu2s

Suky Respuesta #16: Junio 28, 2009, 05:17:57

Otra forma seria ir guardando en un string:

char String[5];char Tecla;int i;float Valor;

i empezaría en 0, así que por ejemplo al pulsar 12.35. Cada vez que se recibe un numero se guarda:

Tecla=test_teclado();String[ i ]=Tecla;i++;

i se resetearía cuando se presiona, +, -, *, /,=, etc. Al terminal se recibir quedaría:

String={1,2,.,3,5}Y para pasarlo a float:Valor=atof(String);  

Para esto ultimo hay que incluir la librería #include <stdlib.h>

Page 14: Contador de vueltas para bobinadora.docx

japifer_22 Respuesta #17: Junio 28, 2009, 05:43:37 Hola suky la línea donde dice Tecla=test_teclado(); me arroja que no esta definida por que.

Suky Respuesta #18: Junio 28, 2009, 06:01:38

Cita de: japifer_22 en Junio 28, 2009, 05:43:37 Hola suky la línea donde dice Tecla=test_teclado(); me arroja que no esta definida por que

Eso es un ejemplo! Creo que tu utilizas read_keypad(); 

japifer_22 Respuesta #19: Junio 29, 2009, 12:35:

Ups XD jijijij. Bueno, ya entendí lo que mencionas pero ahora tengo la gran duda e intentado hacer que solo al presionar una tecla del keypad vaya aumentando en uno el i++ pero no logro hacer esto. O sea supuestamente cada tecla que yo pulse se va guardando en el String y por eso es el i++ para que valla corriendo un espacio y valla guardando en este caso el numero que yo le asigno y me lo arroje como un todo (esto dependiendo de cuantos números apreté), pero no logro que solo cuando se presione una tecla del keypad me aumente el i++, como hago eso

Suky Respuesta #20: Junio 29, 2009, 01:47:04

No se donde estarás colocando el i++, seguramente después tienes una i=0; que te elimina el paso anterior.

japifer_22 Respuesta #21: Junio 29, 2009, 02:19:10

  No entiendoooooo       A ver no hace lo que quiero lo tengo configurado mal e estado todoo este rato intentando que salga algo pero nada. ya mira ayudaaaa pliss...... el teclado está de esta manera:   char keypad[4][4] =   { {'1','2','3','A'},                           {'4','5','6','B'},                           {'7','8','9','C'},                           {'.','0','F','D'} };

entonces presiona la A y accedo al teclado o sea puedo hacer uso de todos los números, luego por ejemplo quiero escribir el numero 10.5, una ves escrito esto vuelvo a presionar la A o la B da lo mismo, y se me bloquea de nuevo el teclado solo números o sea del 0 al 9 y el ., y el numero 10.5 guardarlo en una variable para poder hacer cosas aritméticas con el, pero adentro del pic y también poder visualizar en la lcd el digito creado que en este caso el 10.5 y eso es todo. Pero los números que tengo que crear puede ser tanto entero o decimal que va desde el 0 al 25 donde en numero puede tener no mas de 2 decimales o sea 2.22, 5.53, 20, etc.

Lo único que e podido hacer y que me funciona es visualizar las teclas pulsadas...

Código:#include <16F877a.h>#device adc=10#FUSES NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT #use delay (clock=20000000) //Fosc=20Mhz#define use_portd_lcd TRUE //definir salida del puerto D para la lcd#include<lcd420.c> //libreria manejo lcd#include <keypad.c>   //Libreria de teclado 4x4 #include <stdlib.h>

unsigned char key;   //Variable global teclachar variable=0;

char String[5];char Tecla;int i;float Valor;// Interrupcion RB4 - RB7 /////////////////////////////////////////////////////

Page 15: Contador de vueltas para bobinadora.docx

#INT_RBvoid interrupt_keypad()               {   key=read_keypad();         //Asigna la tecla pulsada   clear_interrupt(INT_RB);   //Limpia bandera RBIF   }// Programa Principal /////////////////////////////////////////////////////////void main() {      lcd_init();i=0;   while(true)   {     init_keypad();   variable=key;   printf(lcd_putc,"tecla: %c",variable);    lcd_gotoxy(1,1);

   }}Espero que me puedas ayudar maestroPD:{maldito hobby me quita demasiado time jijijiji, pero de todas formas gracias suky por todo lo que mas ya ayudado un gran abrazo}

Suky Respuesta #22: Junio 29, 2009, 11:35:48

Esta es una manera de hacerlo, no lo simule para ver si realmente funciona pero debería  

Código: (c)#include <16F877a.h>#device adc=10#FUSES NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT #use delay (clock=20000000) //Fosc=20Mhz#define use_portd_lcd TRUE //definir salida del puerto D para la lcd#include<lcd420.c> //libreria manejo lcd#include <keypad.c>   //Libreria de teclado 4x4 #include <stdlib.h>

unsigned char key;   //Variable global teclachar variable=0;int1 kbhit_tecla=0;  // Para saber si se ha pulsado alguna tecla.int1 NuevoIngreso=1;  // Indica que es el primer ingreso, así que borra pantalla antes de imprimir.char String[5];int i;float Valor;

// Interrupcion RB4 - RB7 /////////////////////////////////////////////////////

#INT_RBvoid interrupt_keypad()               {   key=read_keypad();         //Asigna la tecla pulsada   if(key!='D'){             // Hay que establecer una tecla o algo que te de

// por terminado el ingreso de datos      String[ i ]=key;      i++;      kbhit_tecla=1;             // Hay un nuevo caracter a imprimir.   }else{      Valor=atof(String);       // Se pulso tecla D, como un "enter", // así que guardamos dato, y indicamos

// que al llegar...       NuevoIngreso=1;         // ...otro dato se borre pantalla, como una

Page 16: Contador de vueltas para bobinadora.docx

// calculadora. Y reseteamos i.      i=0;   }                                     clear_interrupt(INT_RB);   //Limpia bandera RBIF   }// Programa Principal /////////////////////////////////////////////////////////void main() {      lcd_init();   init_keypad();   i=0;      while(true)   {       if(kbhit_tecla=1){   // Se ha pulsado alguna tecla?           if(NuevaTecla==1){               lcd_putc("\f");      // Borro pantalla.-               NuevaTecla=0;           }           kbhit_tecla=0;           printf(lcd_putc,"tecla: %c",key); // Imprimimos la Tecla pulsada   }}

Cita de: japifer_22 en Junio 29, 2009, 02:19:10 PD:{maldito hobby me quita demasiado time jijijiji, pero de todas formas gracias suky por todo lo que mas ya ayudado un gran abrazo }

Y si esto lleva mucho tiempo  

japifer_22 Respuesta #23: Junio 29, 2009, 03:50:43

Ya ahora si no te molesto mas parece que tengo casi casi lo que estoy asiendo hago unas pruebas más y lo público muchas gracias por todo suky.

marqueses Respuesta #24: Julio 03, 2009, 04:09:56

Hola!, no sé si llego tarde y ya tendrás tu proyecto montado jejeje. Mira, yo para manejar el teclado de 4x4 he utilizado una librería que encontré en la red con el nombre de kbdd.c y me funciona a las mil maravillas. Luego, para mostrar un número por pantalla con decimales cada uno supongo que tendrá sus trucos. Yo creé dos funciones, una para ir introduciendo números por pantalla, y con tres teclas de control, el * lo utilizaba para borrar el ultimo numero introducido, la A para introducir la coma y # para validar el numero y salir de la función. Y luego cuando ya se validaba el numero, cree otra función que lo que me hacia era captar el numero de la LCD, comprobando si era coma o no. Si era coma en lugar de multiplicarlo por 10 y sumarle el valor acumulado, lo dividía por 10. Espero haberme explicado suficientemente bien 

japifer_22 Respuesta #25: Julio 05, 2009, 01:18:01

Hola gracias por el comentario........ suky probé tu programa pero no hace nada..... es que lo que estoy asiendo es algo parecido a un calculadora, ó sea que a medida que aprieto un numero esto se visualice en la lcd, y si aprieto mas de un numero = que se visualice el digito o sea aprieto 1 y después 2 y después 3 ... ect, ect, ec. Se valla viendo en la pantalla como un numero o sea 123 y además que este numero me quede en una sola variable. No te miento que ya estoy apunto de rendirme con este proyecto no pensé que fuera tan complicado hacer esto, lo he echo multiplicando decena, centena y bla bla bla pero el programa me sale demasiado largo y esa no es la idea, la idea de esto es ahorrar lo mas posible de líneas. Desde tu ultimo pos te intentado hacer esto pero nada. Por favor oriéntenme como hacer esto plisssssssssss.

marqueses Respuesta #26: Julio 05, 2009, 05:50:29 Hola, creo que hacerte con lo que necesitas, ya que tu problema fue exactamente igual que el que yo tuve 

Page 17: Contador de vueltas para bobinadora.docx

Te pongo una función que muestra por pantalla el numero que vas introduciendo por teclado, y posee tres teclas de control, el * para borrar el ultimo numero introducido, la A para introducir la coma y # para validar el numero que se ha introducido. Una vez que pulses almohadilla se sale de la función, pero tendrás el numero en pantalla, solo tienes que ir capturando uno a uno e ir creando el numero. Si sigues teniendo problemas ya avisas!! 

Código:////////////////////////////////////////////////////////////////////////////////////////////////////////////////Tecla_pulsada/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Función: Muestra por pantalla el valor del numero que se desea introducir. ////Parámetro de entrada: //// //////////////////////////////////////////////////////////////////////////////////////

void Tecla_pulsada (){   int Teclan, coma=0,salir;   char Teclac;               //INTRODUCCION DE VALOR           while(salir==0){   do{      Teclac=kbd_getc();    clac=='\0');  Teclan=Teclac-48;       if(Teclan==-6)       printf(lcd_putc,"\b \b");// Se ha pulsado *     }   else if (Teclan==17)// Se ha pulsado ,     {      if(coma==1)    {          break;           }      else          {         coma=1;          printf(lcd_putc,",");         }      }   else if  (Teclan==-13) // Se ha pulsado #     {       salir=1;     }   else     {      printf(lcd_putc,"%d",Teclan);     }  }}

Suky Respuesta #27: Julio 05, 2009, 11:37:40Cita de: japifer_22 en Julio 05, 2009, 01:18:01 hla gracias por el comentario........ suky probe tu programa pero no hace nada..... esque lo que estoy asiendo es algo paresido a un calculadora, osea que amedida que aprieto un numero esto se visualise en la lcd, y si aprieto mas de un numero = que se visualise el digito osea aprieto 1 y despues 2 y despues 3 ... ect.ect.ect. se valla viendo en la pantalla como un numero osea 123 y ademas que este numero me quede

Page 18: Contador de vueltas para bobinadora.docx

en una sola variable. no te miento que ya estoy apunto de rendirme con este proyecto no pensé que fuera tan complicado hacer esto, lo e echo multiplicando desena centena y bla bla bla pero el programa me sale demasiado largo y esa no es la idea, la idea de esto es ahorrar lo mas posible de líneas. Desde tu ultimo pos he intentado hacer esto pero nada. Por favor oriéntenme como hacer esto plisssssssssss.

Aclaré que el código podía no funcionar, no lo había simulado. Pero estudiándolo un poquito te dabas cuenta de porque no funcionaba, por ejemplo, no habilité la interrupción por RB4-RB7, me equivoque en el nombre de una variable, me faltaba un else, etc... Modificando eso funciona correctamente.Saludos!

japifer_22 Respuesta #28: Julio 05, 2009, 07:12:16

Hola otra vez bueno te comento suki que si me había dado cuenta de la variable que tenias mal y la arregle y también active la interrupción pero no encuentro el lugar donde dices que tiene que ir el else me lo puedes señalar por favor, y lo otro estoy teniendo un problema de compilación, por que parece o sea es mi idea que no me detecta el kbhit........

Código:#INT_RBvoid interrupt_keypad()               {   key=read_keypad();         //Asigna la tecla pulsada   if(key!='D'){             // Hay que establecer una tecla o algo // que te de por terminado el ingreso de datos      String[ i ]=key;      i++;      kbhit_tecla=1;             // Hay un nuevo caracter a imprimir.   }else{      Valor=atof(String);       // Se pulso tecla D, como un "enter", así que // guardamos dato, e indicamos que al llegar...       Nuevatecla=1;          // ...otro dato se borre pantalla, como una // calculadora. Y reseteamos i.      i=0;   }                                     clear_interrupt(INT_RB);   //Limpia bandera RBIF   }// Programa Principal /////////////////////////////////////////////////////////void main() {      lcd_init();   enable_interrupts(INT_RB);       //interrupcion INT_RB activada   disable_interrupts(GLOBAL);      //todas las interrupciones desactivadas   init_keypad();   i=0;      while(true)   {       if(kbhit_tecla=1){    // Se ha pulsado alguna tecla?           if(NuevaTecla==1){               lcd_putc("\f");    // Borro pantalla.-               NuevaTecla=0;           }           kbhit_tecla=0;           printf(lcd_putc,"tecla: %c",key); // Imprimimos la Tecla pulsada        }}

Ha y marqueses gracias por el programa lo voy a probar..........

japifer_22 Respuesta #29: Julio 05, 2009, 08:35:37

Hola suky bueno ahora mee funciono el programa bien, gracias.