Autor Tema: Primer proyecto y a punto de dejarlo...  (Leído 3290 veces)

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

Desconectado katyomartinez

  • PIC10
  • *
  • Mensajes: 2
Primer proyecto y a punto de dejarlo...
« en: 03 de Abril de 2015, 16:49:58 »
Buenas tardes, tengo un proyecto para la universidad en Mikrobasic que sinceramente no entiendo por donde empezar. El proyecto consta de armar en un Microcontrolador, un contador que sea programado en dos partes con dos botones que al activarlos abran una tapa y empiecen a contar con un cronómetro. El tiempo se detiene cuando la tapa cierra (botón interno activado mecánicamente por la tapa misma) y a su vez muestra el tiempo que la tapa estuvo abierta y al apretar otro botón (por ejemplo "ok") muestra el tiempo en dinero, ejemplo: "01:00:00" (una hora de apertura de la tapa) y al apretar "OK" muestra "$ 0.50" (puede ser el punto o la coma, no interesa cual de los dos sea).
Luego el programa tiene que tener otros botones que van escondidos detras de una tapa extra, que son los siguientes:
"T1" hace referencia al tiempo con Tarifa 1. Tiene que ser programable al apretarlo una sola vez y llevar al usuario a algo como ésto en el LCD "T1 00,00" (de vuelta, si es coma o punto no interesa). Cuando el usuario terminó de poner la tarifa con un botón que sea "X" puede apretar uno que se llama "SET" y fijar ese valor para "T1" y lo mismo para "T2" que es otro botón. **El botón "X" lo que hace es sumar de uno en uno en la tarifa. Ejemplo: Si apretó "X" cinco veces, en el LCD muestra lo siguiente: "T1 5,00" (coma o punto me da igual) y si la apretó veinte veces, muestra en vez del 5 un 20.
T2 es igual que T1, solo son fracciones del contador en LCD.
Luego de todo eso, hay otro botón que se llama "RESET", el mismo lo que hace es dejar el cronómetro en "CERO", o sea que empiece a contar todo de vuelta. Para aplicar el reset, lo que quiero que es que esté apretado durante cuatro segundos, o sea que el microcontrolador cuente cuatro vueltas y desde ahí ofrece resetear todo junto apretando "OK", o que directamente al tenerlo cuatro segundos, vuelvan los contadores a CERO.

¿Se podría de alguna forma que queden registros de T1 y T2? Por ejemplo en el problema dice "El tiempo debe quedar registrado si el usuario aprieta T1 durante tres segundos y mostrar el total de tiempo, tanto así como en T2". Es obvio que se puede pero ésto me supera bastante.

En fin, sería todo eso.

Espero que puedan ayudarme y si encuentran una forma mas simple de hacerlo, se los agradecería. Luego de probarlo, necesito alguno que sepa de electrónica para orientarme con el plano o circuito para ensamblar. No tengo tiempo de entregas ya que es un proyecto de la universidad para presentarme a uno del estado. Mi parte es ésta, las otras es por otro grupo de alumnos.

ÉSTO SE VE EN EL PRODUCTO SIN LA TAPA DE CONFIGURACIÓN ABIERTA. 
T 1
T 2
OK
LCD

ÉSTO ES LO QUE SE VE EN EL PRODUCTO CON LA TAPA DE CONFIGURACIÓN ABIERTA

RESET (4 SEGUNDOS) " AL APRETAR 4 SEGUNDOS RESETEA TODO EL CONTADOR DE T1 Y T2"
T1 PROGRAM
T2 PROGRAM
> SUBIR
< BAJAR
SET
LCD

Ojalá pueda hacer algo, ya tengo instalado el Mikrobasic en la computadora, uso Windows 8.1. Me falta el Proteus para hacer el circuito pero primero quiero tener el programa. O lo que me digan ustedes que es mas necesario, obviamente.
Quiero aprender mucho de éste tema!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Primer proyecto y a punto de dejarlo...
« Respuesta #1 en: 04 de Abril de 2015, 09:35:48 »
Primero que nada no entiendo por que las universidades usan BASIC cuando los fabricantes imponen C en sus compiladores, mas cuando es un lenguaje "nuevo" para el usuario y que le costaria lo mismo empezar con C que con BASIC. No es solo en tu lugar, sino en mi universidad tambien me ocurrio con un alumno de otra carrera

