Вы находитесь на странице: 1из 19

Contador de vueltas para bobinadora

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

17 octubre, 2010 Este proyecto que nos enva el amigo Roberto Gonzlez, tiene como objetivo contar las vueltas que da un motor por medio de un sensor de efecto Hall, usndolo para bobinar transformadores. El sistema puede funcionar de dos formas: una es contar las vueltas del motor y otra de ellas es indicarle el nmero de vueltas que tiene que dar. De esta forma podemos desbobinar un transformador y saber el nmero de vueltas que tiene la bobina y/o bobinar un nmero de vueltas determinado, alcanzado ste nmero de vueltas se corta la alimentacin del motor. Al iniciar el sistema entramos en un men en el cual podemos seleccionar la opcin deseada. Al circuito se le pueden dar otro tipo de aplicaciones, teniendo presente que est diseado para contar.

Circuito
El ncleo 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 ms 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 ms econmico que el 16F84. El microcontrolador cuenta los pulsos proporcionados por un sensor de efecto Hall. Para ello debemos aadir al motor que elijamos, un pequeo imn 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 elctrico de los que se desechan porque las bateras ya no sirven. El atornillador le he conectado a una fuente de alimentacin externa que le impulsa. Por otro lado e independiente de la alimentacin del motor, se usa otra alimentacin para la electrnica asociada al PIC. Esto se ha hecho as porque en una primera aproximacin vimos que los picos que generaba el motor (consume bastante corriente) se introducan en la electrnica y generaban comportamientos indeseados. A raz de esta experiencia, se decidi aadir un optoacoplador para aislar la electrnica del rel que da paso a la alimentacin del motor. Como interface con el usuario se ha puesto un teclado matricial de 43 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 magntico, es un sensor del tipo switch. La salida del sensor es mosfet con drenador abierto, por eso el aadir una resistencia entre +5v y la salida del sensor.

Software
El micro ha sido programado en lenguaje C, concretamente el cdigo 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 travs del puerto B, para el LCD. Bsicamente el programa utiliza el TIMER0 como contador de eventos de nivel bajo a alto que son introducidos por RA4 procedentes del sensor HALL.

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:

Elegiremos una de las opciones pulsando en el teclado numrico 1 2. La opcin 1 permite controlar el motor con start/stop y contar los pulsos que le llegan por el sensor.

La opcin 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 mens 1 2, es la encargada de la funcin 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.

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 depuracin del proyecto hemos hecho un circuito impreso cuya imagen adjuntamos ms adelante. // Debe recordarse que las lneas RA0-RA2 actan ahora como salida de // seales de control hacia el LCD. Al estar conectadas con sendos interruptores // en la MicroPIC Trainer, estos deben estar a nivel lgico "1" permanentemente, // es decir en la posicin 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();

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 =0 printf(lcd_putc,"f* Motor On/offn# salir"); do { caracter=kbd_getc(); switch (caracter) { case '*': if (tecla_enter==0)

{ 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);

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 apagado break; } if (tecla_enter) { n=contar(); if (vueltas==n) /*debo parar motor*/ { motor_off=2; /*Usado para salir de la funcin*/

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); do caracter=kbd_getc(); while (caracter==''); } }

PCB
Adjuntamos el PCB construido para montar toda la circuitera:

El montaje final del proyecto se muestra en las siguientes imgenes:

Espero que este artculo te haya sido de utilidad. Si es as te agradecera que lo comentaras en nuestro foro.

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 tambin poder solicitar su ayuda en ms de una vez. Bueno estoy aqu por que he echo un pequeo cdigo 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 lneas, 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.

Cdigo:
#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);

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]); lcd_gotoxy(1,1); }} Bueno les dejo la simulacin en proteus + el cdigo en C + el hex...

