Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

26/03/2013 #2421

Avatar de inspector gadget

hola expertos, solicito su ayuda referente a como debo enlazar 2 contadores iguales en su estructura, pero ubicados en diferentes puertos del pic 16f877a, el uno cuenta de 0 a 9 ubicado en portb y el otro cuenta de 9 a cero y esta en portd y no logro que funcionen al mismo tiempo, quisiera que con el mismo programa me indiquen que hace falta para poder entender como se hace este enlace, asi tambien no encuentro la configuracion de fuses para este chip. muchas gracias y ojala me puedan ayudar
26/03/2013 #2422
Moderador

Avatar de D@rkbytes

inspector gadget dijo: Ver Mensaje
hola expertos, solicito su ayuda referente a como debo enlazar 2 contadores iguales en su estructura, pero ubicados en diferentes puertos del pic 16f877a, el uno cuenta de 0 a 9 ubicado en portb y el otro cuenta de 9 a cero y esta en portd y no logro que funcionen al mismo tiempo, quisiera que con el mismo programa me indiquen que hace falta para poder entender como se hace este enlace, así también no encuentro la configuración de fuses para este chip. muchas gracias y ojala me puedan ayudar
Así como tienes el programa no funcionará el contador del puerto D.
Y recuerda que los programas son secuenciales, primero verás el conteo de 0 a 9 en el puerto B,
y luego comenzara el conteo de 9 a 0 en el puerto D, y se repite el ciclo.
Para que funcione el contador del puerto D, solo tenías que hacerlo así...
Código:
inicio:
       for i = 0 to 9
       portb = i
       pause 100
       next i
              
       for i2 = 9 to 0 step - 1
       portd = i2
       pause 100
       next i2
       goto inicio
La palabra de configuración que utilicé fue ésta:
@ DEVICE HS_OSC, PWRT_ON, WDT_OFF, BOD_OFF

Para que te ahorres los dos decodificadores y trabajes los displays directamente, adjunto un ejemplo.

Suerte.
26/03/2013 #2423

Avatar de isaiasjea

hola expertos, solicito su ayuda referente a como debo enlazar 2 contadores iguales en su estructura, pero ubicados en diferentes puertos del pic 16f877a, el uno cuenta de 0 a 9 ubicado en portb y el otro cuenta de 9 a cero y esta en portd y no logro que funcionen al mismo tiempo, quisiera que con el mismo programa me indiquen que hace falta para poder entender como se hace este enlace, asi tambien no encuentro la configuracion de fuses para este chip. muchas gracias y ojala me puedan ayudar
Aquí otro ejemplo de tu contador cambiando al mismo tiempo.

Saludos y seguimos en contacto.
Archivos Adjuntos
Tipo de Archivo: zip New-16F877A.zip (11,1 KB (Kilobytes), 116 visitas)
26/03/2013 #2424

Avatar de inspector gadget

amigo Darkbytes, gracias por responder, ya voy entendiendo y ya habia leido que los programas en los microcontroladores se ejecutan de manera secuencial, quieres decir que si por ejemplo necesito realizar 3 contadores 0 a 99 de manera independiente y al mismo tiempo, debo usar 3 micros por separado? necesito elaborar un proyecto en el cual cada contador haga su correspondiente tarea como contar cuando lo accione, parar y seleccionar el tiempo de tope hasta donde debe llegar el contador y este programa ya lo realic con pic 16f628a con decodificadores 7447 para qu alcancen los pines y funciona bien, pero por costos pense que los podia incluir en un chip con mas puertos y que me funcionaran independientemente y por eso mire que el 16f877a tenia 33 puertos E/S que me hubieran servido para los tres contadores pero veo que no se adaptaria a lo que requiero , no existe ninguna tecnica para lograr este proposito en un solo chip?
Por otra parte queria solicitar el grande favor si tienen un ejemplo de un contador automatico que vaya de 0 a 99 pero multiplexado, tengo un ejemplo de este contador pero no usa esa tecnica porque usa un 7447 para las unidades, y otro para las decenas,no ntiendo muy bien la tecnica con el 16f628 y quisiera saber mas para realizar mi contador de esa forma ya que solo usaria 4 puertos para el 7447 , 2 para los transistores y 7 mas para funciones con pulsadores, como les digo no es tanto migrarba otro chip con mas puertos, sino entender la multiplexacion para encarar proyectos con esa tecnica, espero su valiosa ayuda para en estas vacaciones sentarme a practicar gracias por el ejemplo y tu tiempo.

isaiasjea dijo: Ver Mensaje
Aquí otro ejemplo de tu contador cambiando al mismo tiempo.

Saludos y seguimos en contacto.
---------- Actualizado después de 30 minutos ----------

gracias por responder isaiasjea, bien interesante la presentacion que se hace en los display de diferente conteo al mismo tiempo, pero lo que pretendia es darle a esos conteos, control independiente de cada uno de ellos como que inicien cada conteo con un pulsador diferente, o que pueda darles diferentes tiempos de conteo, en sintesis que funcionen independiente en sus controles, pero dentro de un mismo programa y dentro del mismo chip, pero ya me explicaba Dark que esto no es posible por la estructura de los programas en forma secuencial.
Igual agradeceria muchisimo si no tienes un contador de 0 a 99 que trabaje con la tecnica del multiplexado pero que haga el conteo en forma automatica, no entiendo muy bien como multiplexar, tengo un programa que hace la cuenta de unidades y decenas a traves de un solo 7447 y dos tgransistores para multiplexar, me gusta mucho por el ahorro de pins, pero hace la cuenta con un pulsador y no he podido que me realice este conteo de forma automatica, agradezco tu voluntad de ayudarme.
27/03/2013 #2425

Avatar de torres.electronico