Tu proyecto es DEMASIADO largo.

Software:

Todo depende del PIC que tengas.
La base de tiempos podes usar un Timer con interrupciones y un cristal de 32.768 Hz, de esa forma dividiendo te aproximas lo mas cercano a lo que es 1 segundo (1/32768), tambien se volveria mas facil si el PIC presenta un timer de 16bits ya que permite contar mucho mas que uno de 8. Por que interrupciones ? por que te permite estar a la "escucha" de las entradas y el tiempo se acumula solo y con menos error. Si posee modulo CCP podrias tambien hacer que se autoresetee de esa forma se vuelve mas exacto y mas afcil el trabajo de la base de tiempos.

No me quedaron claro todavia lo de las entradas.. Cuantos botones hay ? Si haces un antirebote por hardware te complicarias menos agregando delays por software, mas cuando tenes que medir tiempos.

Deberias usar las interrupciones de cambio de nivel o flanco para al menos la tapa y el reset(este estaria bueno por flanco), de esa forma obtenes el tiempo rapida y con mas certeza que preguntando constantemente por el pin.

Sobre guardar los datos te referis a que si le cortas la alimentacion estas sigan con el mismo valor ? Si es asi tendrias que ver como grabar/leer en la EEPROM del micro.
T1 controla las unidades y T2 las fracciones, pero como reseteas ese valor ? suponete que te pasate y lo pusiste 7.50 y era 6.50, cual el maximo? sino tendrias que seguir hasta un ejemplo de 999.50 y volver a 0.

Te podria hacer un programa en lenguaje hombre, por que realmente no programo en BASIC pero te ayudaria a guiarte masomenos como es el tema.


Conf inicial:
   Aca configuro puertos entrada salida, pongo a 0 todo, creo variables etc
   Configuro timer
   Configuro interrupciones ( flanco ascendente )
   Activo interrupciones menos la del timer

Interrupcion timer (esta depende la forma que se haga segun lo que tenga el PIC, supongo timer de 16 bits + modulo CCP):
  Reseteo flag de interrupcion (el timer se pone a 0 solo)

  Estoy contando?
  Si->
     segundos = Segundos + 1
     segundos es igual a 60 ?
     SI(segundos) - >
        minuto = minuto +1
        segundo = 0
        minuto es igual a 60 ?
        SI(minuto) ->
            hora = hora +1
            minuto = 0
  Estoy midiendo el reset?
  Si->
    contador de reset + 1
  Fin interrupcion timer

Interrupcion botones(supongo solo tapa por nivel y reset por flanco, pero podrian ir todas las demas por nivel) :
  Se activo tapa?
   Si ->
        Desactivo interrupciones timer
        Activo flag de tapa ( para el programa principal )
   Se activo reset?
   Si -> es Flanco positivo ?
           Si -> 
                    contador de reset = 0
                    activo flag para la interrupcion del timer asi sabe que estoy contando
                    cambio la interrupcion a flanco descendiente
           No ->    ( significa que lo solte o sea flanco descendiente )
                    desactivo flag para que me cuente en el timer
                    contador de reset mayor a 4?  ( Si no lo es entonces no hago nada, es como si no lo hubiera presionado )
                    Si ->
                            Reseteo segundos , minutos y horas.
                            Activo flag de reset
Fin interrupcion de botones

Programa principal:
Inicio LCD

Bucle infinito -> While ,do, lo que sea.
      Esta activado el flag de tapa?
      Si ->
            Muestro hora en el micro
            Flag de tapa = 0
      Se presiono OK?
      Si ->
             Muestro el precio ( tengo que hacer lso calculos obviamente)
      Se presiono T1?
      Si ->
              Incremetno unidad de tarifa
              Muestro en LCD
              delay ? ( puede ser para que no cuente como loco cuando lo presiones apenas )
      Se presiono T2?
      Si ->
              Incremetno fracciones de tarifa
              Muestro en LCD
              delay
       Se presiono SET?
       Si->
              Guardo valores de tarifa en la EEPROM ( esto es necesario solo si necesitas que cuando se corte la tension del micro queden los valores de tarifa, solo tenes que recordar que en la EEPROM no se puede guardar constantemente, tiene ciclos de escritura limitados)
       Se activo el flag de reset?
       Si->
              muestro todo en 00:00:00
              borro flag de reset