//...presentacion

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 librera 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 cambiara el LCD al puerto D, y aprovechara la interrupcin por cambio de estado en RB4-RB7 para detectar la pulsacin de alguna tecla. Cdigo: (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_RB void RB_isr(void) { Tecla=TestTeclado(); //Testea la Tecla Pulsada.printf("Tecla=%c",Tecla); output_b(0x00); // Se puede usar interrupcin 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++){ 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:12 O gran maestro suky aki = me lo encuentro y siempre ayudndome 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 ingenirmela 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 ayudndome 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 ingenirmela 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 libreras 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 funcin de esta misma, en conjunto con la funcin del teclado pero el punto que aqu hacen cortocircuito. saludos Cdigo:
#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_RB void interrupt_keypad() { key=read_keypad(); clear_interrupt(INT_RB); lcd_putc('\f'); lcd_gotoxy(1,1); lcd_putc(key); }

//Asigna la tecla pulsada //Limpia bandera RBIF // //Visualiza en el lcd //

// 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 librera de 20x4 para ver como cambiar de puerto. darck_khronos, en el esquemtico 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 librera mas mi simulacin 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 librera del keypad aqu esta la lcd420 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 librera mas mi simulacin en proteus + el C + el hex de mi programa.. Gracias salu2s

Adjunto la librera modificada, y adems de otra que es mucho ms flexible para otra ocasin. Libreria Modificada.rar (14.46 KB - descargado 264 veces.) japifer_22 Respuesta #12: Junio 28, 2009, 03:20:06 Muchsimas gracias suky me funciona de maravilla te pasaste una vez mas dndome la solucin 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 dgitos 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 Variable Variable Variable = = = = 0 variable + 1erdigito x 10 variable + 2erdigito 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 empezara 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 reseteara cuando se presiona, +, -, *, /,=, etc. Al terminal se recibir quedara: String={1,2,.,3,5} Y para pasarlo a float: Valor=atof(String); Para esto ultimo hay que incluir la librera #include <stdlib.h>

japifer_22 Respuesta #17: Junio 28, 2009, 05:43:37

Hola suky la lnea 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 lnea 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 nmeros 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 estars colocando el i++, seguramente despus 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 nmeros, 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 nmeros o sea del 0 al 9 y el ., y el numero 10.5 guardarlo en una variable para poder hacer cosas aritmticas con el, pero adentro del pic y tambin poder visualizar en la lcd el digito creado que en este caso el 10.5 y eso es todo. Pero los nmeros 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... Cdigo:
#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; char variable=0; //Variable global tecla

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

void interrupt_keypad() { key=read_keypad(); clear_interrupt(INT_RB);

//Asigna la tecla pulsada //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 maestro PD:{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 debera Cdigo: (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 tecla char 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_RB void interrupt_keypad() { key=read_keypad(); if(key!='D'){ String[ i ]=key; i++; kbhit_tecla=1; }else{ Valor=atof(String); NuevoIngreso=1;

//Asigna la tecla pulsada // Hay que establecer una tecla o algo que te de // por terminado el ingreso de datos // Hay un nuevo caracter a imprimir. // Se pulso tecla D, como un "enter", // as que guardamos dato, y indicamos // que al llegar... // ...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(); 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 ms y lo pblico muchas gracias por todo suky. marqueses Respuesta #24: Julio 03, 2009, 04:09:56 Hola!, no s si llego tarde y ya tendrs tu proyecto montado jejeje. Mira, yo para manejar el teclado de 4x4 he utilizado una librera que encontr en la red con el nombre de kbdd.c y me funciona a las mil maravillas. Luego, para mostrar un nmero por pantalla con decimales cada uno supongo que tendr sus trucos. Yo cre dos funciones, una para ir introduciendo nmeros 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 funcin. Y luego cuando ya se validaba el numero, cree otra funcin 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 divida 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 despus 2 y despus 3 ... ect, ect, ec. Se valla viendo en la pantalla como un numero o sea 123 y adems 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 lneas. Desde tu ultimo pos te intentado hacer esto pero nada. Por favor orintenme 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

Te pongo una funcin 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 funcin, pero tendrs el numero en pantalla, solo tienes que ir capturando uno a uno e ir creando el numero. Si sigues teniendo problemas ya avisas!! Cdigo:
/////////////////////////////////////////////////////////////////////////////// / ////////////////////////////////Tecla_pulsada////////////////////////////////// / /////////////////////////////////////////////////////////////////////////////// / //Funcin: Muestra por pantalla el valor del numero que se desea introducir. // //Parmetro 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:40


Cita 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

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 lneas. Desde tu ultimo pos he intentado hacer esto pero nada. Por favor orintenme como hacer esto plisssssssssss.

Aclar que el cdigo poda no funcionar, no lo haba simulado. Pero estudindolo un poquito te dabas cuenta de porque no funcionaba, por ejemplo, no habilit la interrupcin 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 haba dado cuenta de la variable que tenias mal y la arregle y tambin active la interrupcin pero no encuentro el lugar donde dices que tiene que ir el else me lo puedes sealar por favor, y lo otro estoy teniendo un problema de compilacin, por que parece o sea es mi idea que no me detecta el kbhit........ Cdigo:
#INT_RB void interrupt_keypad() { key=read_keypad(); if(key!='D'){ String[ i ]=key; i++; kbhit_tecla=1; }else{ Valor=atof(String); Nuevatecla=1; i=0; } clear_interrupt(INT_RB);

//Asigna la tecla pulsada // Hay que establecer una tecla o algo // que te de por terminado el ingreso de datos // Hay un nuevo caracter a imprimir. // // // // Se pulso tecla D, como un "enter", as que guardamos dato, e indicamos que al llegar... ...otro dato se borre pantalla, como una calculadora. Y reseteamos i.

//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.