Autor Tema: Dado electrónico (Versión 2: con PIC16F627A)  (Leído 28219 veces)

Ariel

  • Global Moderator
  • dsPIC
  • ****
  • Mensajes: 10753
    • uControl
Dado electrónico (Versión 2: con PIC16F627A)
« en: Septiembre 19, 2008, 08:04:16 am »
Dado electrónico (Versión 2: con PIC16F627A)

El proyecto
Siguiendo con los montajes destinados a formar parte de nuestra “ludoteca”, presentamos un dado un tanto especial. Si bien se trata de un circuito que, como ya vimos, puede resolverse mediante una serie de componentes comunes, su simplicidad lo hace especialmente interesante para aprender a utilizar microcontroladores.


Como corazón de nuestro montaje hemos elegido a un microcontrolador de la familia “PIC16F” de Microchip. Concretamente, se trata del modelo PIC16F627A, de 18 pines. Seguramente el lector mas avanzado se preguntará el porque de esta elección, ya que, por ejemplo, un mucho mas pequeño y modesto PIC12F675 hubiese bastado para cumplir esa función.

Hemos basado nuestra decisión en el hecho de que ambos microcontroladores son económicos, y cuestan prácticamente lo mismo. Y como en futuras entregas ampliaremos este montaje a un número mayor de dados, nos vendrá bien ir conociendo este PIC.


Descripción del circuito
El circuito se destaca por su simplicidad. Podemos ver su esquema en la figura siguiente, donde rápidamente notamos la existencia de una pequeña fuente de alimentación construida alrededor de un regulador de voltaje de la familia LM78xx, concretamente un LM7805. Como se aconseja en la hoja de datos de este regulador, hemos incluido un par de condensadores cerámicos de 0.1 uF, uno en su entrada y otro en su salida.


Este es el esquema eléctrico de nuestro montaje.

Un diodo se encarga de evitar la “catástrofe” de conectar la alimentación en forma invertida, y un condensador electrolítico de 470 uF ayuda a eliminar el ripple que pudiese existir en alimentación externa.

El resto del circuito es el dado propiamente dicho. Si has leído el articulo “PICs y LEDs, una pareja perfecta” en este mismo sitio, seguramente el resto de este párrafo no es para tí. Cuatro salidas del PIC, concretamente RB0, RB1, RB2 y RB3, se encargan de controlar los cuatro grupos de LEDs que conforman el dado. Otras tantas resistencias limitan la corriente que circula por cada rama. La figura muestra que salidas debemos activar para cada valor posible del dado.


Grupos a encender para cada valor del dado.

Un pulsador, conectado a RA0, se encarga de poner ese pin a +V cada vez que se lo presiona. Esto nos permite saber que el usuario ha decidido lanzar el dado. Un resistor de 10k mantiene RA0 conectado a GND el resto del tiempo.


El software
El programa necesario para que nuestro proyecto realmente funcione es bastante simple. Se limita a esperar que el usuario presione el pulsador, y mientras que lo mantiene en esa condición cuenta continuamente de 1 a 6. El tiempo que el jugador mantiene presionado el pulsador es el que determina el estado final del dado. El hecho de que el PIC sea capaz de hacer esto decenas de miles de veces por segundo nos garantiza la imposibilidad de que el usuario pueda influir conscientemente en el resultado.

Igual que en otras oportunidades, hemos incluido una versión del programa en PIC BASIC (PSI), y otra en CCS:

Version BASIC

Código: [Seleccionar]
'-----CONFIGURAMOS PUERTOS----------
AllDigital  'Todos los pines del PORTA como E/S
TRISA = 0xff  'Configuro el PORTA completo como entrada.
TRISB = 0x00  'Configuro el PORTB completo como salida.

'------DECLARO VARIABLES -----------
Dim i As Byte  'i contendrá el valor del dado en cada momento.

loop:  'bucle principal
PORTB = 0  'Apago todos los leds

If PORTA.0 = 1 Then  'Si el pulsador esta en alto...
Gosub lanzo_dado
Endif
Goto loop