ferdy575 dijo: Ver Mensaje
hola Torres, gracias por responderme te cuento que estuve dando muchas vueltas en Internet y el componente encoder rotativo más parecido que halle fue este: el 288 Rotary encoder aquí te pongo la hoja de datos aunque físicamente es un poco diferente electricamente se comporta igual solo que siempre va hacia adelante, agradezco tu colaboración
Hola Ferdy... el encoder rotativo que citas en el pdf, tiene la particularidad de poder tabajar en ambos modos... Osea, es sabido que tenemos varios tipos de encoder, de los cuales los mas destacables son los absolutos (los que te dicen el angulo donde esta con una mayor resolucion) y los incrementales (los que envian pulsos segun avance, pero si es de un solo canal, no tenemos manera de saber donde esta el eje... si tiene dos canales, solo de esta manera podriamos saber para que lado gira el encoder incremental, pero nunca sabriamos perfectamente donde esta: Ahi ya tendriamos que jugar con un par de lineas de mas para sumar y restar pulsos y mas o menos saber donde tendria que estar cituado el eje).
En el pdf, menciona que en funcion encoder absoluto, tenes una sañal de 2Bits (4-6-8-10-12 pulsos en 360º), y en modo encoder absoluto, tenes una señal de 4 bits (16 combinaciones en 360º)...
Supongamos dado tu ejemplo anterior que tenes en mano un encoder incremental de dos canales, la lectura para saber para que lado gira, es sencilla... observemos nuevamente el siguiente grafico:


Despreciando el 3er canal llamado canal de indexacion, vamos a centrarnos en los pulsos del canal A y canal B...
Lo que vos tenes que hacer, es contar los pulsos de subida y bajada en ambos canales...osea, los cambios de uno a cero en ambos canales, y luego los comparas entre los dos.. Por ejemplo, si miramos la primer iamgen (count down), vemos que el canal A se encuentra con el flanco en bajada y el flanco del canal B, se encuentra en subida... Esto se interpretaria de la siguiente manera 0-1
En la segunda imagen, vemos que es al reves... el canal A se encuentra en flanco de subida y el canal B en flanco de bajada... esto se interpretaria de la siguiente manera 1-0 ... ahora... Parece sencillo, pero no lo es tanto saber cuanto se mueve el eje... jajajaja...como saber cuanto avanza el eje?
Sencillo... vamos a tratar de hacerlo un poco mas basico para que no sea engorroso...
Vamos a tomar el canal A para contar la cantidad de pulsos de cada transicion... Para esto, tenemos que usar una interrupcion por hardware, o bien, hacer una especie de interrupcion por software (bucle o salto a un subprograma) cada vez que detecte pulso.... teniendo las caracterisitcas del encoder (osea, cuantos pulsos son 360ª), mas o menos podemos saber cuanto se movio o cuanto avanza...
Para saber en que direccion se movio, vamos a leer el estado del pulso del canal B y reflotando las lineas anteriores, aca viene el dilema...

Por ejemplo...Si tenemos flanco subida en A:
-y el flanco del canalB es =0 se esta desplazando un paso para la derecha (1-0)
-y el flanco del canalB es=1 se esta desplazando un paso para la IZQUIERDA (1-1)

Si tenemos flanco bajada en A:
-y el flanco del canalB=1 se esta desplazando un paso para la DERECHA (0-1)
-y el flanco del canalB=0 se esta desplazando un paso para la IZQUIERDA (0-0)

Si tenemos flanco subida en B:
-y el flanco del canalA=1 se esta desplazando un paso para la DERECHA (1-1)
-y el flanco del canalA=0 se esta desplazando un paso para la IZQUIERDA (1-0)

Si tenemos flanco bajada en B:
-y el flanco del canalA=0 se esta desplazando un paso para la DERECHA (0-0)
-y el flanco del canalA=1 se esta desplazando un paso para la IZQUIERDA (0-1)

Fijate que con este ejemplo citado, tenemos el giro del encoder de un extremo al otro y luego, retorna a la posicion original....
Para hacerlo mas grafico, mira tu ejemplo citado de tus propias lecturas

0-0, 1-0, 1-1, 0-1, 0-0, en un sentido y en el otro sentido la secuencia es contraria así: 0-0, 0-1, 1-1, 1-0, 0-0
Ahora... como podemos armar el programa de lectura?
Bueno, podemos encararlode varias maneras, pero hay que tener en cuenta que tiene que ser lo mas rapido posible, ya que podemos perder pulsos en el movimiento...
Suponiendo que tomamos la interrupcion por B.0, cada vez que salta a la interrupcion, tenemos que verificar con un while en que estado se encuentra el otro puerto para saber si sumar o sustraer al dato conteo...
Osea. si ponemos el canal A al puerto B0, y el canal B al puerto B1, si salta primero la interrupcion por un pulso detectado del canal A, hay qeu verificar el estado del otro puerto para saber cuanto avanza; Ahora, Si salta primero el puerto B1 por un pulso detectado del canal B, hay que ver el estado del canal A para saber cuanto avanza... osea... el que se dispare 1ero, nos indica para que lado va....Con esto mas o menos podriamos derterminar cuanto se mueve y para que lado...
Ojo que ese mismo While que usamos, ademas de servirnos para decirnos para que lado se mueve tambien, puede traernos problemas en el caso de que se corte la energia y arranque desde cualquier posicion, pero eso con un poco de maña, se puede mejorar...che, son las 3 de la mañana... te dejo un abrazo
27/03/2013 #2426
Moderador

Avatar de D@rkbytes

Saludos.
Les traigo dos ejemplos de contadores 0-99 automáticos (Sin pulsador), usando el sistema multiplex.
En el primero utilice la conexión directa de los displays por el puerto B y dos displays de cátodo común.
En el segundo utilice un CI 7447 para la conexión de los displays y usando displays con ánodo común.
El ejemplo con el IC 7447 es más sencillo que el de conexión directa, ya que no requiere tabla de conversión.
Los ejemplos están comentados para su comprensión, y también adjunto los vídeos durante la simulación.

Espero les gusten.

Nota:
Los vídeos solo los realice hasta un conteo de 50.