Tu programa creo que seria algo asi aproximadamente, a lo mejor algunos errores por que no se bien los botones, pero mas ayuda no puedo darte. Si te parecio chino todo lo que dije entonces vas a tener que echarle una mirada al datasheet del microcontrolador, ahi estan explicados todos los modulos 1 por 1 aunque en ingles, sino podes buscar por internet que siemrpe hay tutoriales de los modulos y explicaciones de como funcionan, aunque sea de algun PIC similar, o directamente podes preguntar aca si te da pereza xD.

El programa no es para NADA corto. Y se puede complicar a un mas si haces una maquina de estados. Pero tal ves asi funcione exactametne como vos queres. Sin complicarsela tanto

Podria comenzar buscando ejemplos simples e intentar comprender los modulos como:

Ejemplo de timer
Ejemplo de interrupciones ( timer y entradas)
Ejemplo de LCD

Hardware

Sobre el circuito depende del micro tambien, ya que algunos poseen oscilador interno y podes sacar el pin de MCLR, de esa forma te ahorrarias algunos comopnentes externos, el LCD tambien depende de como se maneje en BASIC, si es a 4 bits o 8 bits. Hay algunos pines del integrado que solo tienen interrupciones, no son todos.

Reguladores de 5V por si lo alimentas con otra tension, sino con 5V tendrias el PIC mas algunos capacitores en la alimentacion , mas el cristal de 32k mas algunos cap para el cristal, si haces un antirebote en hw , necesiatarias una resistencia y un cap para cada boton. El lcd lleva creo que 1 resistencia para el backligth + un ptenciometro para controlar el contraste. Y esos serian todos los componentes.


Desconectado katyomartinez

  • PIC10
  • *
  • Mensajes: 2
Re: Primer proyecto y a punto de dejarlo...
« Respuesta #2 en: 04 de Abril de 2015, 21:38:34 »
Hola de vuelta, muchas gracias.

Pude ver que también podría programar todo en MikroC, me gustaría saber que beneficios me daría empezar a interiorizarme más en C. En caso de hacerlo en C, como debería comenzar? Siendo que bueno, es complicado hacerlo en Basic parece y toda la información que recopilé, ví que está 100 % en C, por ejemplo la programación del Timer, el Chip, etc.

Por cierto, también tengo el catálogo de micros y me gustaría usar un micro muy potente, el dinero no es problema en éstos días cuando ví realmente como me lo has explicado. Y gracias por el esquema del hardware, me sirvió mucho.

Voy a empezar con algo mas simple y voy a subir un diagrama de flujo básico para que entiendan mejor como funcionan los botones.

GRacias!!!! Estoy del celu se me complica je.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Primer proyecto y a punto de dejarlo...
« Respuesta #3 en: 05 de Abril de 2015, 01:08:25 »
Yo opine sobre el BASIC por exactamente eso. La mayoria de las empresas que tiene sus software de desarrollo estan en C, obviamente podes hacerlo en BASIC, si a vos te gusta ese lenguaje lo haces, pero si sos realmente nuevo en la programacion y no conoces ninguno de los lenguajes, entonces conviene C, ya sea por el soporte a todos los micros, o a que como viste la mayoria esta en C.

Respecto a los compiladores de C, hay 2 que son los mas usados, cada uno tiene su ventaja. XC8 que es el de microchip, y CCS que creo que es mikroc.

Sobre CCS tiene algunas librerias y funciones que facilitan y abstraen al usuario del hardware de algunos modulos (en parte es bueno y parte malo, ya que al encontrarse con un error hace mas dificil de debuggearlo, pero hace re corta la programacion de ese modulo). Lo cual para implementar por ejemplo un RS232 solo necesitas una linea de codigo.