End  'Fin del programa principal                  

'--------------------------------------------------
'Esta rutina lanza el dado y muestra el resultado
'--------------------------------------------------
lanzo_dado:
i = 0  'Valor inicial de i
While PORTA.0 = 1  'bucle principal
i = i + 1  'Sumo 1 a i

If i = 7 Then  'si pasa de 6...
i = 1  '..empiezo de 1 otra vez.
Endif
Wend

'Ahora, muestro el valor de "i" en los leds:
PORTB = LookUp(0x01, 0x08, 0x09, 0x0a, 0x0b, 0x0e), i
WaitMs 5000  'espero 5 segundos, y vuelvo al programa ppal.
Return  
     

Versión CCS:

Código: [Seleccionar]
#include <16f627a.h>           //PIC utilizado
#fuses XT,NOWDT,NOPROTECT,PUT  //Configuramos los fuses
#use delay (clock=4000000)     //Oscilador a 4Mhz
#use fast_io(b)                //Optimizamos E/S del PORTB

#BYTE PORTB = 0x06             //El PORTB está en 0x06

//Variables globales--------------------------------------------------
//La tabla dado tiene el valor del PORTB para cada numero posible.
int dado [6]={0x01,0x08,0x09,0x0A,0x0B,0x0E};

//Prototipo de funciones ---------------------------------------------
void lanzo_dado(void);

//------Programa principal--------------------------------------------
void main(void)
{
   set_tris_a(0xFF);           //configuro el PORTA completo como entrada.
   set_tris_b(0x00);           //configuro el PORTB completo como salida.

   disable_interrupts(GLOBAL); //todas las interrupciones desactivadas

   do{                         //bucle principal
      PORTB = 0;               //Apago todos los leds
      if(input(PIN_A0)){       //Si elpulsador esta en alto...
            lanzo_dado();      //...lanzo el dado y muestro el resultado
      }
      }while(TRUE);            //Repito el bucle.
}
//--------------------------------------------------------------------
//Esta funcion lanza el dado y muestra el resultado
//--------------------------------------------------------------------
void lanzo_dado(void) {
      char i=0;             //i contendrá el valor del dado en cada momento.

      do{                   //bucle principal
         i++;               //Sumo 1 a i

         if (i == 7) {      //Si pasa de 6...
            i = 1;          //...empiezo de 1 otra vez.
         }
      }while(input(PIN_A0)); //Repito el bucle hasta que se suelte el pulsador.

      //Ahora, muestro el valor de "i" en los LEDs:
      PORTB =  dado [i];
      delay_ms(5000);         //Espero 5 segundos, y vuelvo al programa ppal.
}

Puedes descargar los archivos HEX y fuentes desde aqui.


El montaje
Se trata de un proyecto pequeño, así que no tendrás problemas para montarlo. En las figuras de la galería siguiente puedes ver el diseño del PCB que hemos realizado para alojar los componentes y otras que ayudaran en tu tarea.




Te recomendamos que prestes atención a la hora de colocar los LEDS, el diodo, el regulador de voltaje y el zócalo del PIC16F627A sobre el PCB, ya que si alguno de ellos queda en la posición incorrecta, el dado no funcionará.

Puedes descargar el archivo PDF con el diseño del PCB, listo para imprimir y a escala desde aqui.

Si el lector lo prefiere, puede dotar al de una caja adecuada, dejando siete agujeros de 5mm para los LED. En este caso, también se debería utilizar un pulsador diferente, ya que se montaría en la caja en lugar ir soldado directamente sobre el PCB.


Autor: Ariel
« Última modificación: Enero 25, 2010, 04:07:55 pm por Ariel »
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

Rafita

  • PIC10F
  • *
  • Mensajes: 52