Suerte.
Archivos Adjuntos
Tipo de Archivo: rar 16F628A Contador 0-99 MPX_001.rar (21,6 KB (Kilobytes), 124 visitas)
Tipo de Archivo: rar 16F628A Contador 0-99 MPX_002.rar (21,8 KB (Kilobytes), 122 visitas)
Tipo de Archivo: rar Vídeos.rar (123,4 KB (Kilobytes), 110 visitas)
27/03/2013 #2427

Avatar de ferdy575

torres.electronico dijo: Ver Mensaje
Hola Ferdy... el encoder rotativo que citas en el pdf, tiene la particularidad de poder tabajar en ambos modos... Osea, es sabido que tenemos varios tipos de encoder, de los cuales los mas destacables son los absolutos (los que te dicen el angulo donde esta con una mayor resolucion) y los incrementales (los que envian pulsos segun avance, pero si es de un solo canal, no tenemos manera de saber donde esta el eje... si tiene dos canales, solo de esta manera podriamos saber para que lado gira el encoder incremental, pero nunca sabriamos perfectamente donde esta: Ahi ya tendriamos que jugar con un par de lineas de mas para sumar y restar pulsos y mas o menos saber donde tendria que estar cituado el eje).
En el pdf, menciona que en funcion encoder absoluto, tenes una sañal de 2Bits (4-6-8-10-12 pulsos en 360º), y en modo encoder absoluto, tenes una señal de 4 bits (16 combinaciones en 360º)...
Supongamos dado tu ejemplo anterior que tenes en mano un encoder incremental de dos canales, la lectura para saber para que lado gira, es sencilla... observemos nuevamente el siguiente grafico:

http://www.forosdeelectronica.com/at...1&d=1364267949
Despreciando el 3er canal llamado canal de indexacion, vamos a centrarnos en los pulsos del canal A y canal B...
Lo que vos tenes que hacer, es contar los pulsos de subida y bajada en ambos canales...osea, los cambios de uno a cero en ambos canales, y luego los comparas entre los dos.. Por ejemplo, si miramos la primer iamgen (count down), vemos que el canal A se encuentra con el flanco en bajada y el flanco del canal B, se encuentra en subida... Esto se interpretaria de la siguiente manera 0-1
En la segunda imagen, vemos que es al reves... el canal A se encuentra en flanco de subida y el canal B en flanco de bajada... esto se interpretaria de la siguiente manera 1-0 ... ahora... Parece sencillo, pero no lo es tanto saber cuanto se mueve el eje... jajajaja...como saber cuanto avanza el eje?
Sencillo... vamos a tratar de hacerlo un poco mas basico para que no sea engorroso...
Vamos a tomar el canal A para contar la cantidad de pulsos de cada transicion... Para esto, tenemos que usar una interrupcion por hardware, o bien, hacer una especie de interrupcion por software (bucle o salto a un subprograma) cada vez que detecte pulso.... teniendo las caracterisitcas del encoder (osea, cuantos pulsos son 360ª), mas o menos podemos saber cuanto se movio o cuanto avanza...
Para saber en que direccion se movio, vamos a leer el estado del pulso del canal B y reflotando las lineas anteriores, aca viene el dilema...

Por ejemplo...Si tenemos flanco subida en A:
-y el flanco del canalB es =0 se esta desplazando un paso para la derecha (1-0)
-y el flanco del canalB es=1 se esta desplazando un paso para la IZQUIERDA (1-1)

Si tenemos flanco bajada en A:
-y el flanco del canalB=1 se esta desplazando un paso para la DERECHA (0-1)
-y el flanco del canalB=0 se esta desplazando un paso para la IZQUIERDA (0-0)

Si tenemos flanco subida en B:
-y el flanco del canalA=1 se esta desplazando un paso para la DERECHA (1-1)
-y el flanco del canalA=0 se esta desplazando un paso para la IZQUIERDA (1-0)

Si tenemos flanco bajada en B:
-y el flanco del canalA=0 se esta desplazando un paso para la DERECHA (0-0)
-y el flanco del canalA=1 se esta desplazando un paso para la IZQUIERDA (0-1)

Fijate que con este ejemplo citado, tenemos el giro del encoder de un extremo al otro y luego, retorna a la posicion original....
Para hacerlo mas grafico, mira tu ejemplo citado de tus propias lecturas



Ahora... como podemos armar el programa de lectura?
Bueno, podemos encararlode varias maneras, pero hay que tener en cuenta que tiene que ser lo mas rapido posible, ya que podemos perder pulsos en el movimiento...
Suponiendo que tomamos la interrupcion por B.0, cada vez que salta a la interrupcion, tenemos que verificar con un while en que estado se encuentra el otro puerto para saber si sumar o sustraer al dato conteo...
Osea. si ponemos el canal A al puerto B0, y el canal B al puerto B1, si salta primero la interrupcion por un pulso detectado del canal A, hay qeu verificar el estado del otro puerto para saber cuanto avanza; Ahora, Si salta primero el puerto B1 por un pulso detectado del canal B, hay que ver el estado del canal A para saber cuanto avanza... osea... el que se dispare 1ero, nos indica para que lado va....Con esto mas o menos podriamos derterminar cuanto se mueve y para que lado...
Ojo que ese mismo While que usamos, ademas de servirnos para decirnos para que lado se mueve tambien, puede traernos problemas en el caso de que se corte la energia y arranque desde cualquier posicion, pero eso con un poco de maña, se puede mejorar...che, son las 3 de la mañana... te dejo un abrazo
UUUffff Hermano sos un "MONSTRUO" con esta vaina te felicito y gracias por tu ayuda voy a ver como escribo el programa siguiendo tu consejo y me perdonas por tu trasnochada muchas gracias está super tu analisis
27/03/2013 #2428

Avatar de inspector gadget

D@rkbytes dijo: Ver Mensaje
Saludos.
Les traigo dos ejemplos de contadores 0-99 automáticos (Sin pulsador), usando el sistema multiplex.
En el primero utilice la conexión directa de los displays por el puerto B y dos displays de cátodo común.
En el segundo utilice un CI 7447 para la conexión de los displays y usando displays con ánodo común.
El ejemplo con el IC 7447 es más sencillo que el de conexión directa, ya que no requiere tabla de conversión.
Los ejemplos están comentados para su comprensión, y también adjunto los vídeos durante la simulación.