XC8 (8 bits, tambien hay de 16 y 32) tiene librerias, podes usarla y puede que lleve un par mas de lineas de codigo hacer algo, pero lo bueno que es de microchip, por lo cual tiene soporte para todos los micros.

La eleccion depende exclusivamente de vos.

Sobre los micros hay una relacion entre potencia y complejidad, mientras mas potencia mas complejo de usar el micro es.
Para lo que estas pidiendo un PIC de la serie 16F o 18F (flia de 8 bits) seria mas que suficiente, obviamente tenes que buscar que tenga suficientes pines para el LCD, entradas...
Tenes mejores como los dsPIC o PIC24 (16 bits) o irte a los PIC32 (32 bits). Pero como te digo, se te complicaria mucho en el software para alguien que nunca los uso. En ves de programar 1 registro para configurar entradas tenes que hacerlo en 7 por un decir.

Asi que vas a necesitar:
Compilador ( a tu preferencia, BASIC si te exigen a eso, C es mi recomendacion y creo que la de la mayoria del foro tomando como referencia un tema que se abrio hace poco )
Programador ( la linea de 16F y 18F se pueden programar con el pickit2 o algun clon del mismo que suelen estar baratos, pero imagino que deben tener un programador en un tu universidad y te lo ahorras)
Microcontrolador:
Yo recuerdo a 4 como los MAS usados, PIC16F887 (40 pines), PIC16F628 (un poquito mas viejo, de menos pines pero bastante usado) , PIC18F4550 y PIC18F2550 ( ambos con USB el 4550 posee mas pines y memoria)
Tambien tienen diferencias de velocidad. Muchas veces por mas que sea "grande" tenga muchos pines o que vaya a mas velocidad no significa que sea mas caro (ejemplo el PIC16F84A que no tiene nada y es carisimo). Estos modelos al ser muy usados normalmente estan dentro de los baratos.
La eleccion depende de que quieras hacer vos y que modulos utilizas. Ahi esta la seleccion del micro, no tiene sentido pedir uno con USB si no lo vas a usar nunca en tu vida. Tu programa necesita: 5/6 pines para el LCD + 6 pines entradas masomenos. Asi que tal ves con uno de 18 pines te alcanza, pero si tenes mas no vas a tener problemas y te aseguras de no quedarte corto en pines o tener que hacer algun arreglo para soportar mas pines. Luego lo podes usar para otro proyecto.
« Última modificación: 05 de Abril de 2015, 01:13:50 por KILLERJC »

Desconectado Daikataro

  • PIC10
  • *
  • Mensajes: 22
Re: Primer proyecto y a punto de dejarlo...
« Respuesta #4 en: 06 de Abril de 2015, 19:09:40 »
Buenas tardes, tengo un proyecto para la universidad en Mikrobasic que sinceramente no entiendo por donde empezar. El proyecto consta de armar en un Microcontrolador, un contador que sea programado en dos partes con dos botones que al activarlos abran una tapa y empiecen a contar con un cronómetro.

El tiempo se detiene cuando la tapa cierra (botón interno activado mecánicamente por la tapa misma) y a su vez muestra el tiempo que la tapa estuvo abierta y al apretar otro botón (por ejemplo "ok") muestra el tiempo en dinero, ejemplo: "01:00:00" (una hora de apertura de la tapa) y al apretar "OK" muestra "$ 0.50" (puede ser el punto o la coma, no interesa cual de los dos sea).

Luego el programa tiene que tener otros botones que van escondidos detras de una tapa extra, que son los siguientes:

-"T1" hace referencia al tiempo con Tarifa 1. Tiene que ser programable al apretarlo una sola vez y llevar al usuario a algo como ésto en el LCD "T1 00,00" (de vuelta, si es coma o punto no interesa). Cuando el usuario terminó de poner la tarifa con un botón que sea "X" puede apretar uno que se llama "SET" y fijar ese valor para "T1" y lo mismo para "T2" que es otro botón. **El botón "X" lo que hace es sumar de uno en uno en la tarifa. Ejemplo: Si apretó "X" cinco veces, en el LCD muestra lo siguiente: "T1 5,00" (coma o punto me da igual) y si la apretó veinte veces, muestra en vez del 5 un 20.