Re: Dado electrónico (Versión 2: con PIC16F627A)
« Respuesta #1 en: Octubre 04, 2008, 04:12:29 pm »
Hola, antes que nada muy buena y muy completa la página y excelente la revista.
Estoy intentando empezar con los PIC, y armé el dado con el PCB bajado de la página.
El PIC lo programé con los archivos también bajados de la página, usando un programador que se llama QUARK PRO II, y con el software winpic800.
El PIC se grabó bien, pero el proyecto no funciona, revisé el montaje de los componentes, que haya alimentación, y esta todo correcto. Que puede estar pasando? ???
Si buscas resultados distintos, no hagas siempre lo mismo. (Albert Einstein)

Ariel

  • Global Moderator
  • dsPIC
  • ****
  • Mensajes: 10753
    • uControl
Re: Dado electrónico (Versión 2: con PIC16F627A)
« Respuesta #2 en: Octubre 04, 2008, 06:55:02 pm »
Hola!
Gracias por las flores!  ::)

¿Tenes un tester como para ver el estado de las salidas del PIC?
¿Los LEDs estan soldados con la posicion correcta?
¿Hay 5V entre los pines de alimentacion del PIC?

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

Rafita

  • PIC10F
  • *
  • Mensajes: 52
Re: Dado electrónico (Versión 2: con PIC16F627A)
« Respuesta #3 en: Octubre 04, 2008, 10:07:55 pm »
Aca estoy de nuevo. :D

Los leds están soldados en posición correcta, y en los pines tengo 4.66V.
Como pruebo el estado de las salidas del PIC con el tester? ???

Gracias y saludos!


Si buscas resultados distintos, no hagas siempre lo mismo. (Albert Einstein)

Ariel

  • Global Moderator
  • dsPIC
  • ****
  • Mensajes: 10753
    • uControl
Re: Dado electrónico (Versión 2: con PIC16F627A)
« Respuesta #4 en: Octubre 05, 2008, 06:19:40 pm »
Hola!
Pone la punta "negra" (el negativo) al 0V de la fuente, y con la otra toca las salidas...si estan en alto, deberias tener 5V (o los 4.66 que medis) en las salidas.

De todos modos, esos 4.66 deberian ser 5...Con 4.66 el PIC va a funcionar igual (creo que hasta con 3V anda) pero hay algo que esta consumiendo mucho y hace caer la tension de 5V a 4.66....algo raro hay :)
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

Rafita

  • PIC10F
  • *
  • Mensajes: 52
Re: Dado electrónico (Versión 2: con PIC16F627A)
« Respuesta #5 en: Octubre 05, 2008, 08:55:00 pm »
Hola!
El tema de los 4.66V era porque estaba usando una bateria de 9v que estaba bastante descargada (7V), le puse una fuente y leo 5V. Tenés razón la hoja de datos del PIC dice que con 3V igual funciona.

Probé las salidas con el tester y todas están en 0V.
Puede ser que el PIC esté estropeado?? Lo puse de nuevo en el programador, y el winpic lo reconoce y lee el programa grabado sin inconvenientes?? ???
Gracias por la paciencia y las respuestas rápidas :D
Si buscas resultados distintos, no hagas siempre lo mismo. (Albert Einstein)

Ariel

  • Global Moderator
  • dsPIC
  • ****
  • Mensajes: 10753
    • uControl
Re: Dado electrónico (Versión 2: con PIC16F627A)
« Respuesta #6 en: Octubre 06, 2008, 07:01:02 am »
Hola!
Si todas las salidas permancen en cero, quizas el PIC no esté "corriendo". Podrias modificar el programa para que en una de las salidas que va a los leds solo haga

- inicio
- poner CERO
- esperar medio segundo
- Poner UNO
- esperar medio segundo
-Volver a inicio

Si esos LEDs no parpadean y estan soldados correctamente, es posible que

a) Por algun motivo el PIC no se este grabando con tu programa
b) El PIC este quemado...
c) Haya que seguir investigando (y esta es la mejor parte de todo proyecto! Donde mas se aprende! :) )

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

Rafita

  • PIC10F
  • *
  • Mensajes: 52
Re: Dado electrónico (Versión 2: con PIC16F627A)
« Respuesta #7 en: Octubre 25, 2008, 05:30:05 pm »
Acá estoy de nuevo ;D