Espero les gusten.

Nota:
Los vídeos solo los realice hasta un conteo de 50.

Suerte.
Como siempre amigo Dark muy completos tus aportes, es un buen material para los que nos gusta practicar con contadores sobre dysplays de 7 segmentos.

Esta pregunta va enfocada a cuales son los fuses de programación para un pic 16f84a, lo que sucede es que he venido usando el 16f628a y me he familiarizado con su manejo, pero me ofrecieron venderme varios f84 a buen precio y los compre, y migre un ejemplo de un contador de 0 a 9 que me funciona con f628 y con el f 84 tengo problemas porque hace cosas extrañas en la simulación y que creo sean generadas por una mala configuración y como quiero emplearlos en varios proyectos y aunque se que debe incorporarse cristal y que 13 de sus puertos son E/S como en el f 628, desconozco que fuses tiene, ojala puedan remitirme a algún ejemplo donde pueda ver esta configuración, aclaro que he buscado en este hilo, pero los programas que he visto, parten desde definir el oscilador pero los fuses no se cuales san para definirlos y eso es basico para montar los proyectos en fisico. mil gracias por su tiempo.
27/03/2013 #2429
Moderador

Avatar de D@rkbytes

inspector gadget dijo: Ver Mensaje
Como siempre amigo Dark muy completos tus aportes, es un buen material para los que nos gusta practicar con contadores sobre dysplays de 7 segmentos.
Gracias.
inspector gadget dijo: Ver Mensaje
Esta pregunta va enfocada a cuales son los fuses de programación para un pic 16f84a, lo que sucede es que he venido usando el 16f628a y me he familiarizado con su manejo, pero me ofrecieron venderme varios f84 a buen precio y los compre, y migre un ejemplo de un contador de 0 a 9 que me funciona con f628 y con el f 84 tengo problemas porque hace cosas extrañas en la simulación y que creo sean generadas por una mala configuración y como quiero emplearlos en varios proyectos y aunque se que debe incorporarse cristal y que 13 de sus puertos son E/S como en el f 628, desconozco que fuses tiene, ojala puedan remitirme a algún ejemplo donde pueda ver esta configuración, aclaro que he buscado en este hilo, pero los programas que he visto, parten desde definir el oscilador pero los fuses no se cuales san para definirlos y eso es basico para montar los proyectos en fisico. mil gracias por su tiempo.
Para saber que fuses usa cierto PIC siempre recurro a los templates (plantillas) de Microchip.
Obviamente están escritos para usar lenguaje ensamblador, pero me dan una idea.
Las plantillas se encuentran en la carpeta de instalación de MPLAB, por default dentro de la carpeta:
C:\Archivos de programa\Microchip\MPASM Suite\Template\Code
Ahí se busca el archivo *.asm correspondiente al PIC, y viene la palabra de configuración.

Para saber con que fuses se compila el *.hex de nuestro programa, se puede compilar sin ellos,
y luego leerlos como por ejemplo con el programa WinPic800.
Otra opción, es ver los que usará el compilador por default.
Y se encuentran en la carpeta de instalación del compilador PBP, por default: C:\PBP.
Ahí se busca el archivo *.inc correspondiente al PIC que vamos a usar.

Si queremos saber mas acerca de cierto PIC, abrimos el archivo *.inc del PIC, y veremos una referencia.
Por ejemplo para el PIC16F84A veremos esta línea: include 'M16F8x.INC' ; PM header
Ahora vamos a la carpeta INC y buscamos el archivo M16F8x.INC y lo abrimos para ver que hay dentro.
En ese archivo veremos todos los registros del PIC en cuestión, y obviamente los fuses disponibles.

Espero les sirva esta información.

Como dato adicional, en este documento viene información detallada sobre los PIC de medio rango.
PICmicro Mid-Range MCU Family Reference Manual - Microchip

Suerte.
27/03/2013 #2430

Avatar de inspector gadget

D@rkbytes dijo: Ver Mensaje
Gracias.

Para saber que fuses usa cierto PIC siempre recurro a los templates (plantillas) de Microchip.
Obviamente están escritos para usar lenguaje ensamblador, pero me dan una idea.
Las plantillas se encuentran en la carpeta de instalación de MPLAB, por default dentro de la carpeta:
C:\Archivos de programa\Microchip\MPASM Suite\Template\Code
Ahí se busca el archivo *.asm correspondiente al PIC, y viene la palabra de configuración.

Para saber con que fuses se compila el *.hex de nuestro programa, se puede compilar sin ellos,
y luego leerlos como por ejemplo con el programa WinPic800.
Otra opción, es ver los que usará el compilador por default.
Y se encuentran en la carpeta de instalación del compilador PBP, por default: C:\PBP.
Ahí se busca el archivo *.inc correspondiente al PIC que vamos a usar.

Si queremos saber mas acerca de cierto PIC, abrimos el archivo *.inc del PIC, y veremos una referencia.
Por ejemplo para el PIC16F84A veremos esta línea: include 'M16F8x.INC' ; PM header
Ahora vamos a la carpeta INC y buscamos el archivo M16F8x.INC y lo abrimos para ver que hay dentro.
En ese archivo veremos todos los registros del PIC en cuestión, y obviamente los fuses disponibles.

Espero les sirva esta información.

Como dato adicional, en este documento viene información detallada sobre los PIC de medio rango.
PICmicro Mid-Range MCU Family Reference Manual - Microchip

Suerte.
claro que la informacion me sirve, muchisimas gracias
27/03/2013 #2431


Juegos Temporizados