-T2 es igual que T1, solo son fracciones del contador en LCD.

Luego de todo eso, hay otro botón que se llama "RESET", el mismo lo que hace es dejar el cronómetro en "CERO", o sea que empiece a contar todo de vuelta. Para aplicar el reset, lo que quiero que es que esté apretado durante cuatro segundos, o sea que el microcontrolador cuente cuatro vueltas y desde ahí ofrece resetear todo junto apretando "OK", o que directamente al tenerlo cuatro segundos, vuelvan los contadores a CERO.

¿Se podría de alguna forma que queden registros de T1 y T2? Por ejemplo en el problema dice "El tiempo debe quedar registrado si el usuario aprieta T1 durante tres segundos y mostrar el total de tiempo, tanto así como en T2". Es obvio que se puede pero ésto me supera bastante.

En fin, sería todo eso.

Espero que puedan ayudarme y si encuentran una forma mas simple de hacerlo, se los agradecería. Luego de probarlo, necesito alguno que sepa de electrónica para orientarme con el plano o circuito para ensamblar. No tengo tiempo de entregas ya que es un proyecto de la universidad para presentarme a uno del estado. Mi parte es ésta, las otras es por otro grupo de alumnos.

ÉSTO SE VE EN EL PRODUCTO SIN LA TAPA DE CONFIGURACIÓN ABIERTA. 
T 1
T 2
OK
LCD

ÉSTO ES LO QUE SE VE EN EL PRODUCTO CON LA TAPA DE CONFIGURACIÓN ABIERTA

RESET (4 SEGUNDOS) " AL APRETAR 4 SEGUNDOS RESETEA TODO EL CONTADOR DE T1 Y T2"
T1 PROGRAM
T2 PROGRAM
> SUBIR
< BAJAR
SET
LCD

Ojalá pueda hacer algo, ya tengo instalado el Mikrobasic en la computadora, uso Windows 8.1. Me falta el Proteus para hacer el circuito pero primero quiero tener el programa. O lo que me digan ustedes que es mas necesario, obviamente.
Quiero aprender mucho de éste tema!

Saludos, cité tu post inicial para descomponer la estructura en fragmentos pequeños y leer un poco más cómodo, espero no te moleste. Ahora en tema, yo la verdad programo en BASIC porque me parece una estructura mucho menos enredosa que C (no soporto los ; en algunos fragmentos sí, otros no, y si se te olvida uno el programa hace cosas raras), los "fuses" son configurados en interfaz directa y no por líneas de comando y vamos, en general me gusta mucho más el lenguaje; utilizo Pic Simulator IDE.

Ahora, la estructura de cronómetro puede ser muy sencilla, declarando dos variables de almacenamiento: segundos y milisegundos.

IF count = 1 THEN 'Señal que le das para iniciar el conteo
waitms 1
milisegundos = milisegundos + 1
IF milisegundos >= 1000 then
segundos = segundos + 1
milisegundos = 0
ENDIF
ENDIF

La razón de utilizar un retraso de 1ms es para que ésta línea de código no acapare el poder de procesamiento esperando 1 segundo que es una eternidad en un pic. Simplemente sumas 1ms por vez, y al tener 1000 ya sabes que es 1 segundo.

Para los push buttons necesitarás una estructura anti-rebote, ya que de lo contrario te mandará siempre pulsos de más, que son bastante molestos; una sencilla es la siguiente:

IF PB = 1 THEN waitms 20
IF PB = 1 THEN
While PB = 1
Wend
'Aquí va lo que quieras que haga el PB
ENDIF

La primera espera de 20ms es para descartar que haya sido alguna señal de interferencia, y los micro-rebotes que genera cualquier PB mecánico al ser pulsado; de ahí se queda en un while hasta que el PB es liberado, y sólo entonces permite que el código del PB se ejecute, en lugar de ejecutarse una y otra vez.

Prueba con programas pequeños y nos dices qué tal te fue.

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: Primer proyecto y a punto de dejarlo...
« Respuesta #5 en: 09 de Junio de 2015, 18:53:44 »
Estoy de acuerdo en que se debe empezar con proyectos simples y luego ir avanzando sino te puedes frustrar mucho.


 

anything