Después de probar varias cosas finalmente funcionó el dado  :D

Probé tratar de encender solo un led, y ahi me di cuenta de que el tema era que el oscilador no tenía que ir en XT, usé el oscilador interno del PIC, y la opcion MCLRE desactivada y el led encendió y apagó normalmente. Después usé esa misma configuración para el dado y salió andando.

Al archivo dadoelectronico2.bas le tuve que agregar una linea para que configure el oscilador interno en 4mhz, porque sin ese dato los leds se apagan muy rápido.

Saludos ;D



Si buscas resultados distintos, no hagas siempre lo mismo. (Albert Einstein)

Ariel

  • Global Moderator
  • dsPIC
  • ****
  • Mensajes: 10753
    • uControl
Re: Dado electrónico (Versión 2: con PIC16F627A)
« Respuesta #8 en: Octubre 25, 2008, 06:39:13 pm »
Clap clap clap!!!!
 ::)

Queremos ver las fotos! :) (hay un foro para las fotos de nuestros "cacharros":P
« Última modificación: Octubre 25, 2008, 06:44:45 pm por Ariel »
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

fanloeb

  • PIC10F
  • *
  • Mensajes: 33
Re: Dado electrónico (Versión 2: con PIC16F627A)
« Respuesta #9 en: Septiembre 22, 2009, 04:57:30 pm »
hola... me prodrian responder por favor (si no es mucha molestia), hice el dado con el pic. funciona 10 puntos del 2 al 6, para mostrar el 1 prenden 4 leds. que forman una especie de Z.. porque puede ser, use el hex que baje de la wiki, lo unico que le cambie fue el oscilador, porque sino me daba error. puede ser eso lo que ocasione que no aparezca el 1??? desde ya gracias..

Ariel

  • Global Moderator
  • dsPIC
  • ****
  • Mensajes: 10753
    • uControl
Re: Dado electrónico (Versión 2: con PIC16F627A)
« Respuesta #10 en: Septiembre 22, 2009, 05:25:42 pm »
Mmmmmmmm.....
¿No tendrás algun cortocircuito en la placa?  ???
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

fanloeb

  • PIC10F
  • *
  • Mensajes: 33
Re: Dado electrónico (Versión 2: con PIC16F627A)
« Respuesta #11 en: Septiembre 23, 2009, 05:24:36 pm »
no creo que haya algun cortocuito porque sino no mostraria los otros numeros, o me equivoco?. porque por ejemplo de ser asi al formar el cuatro prenderia el led del 1, y no eso no sucede..

Ariel

  • Global Moderator
  • dsPIC
  • ****
  • Mensajes: 10753
    • uControl
Re: Dado electrónico (Versión 2: con PIC16F627A)
« Respuesta #12 en: Septiembre 23, 2009, 05:45:26 pm »
Si, es posible.

La verdad es que no le encuentro una explicacion  :'(
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

fanloeb

  • PIC10F
  • *
  • Mensajes: 33
Re: Dado electrónico (Versión 2: con PIC16F627A)
« Respuesta #13 en: Septiembre 24, 2009, 09:48:19 pm »
el unico cambio que realice al que estaba en la wiki, es que le cambie el oscilador interno, porque sino me tiraba error, despues todo igual....

HJ

  • Moderador
  • dsPIC
  • ******
  • Mensajes: 5713
Re: Dado electrónico (Versión 2: con PIC16F627A)
« Respuesta #14 en: Septiembre 24, 2009, 11:13:35 pm »
Si podes sacale una foto a la placa del lado de componentes y otra del lado de soldaduras, que se vea mas o menos bien y subila. tal vez nosotros veamos algo que a vos se te pasa por alto.

si lo armaste en un protoboard, fijate y controlá todo el montaje

"si te lo dicen se te olvida, si lo lees lo aprendes; pero si lo haces realmente lo entiendes"
"Cuando llegue la inspiración, que me encuentre trabajando" [Pablo Picasso]

 

anything