Hola:
Estoy empezando a desarrollar un programa para juegos con PIC, en la que al insertar una moneda, empiece el tiempo de juego. Mi primer programa lo hice con el pic16F628A y su correspondiente simulación y todo funciona bien, pero al migrar al pic 16F877A (por necesidad de mas puertos) el programa se salta al INICIO, sin necesidad de pulsar el botón (moneda). No entiendo en que me equivoqué, alguien tiene idea? O es una deficiencia de PROTEUS
Descarguen los archivos y prueben la simulación para ambos casos.
Archivos Adjuntos
Tipo de Archivo: rar un pulsador un temporizador un led.rar (32,6 KB (Kilobytes), 109 visitas)
Tipo de Archivo: rar completo16f877A.rar (36,0 KB (Kilobytes), 93 visitas)
27/03/2013 #2432

Avatar de torres.electronico

ferdy575 dijo: Ver Mensaje
UUUffff Hermano sos un "MONSTRUO" con esta vaina te felicito y gracias por tu ayuda voy a ver como escribo el programa siguiendo tu consejo y me perdonas por tu trasnochada muchas gracias está super tu analisis
Tengo un ejemplo de marito saco por si te interesa... Lo unico que tiene, es que esta en PICBASIC (se entiende perfectamente y es sencillo como hay que hacer los cambios)...
aca lo cito:

Código:
'****************************************************************
'*  Name    : ENCODER.BAS                                      *
'*  Author  : Mario G. Sacco                                    *
'*  Notice  : Copyright (c) 2011  - NeoTeo                      *
'*          : All Rights Reserved                               *
'*  Date    : 07/07/2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

    'SELECCIONO PIC, CLOCK E INICIALIZACIÓN
    DEVICE = 18F2550        'SELECCIONO PIC Y CLOCK                    
    XTAL = 48                                
    
    'UTILIZO BOOTLOADER
    DECLARE PROTON_START_ADDRESS = $1000 ' INICIO EN DIRECCIÓN  $1000 
    
    CMCON = 7               'APAGO LOS COMPARADORES
    ALL_DIGITAL = True      'Y ANULO LAS ENTRADAS ADC (TODO DIGITAL)
    
    'DECLARO EL LCD
    LCD_DTPIN = PORTB.4        'SETEO EL LCD 16X2 PARA 4 CABLES
    LCD_RSPIN = PORTB.2
    LCD_ENPIN = PORTB.3
    LCD_INTERFACE = 4    
    LCD_LINES = 2
    LCD_TYPE = 0
    
    'REGISTROS DE LA INTERRUEPCIÓN
    SYMBOL BIERB0 = INTCON.1  'BANDERA DE INTERRUPCIÓN EXTERNA POR RB0 
    SYMBOL HEI    = INTCON.4  'HABILITACIÓN EXTERNA DE LA INTERRUPCIÓN POR RB0
    SYMBOL GIE    = INTCON.7  'HABILITACIÓN GLOBAL DE INTERRUPCIONES
    SYMBOL FLANCO = INTCON2.6 'FLAG=0>>>INTERRUPCIÓN POR FLANCO DE BAJADA
                              'FLAG=1>>>INTERRUPCIÓN POR FLANCO DE SUBIDA
    'DECLARO LA INTERRUPCIÓN
    ON_INTERRUPT GOTO SALTO   'SALTO A LA INTERRUPCIÓN

    'PARÁMETROS DE INICIO DE ALGUNOS REGISTROS
    GIE = 1                   'ACTIVO INTERRUPCIONES
    HEI = 1                   'ACTIVO INTERRUPCIÓN EXTERNA POR RB0
    FLANCO = 1                'AL INICIAR ACTIVO LA INTERRUPCIÓN


    DIM NUMERO AS WORD        'VARIABLE DE 0 A 65535         
    
    CLS                       'LIMPIO DISPLAY AL INICIAR
    
    NUMERO=127                'COLOCO LA VARIABLE AL CENTRO AL INICIAR             

'INICIO EL PROGRAMA PRINCIPAL  
INICIO:                       
     
     PRINT AT 1,1,"Encoder 18F2550 "
     PRINT AT 2,2,"      ",DEC NUMERO,"    "    'ESCRIBO EN PANTALLA 
     IF NUMERO <= 0 THEN NUMERO = 0     'TOPE MÍNIMO EN 0
     IF NUMERO >= 255 THEN NUMERO = 255 'TOPE MÁXIMO EN 255
     
     
GOTO INICIO                   'REINICIO EL CICLO 
'FIN DEL PROGRAMA PRINCIPAL             


'INTERRUPCIÓN                                
SALTO:                        'LEO EL ENCODER
       
 CONTEXT SAVE                 'GUARDA EL CONTEXTO DE LOS REGISTROS ANTES 
                              'DE EMPEZAR A TRABAJAR CON LA INTERRUPCIÓN
    IF PORTB.0 = 1    THEN    'SI RB0 ESTÁ EN 1
       FLANCO  = 0            'ACTIVO INTERRUPCIÓN POR FLANCO DE BAJADA
       IF PORTB.1 = 1 THEN    'CUANDO RB1 LLEGA A 1
          INC NUMERO          'INCREMENTO EL CONTADOR
       ENDIF
    ELSE                      'SI RB0 ESTÁ A 0  
       FLANCO  = 1            'ACTIVO INTERRUPCIÓN POR FLANCO DE SUBIDA
       IF PORTB.1 = 1 THEN    'CUANDO RB1 LLEGA A 1
          DEC NUMERO          'DECREMENTO EL CONTADOR
       ENDIF
    ENDIF
     
  BIERB0 = 0                  'BORRO LA BANDERA PARA HABILITAR NUEVAMENTE  
                              'LA INTERRUPCIÓN
 CONTEXT RESTORE              'REESTABLECE EL CONTEXTO DE LOS REGISTROS COMO  
                              'ESTABAN ANTES DE UTILIZAR LA INTERRUPCIÓN
Voy a ver si me siento esta noche con mas tiempo y lo pasamos a PICBASIC PRO, Yo tenia un ejemplo mio de un encoder, pero no tengo ni la mas remota idea en que disco y en que carpeta esta
Lo use para hacer la version pbp de la fuente de baldeborre pero con un 18F2550 (use el mismo hardware por que es compatible pin a pin)....
Nos vemos Ferdy

---------- Actualizado después de 25 minutos ----------

D@rkbytes dijo: Ver Mensaje
Saludos.
Les traigo dos ejemplos de contadores 0-99 automáticos (Sin pulsador), usando el sistema multiplex.
En el primero utilice la conexión directa de los displays por el puerto B y dos displays de cátodo común.
En el segundo utilice un CI 7447 para la conexión de los displays y usando displays con ánodo común.
El ejemplo con el IC 7447 es más sencillo que el de conexión directa, ya que no requiere tabla de conversión.
Los ejemplos están comentados para su comprensión, y también adjunto los vídeos durante la simulación.
Muy buenos ejemplos... Otra de las maneras de realizar un contador de 0-99 o de 0-999 con tan solo dos pines, es implementando el CD4026 (Decade Counter / Decoder and Driver)... este trabaja por pulsos, lo cual, requiere un puerto para el clock y otro para el reset...
En la teoria, la hokja de datos comenta que se pueden controlar hasta 6 decoder, pero en la practica, yo personalmente en un cronometro, pude hacer funcionar a la perfeccion solo 5.
la conexion es mas que sencilla y para conectarlos en serie, tan solo hay que poner en carry los clock de los demas decoder... el MR (master reset) de cada integrado, van ligados todos juntos ...
Prometo subir algun diagrama y parte de la programacion.... saludos
27/03/2013 #2433

Avatar de isaiasjea

Hola:
Estoy empezando a desarrollar un programa para juegos con PIC, en la que al insertar una moneda, empiece el tiempo de juego. Mi primer programa lo hice con el pic16F628A y su correspondiente simulación y todo funciona bien, pero al migrar al pic 16F877A (por necesidad de mas puertos) el programa se salta al INICIO, sin necesidad de pulsar el botón (moneda). No entiendo en que me equivoqué, alguien tiene idea? O es una deficiencia de PROTEUS
Descarguen los archivos y prueben la simulación para ambos casos.
Saludos Mushito
tu codigo esta bien!!
lo unico que te faltaria es deshabilitar las salidas analogicas para que queden los puertos como digitales!
añadele esto a tu codigo y pruebalo.
ADCON1=7

Saludos y seguimos en contacto
27/03/2013 #2434


Gracias isaiasjea, ese era el pequeño gran detalle.
27/03/2013 #2435


Juegos Temporizados
Continuando con el proyecto aquí los adjuntos, pero necesito ideas para que con un evento externo (como una palanca mecánica y un switch, por ejemplo) se extienda el tiempo de juego, cargando el tiempo de juego nuevamente a 20 seg.
Aquí las simulaciones y el programa, pero no logro mi cometido.
Archivos Adjuntos
Tipo de Archivo: rar semi_completo16f877A.rar (37,0 KB (Kilobytes), 70 visitas)
27/03/2013 #2436

Avatar de inspector gadget

D@rkbytes dijo: Ver Mensaje
Así como tienes el programa no funcionará el contador del puerto D.
Y recuerda que los programas son secuenciales, primero verás el conteo de 0 a 9 en el puerto B,
y luego comenzara el conteo de 9 a 0 en el puerto D, y se repite el ciclo.
Para que funcione el contador del puerto D, solo tenías que hacerlo así...
Código:
inicio:
       for i = 0 to 9
       portb = i
       pause 100
       next i
              
       for i2 = 9 to 0 step - 1
       portd = i2
       pause 100
       next i2
       goto inicio
La palabra de configuración que utilicé fue ésta:
@ DEVICE HS_OSC, PWRT_ON, WDT_OFF, BOD_OFF

Para que te ahorres los dos decodificadores y trabajes los displays directamente, adjunto un ejemplo.

Suerte.
hola amigos, en estas vacaciones de semana santa ademas de orar, tambien le seguimos el ciclo al aprendizaje, y es por esto que me gustaria oir opinion de expertos sobre como es la estructura de un programa en la que tienen que leerse varias variables ya que como dijo Dark, el programa primero termina una tarea para despues encargarse de otra, y es por eso que no seria factible realizar un programa con 2 o 3 contadores al mismo tiempo y que cada uno lleve sus propios controles como inicio, reset etc, pero entonces como funcionan aquellos dispositivos que leen simultaneamete por ejemplo 5 temperaturas diferntes y la info la despliegan en una sola pantalla lcd, acaso son programas con otra estructura u otro lenguaje, no se podria realizar algo parecido para que cuenten 5 tiempos diferentes en un solo chip? talvez esto le este dando vueltas en la cabeza a muchos......agradezco mucho el aporte de varios foreros sobre los contadores, hay bastante para practicar y aprender.

---------- Actualizado después de 4 minutos ----------

torres.electronico dijo: Ver Mensaje
Tengo un ejemplo de marito saco por si te interesa... Lo unico que tiene, es que esta en PICBASIC (se entiende perfectamente y es sencillo como hay que hacer los cambios)...
aca lo cito:

Código:
'****************************************************************
'*  Name    : ENCODER.BAS                                      *
'*  Author  : Mario G. Sacco                                    *
'*  Notice  : Copyright (c) 2011  - NeoTeo                      *
'*          : All Rights Reserved                               *
'*  Date    : 07/07/2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

    'SELECCIONO PIC, CLOCK E INICIALIZACIÓN
    DEVICE = 18F2550        'SELECCIONO PIC Y CLOCK                    
    XTAL = 48                                
    
    'UTILIZO BOOTLOADER
    DECLARE PROTON_START_ADDRESS = $1000 ' INICIO EN DIRECCIÓN  $1000 
    
    CMCON = 7               'APAGO LOS COMPARADORES
    ALL_DIGITAL = True      'Y ANULO LAS ENTRADAS ADC (TODO DIGITAL)
    
    'DECLARO EL LCD
    LCD_DTPIN = PORTB.4        'SETEO EL LCD 16X2 PARA 4 CABLES
    LCD_RSPIN = PORTB.2
    LCD_ENPIN = PORTB.3
    LCD_INTERFACE = 4    
    LCD_LINES = 2
    LCD_TYPE = 0
    
    'REGISTROS DE LA INTERRUEPCIÓN
    SYMBOL BIERB0 = INTCON.1  'BANDERA DE INTERRUPCIÓN EXTERNA POR RB0 
    SYMBOL HEI    = INTCON.4  'HABILITACIÓN EXTERNA DE LA INTERRUPCIÓN POR RB0
    SYMBOL GIE    = INTCON.7  'HABILITACIÓN GLOBAL DE INTERRUPCIONES
    SYMBOL FLANCO = INTCON2.6 'FLAG=0>>>INTERRUPCIÓN POR FLANCO DE BAJADA
                              'FLAG=1>>>INTERRUPCIÓN POR FLANCO DE SUBIDA
    'DECLARO LA INTERRUPCIÓN
    ON_INTERRUPT GOTO SALTO   'SALTO A LA INTERRUPCIÓN

    'PARÁMETROS DE INICIO DE ALGUNOS REGISTROS
    GIE = 1                   'ACTIVO INTERRUPCIONES
    HEI = 1                   'ACTIVO INTERRUPCIÓN EXTERNA POR RB0
    FLANCO = 1                'AL INICIAR ACTIVO LA INTERRUPCIÓN


    DIM NUMERO AS WORD        'VARIABLE DE 0 A 65535         
    
    CLS                       'LIMPIO DISPLAY AL INICIAR
    
    NUMERO=127                'COLOCO LA VARIABLE AL CENTRO AL INICIAR             

'INICIO EL PROGRAMA PRINCIPAL  
INICIO:                       
     
     PRINT AT 1,1,"Encoder 18F2550 "
     PRINT AT 2,2,"      ",DEC NUMERO,"    "    'ESCRIBO EN PANTALLA 
     IF NUMERO <= 0 THEN NUMERO = 0     'TOPE MÍNIMO EN 0
     IF NUMERO >= 255 THEN NUMERO = 255 'TOPE MÁXIMO EN 255
     
     
GOTO INICIO                   'REINICIO EL CICLO 
'FIN DEL PROGRAMA PRINCIPAL             


'INTERRUPCIÓN                                
SALTO:                        'LEO EL ENCODER
       
 CONTEXT SAVE                 'GUARDA EL CONTEXTO DE LOS REGISTROS ANTES 
                              'DE EMPEZAR A TRABAJAR CON LA INTERRUPCIÓN
    IF PORTB.0 = 1    THEN    'SI RB0 ESTÁ EN 1
       FLANCO  = 0            'ACTIVO INTERRUPCIÓN POR FLANCO DE BAJADA
       IF PORTB.1 = 1 THEN    'CUANDO RB1 LLEGA A 1
          INC NUMERO          'INCREMENTO EL CONTADOR
       ENDIF
    ELSE                      'SI RB0 ESTÁ A 0  
       FLANCO  = 1            'ACTIVO INTERRUPCIÓN POR FLANCO DE SUBIDA
       IF PORTB.1 = 1 THEN    'CUANDO RB1 LLEGA A 1
          DEC NUMERO          'DECREMENTO EL CONTADOR
       ENDIF
    ENDIF
     
  BIERB0 = 0                  'BORRO LA BANDERA PARA HABILITAR NUEVAMENTE  
                              'LA INTERRUPCIÓN
 CONTEXT RESTORE              'REESTABLECE EL CONTEXTO DE LOS REGISTROS COMO  
                              'ESTABAN ANTES DE UTILIZAR LA INTERRUPCIÓN
Voy a ver si me siento esta noche con mas tiempo y lo pasamos a PICBASIC PRO, Yo tenia un ejemplo mio de un encoder, pero no tengo ni la mas remota idea en que disco y en que carpeta esta
Lo use para hacer la version pbp de la fuente de baldeborre pero con un 18F2550 (use el mismo hardware por que es compatible pin a pin)....
Nos vemos Ferdy

---------- Actualizado después de 25 minutos ----------



Muy buenos ejemplos... Otra de las maneras de realizar un contador de 0-99 o de 0-999 con tan solo dos pines, es implementando el CD4026 (Decade Counter / Decoder and Driver)... este trabaja por pulsos, lo cual, requiere un puerto para el clock y otro para el reset...
En la teoria, la hokja de datos comenta que se pueden controlar hasta 6 decoder, pero en la practica, yo personalmente en un cronometro, pude hacer funcionar a la perfeccion solo 5.
la conexion es mas que sencilla y para conectarlos en serie, tan solo hay que poner en carry los clock de los demas decoder... el MR (master reset) de cada integrado, van ligados todos juntos ...
Prometo subir algun diagrama y parte de la programacion.... saludos
Torres, esperamos ansiosamente tu aporte sobre contadores con 4026, mientras a chequear los datasheet de este cmos.
27/03/2013 #2437
Moderador

Avatar de D@rkbytes

Mushito dijo: Ver Mensaje
Continuando con el proyecto aquí los adjuntos, pero necesito ideas para que con un evento externo (como una palanca mecánica y un switch, por ejemplo) se extienda el tiempo de juego, cargando el tiempo de juego nuevamente a 20 seg.
Aquí las simulaciones y el programa, pero no logro mi cometido.
Tu código contiene varios errores, sobre todo en el control de la interrupción por cambio de estado RB4-RB7
Ya los corregí, y ahora al presionar el botón de tiempo extra, se reinicia el conteo a 29.

Suerte.

inspector gadget dijo: Ver Mensaje
¿como funcionan aquellos dispositivos que leen simultaneamete por ejemplo 5 temperaturas diferentes y la info la despliegan en una sola pantalla lcd,?
¿acaso son programas con otra estructura u otro lenguaje, no se podría realizar algo parecido para que cuenten 5 tiempos diferentes en un solo chip?
Leer información de varios sensores y luego mostrar la información en pantalla, no es difícil.
Tan solo se leen los sensores consecutivamente, se guarda la información en variables, se procesa y se muestra.
En el caso de sensores análogos como el LM35, realizar la tarea de leer varios y luego mostrar, es sencillo.
Cuando el proceso de lectura y conversión es semi complicado como el caso de un DS18B20,
entonces si puede demorar un poco la visualización si se usan varios sensores.
Aún así, para ambos casos no se requiere del uso de microcontroladores potentes.

Quizás este ejemplo que adjunto, te parecerá muy interesante, es sobre Pseudo Multitasking con PIC.
Hace ya algún tiempo que lo descubrí, y ahora los enlaces están rotos.
Pero por suerte logré descargar los archivos, y aquí se los dejo.
En el archivo viene la explicación de como funciona, y algunas librerías. "Está en inglés"

Nota:
El proyecto original usaba un PIC16F887A, yo lo adapte a un PIC16F88.
Como quiera dejé el archivo *.bas original sin realizar modificaciones.

Saludos.
Archivos Adjuntos
Tipo de Archivo: rar Mushito timer Corregido.rar (19,8 KB (Kilobytes), 104 visitas)
Tipo de Archivo: rar Pseudo Multitasking.rar (45,7 KB (Kilobytes), 87 visitas)
28/03/2013 #2438

Avatar de torres.electronico

inspector gadget dijo: Ver Mensaje
Torres, esperamos ansiosamente tu aporte sobre contadores con 4026, mientras a chequear los datasheet de este cmos.
Bueno, aca te subo el circuito basico que lo saque del manual que escribi para micros picaxe... basicamente es lo mismo... Como ejemplo, un programa para un picaxe 18X (pic16F88)



Un ejemplo sencillo de como se trabaja el CD4026:

Código:
;*****************************************************************
;*Proyecto: *
;*Timmer 60 segundos para calentamientos de ruedas en pruebas de 1/4 MILLA *
;*Desarrollado por: *
;*Ing. Martin A. Torres Fortelli *
;*****************************************************************
main:
if pin2 = 1 then main2         
goto main
main2:
let b2 = 60
gosub clock
goto main2
clock:
if b3 = b2 then endclk
for b3 = 1 to 60
pulsout 0,200          ;Pone en alto el pin del Clock
pause 1000
next b3
endclk:
pulsout 1,200            ; Pone en alto el pin del Reset
end
;*****************************************
;*************** Fin del programa ********
;*****************************************
Como veras, es re sencillo el programa y pasarlo a PBP, es copiuar y pegar nada mas...
acá el circuito del programa de ejemplo:
Imágenes Adjuntas
Tipo de Archivo: jpg CD4026.jpg (217,2 KB (Kilobytes), 445 visitas)
Tipo de Archivo: png CD4026_contador60_OFF.png (42,7 KB (Kilobytes), 434 visitas)
28/03/2013 #2439


Gracias Sr. Moderador
D@rkbytes

Su ayuda me permite avanzar en mi pequeño proyecto
28/03/2013 #2440

Avatar de inspector gadget

torres.electronico dijo: Ver Mensaje
Bueno, aca te subo el circuito basico que lo saque del manual que escribi para micros picaxe... basicamente es lo mismo... Como ejemplo, un programa para un picaxe 18X (pic16F88)

http://www.forosdeelectronica.com/at...1&d=1364447205

Un ejemplo sencillo de como se trabaja el CD4026:

Código:
;*****************************************************************
;*Proyecto: *
;*Timmer 60 segundos para calentamientos de ruedas en pruebas de 1/4 MILLA *
;*Desarrollado por: *
;*Ing. Martin A. Torres Fortelli *
;*****************************************************************
main:
if pin2 = 1 then main2         
goto main
main2:
let b2 = 60
gosub clock
goto main2
clock:
if b3 = b2 then endclk
for b3 = 1 to 60
pulsout 0,200          ;Pone en alto el pin del Clock
pause 1000
next b3
endclk:
pulsout 1,200            ; Pone en alto el pin del Reset
end
;*****************************************
;*************** Fin del programa ********
;*****************************************
Como veras, es re sencillo el programa y pasarlo a PBP, es copiuar y pegar nada mas...
acá el circuito del programa de ejemplo:
http://www.forosdeelectronica.com/at...1&d=1364447367
uyyyy profe que buen documento, muchas gracias, se lo va aseguir molestando para que nos colabore con documentos similares, a proposito, nos vendria bien a muchos, el conseguir su libro....pero donde....mil gracias

---------- Actualizado después de 4 minutos ----------

D@rkbytes dijo: Ver Mensaje
Tu código contiene varios errores, sobre todo en el control de la interrupción por cambio de estado RB4-RB7
Ya los corregí, y ahora al presionar el botón de tiempo extra, se reinicia el conteo a 29.

Suerte.


Leer información de varios sensores y luego mostrar la información en pantalla, no es difícil.
Tan solo se leen los sensores consecutivamente, se guarda la información en variables, se procesa y se muestra.
En el caso de sensores análogos como el LM35, realizar la tarea de leer varios y luego mostrar, es sencillo.
Cuando el proceso de lectura y conversión es semi complicado como el caso de un DS18B20,
entonces si puede demorar un poco la visualización si se usan varios sensores.
Aún así, para ambos casos no se requiere del uso de microcontroladores potentes.

Quizás este ejemplo que adjunto, te parecerá muy interesante, es sobre Pseudo Multitasking con PIC.
Hace ya algún tiempo que lo descubrí, y ahora los enlaces están rotos.
Pero por suerte logré descargar los archivos, y aquí se los dejo.
En el archivo viene la explicación de como funciona, y algunas librerías. "Está en inglés"

Nota:
El proyecto original usaba un PIC16F887A, yo lo adapte a un PIC16F88.
Como quiera dejé el archivo *.bas original sin realizar modificaciones.

Saludos.
en verdad interesante...esto va a ser productivo....gracias Darkbytes.
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.