desktop

Curso de programación de PIC en PICBasic Pro

hola amigos, verán estoy desarrollando un programa en pic basic y es para un pic16f877a para manejar un motor de paso a paso bipolar con pulsadores, (es para una maqueta de puerta de garaje) pero todo lo que logre hacer es uno automático.
gira 4 vueltas hacia arriba y 4 vueltas hacia abajo, pero ahora me piden que le agregue pulsadores, uno de arranque y otro de regreso y uno de pause según en caso de error y otro de arranque para que vuelva a funcionar como . eso es todo lo que necesito para que maqueta de puerta de garaje funcione.

por favor espero puedan ayudarme.
¿Y por qué no haces las rutinas para las funciones que requieres?
¿Ó cual es el problema?
 
mil gracias ferdy 575 he leido, te agradezco el aporte, voy a revisar las paginas anteriores para montarlo y seguir experimentando y concluyendo, quisiera por favor que me remitan a un proyecto que trate como ingresar datos en la eeprom del pic 16f628a, cuando desconecte la energia, la ultima cuenta permenezca hasta que nuevamente encienda, me parece muy util ahora que estoy aprendiendo sobre contadores. gracias por su ayuda amigos.
 
hola amigos, alguien tiene un ejemplo de como generar tonos por un pin del 16f628a en pbp?
he usado FREQOUT portb.0 2000,7200 con un buzzer pasivo, y funciona pero todo el problema es que el volumen es demasiado bajo, a pesar de combinar distintas frecuencias, como hacer para aumentar su volumen , algo parecido al pitido que genera mi pc al encender? lo necesito para implementarlo al temporizador y lo que pretendo es que suene duro sin importar el lugar que me encuentre, y he visto aparatos que con estos buzzer pasivos suenan bastante duro en estados de alarma, no quiero usar chicharras, su sonido no es agradable...espero puedan colaborarme
 
hay miles de maneras de hacerlo... con un amplificador operacional, con un transistor, etc etc... hay que ver aq qeu llamas buzzer pasivo... yo conozco solo un tipo de buzer... que impedancia tiene? para que tension es? son muchas las cuestiones y sin muchos datos / imagenes / diagramas, no se por done arrancar para orientarte
 
Buenas tardes hermanos del maravilloso mundo de los microcontroladores
acabo de adquirir un modulo bluetooth (JY-MCU V1.05).
bluetooth_03.jpg

trabaja por comunicación serial tipo serial-UART.
ya lo tengo funcionando con un Arduino UNO R3.
y funciona muy bien , el programa es sencillo cuando mando un "1" serial prende un led y cuando mando "2" se apaga el led.
ya sea comandado por la pc o por android.

el problema es cuando quiero usarlo con un PIC16F628A
cuando hago la comunicación de PIC a PIC el codigo funciona tanto en simulacion en proteus como fisicamente, pero cuando lo hago por medio del bluetooth ya no funciona.
el modulo funciona Default Baud Rate: 9600,8,1,n.
les agradesco, si me pudieran echar una manita gracias el Código es el siguiente:

Código:
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
@ device  pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_off, lvp_off, protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7                     
TRISA = %00000000
TRISB = %00000010
'*******************************************************************************
DEFINE HSER_BAUD 9600
DEFINE Hserial_RCSTA %10010000
DEFINE Hserial_TXSTA %00100100
DEFINE Hserial_Clear On
dato var byte
'*******************************************************************************
PORTA = %00000000
PORTB = %00000000
'*******************************************************************************
inicio:
HSERIN 50,inicio,[Dato]

if dato = 1 then
PORTA.0 = 1
pause 500
goto inicio
endif
if dato = 2 then
PORTA.0 = 0
pause 500
goto inicio
endif
END

Adjunto simulacion Funcionando en proteus PIC a PIC.

Gracias y seguimos en contacto.
 

Adjuntos

  • USART-PIC16F628A.zip
    16.8 KB · Visitas: 121
Última edición:
acabo de adquirir un modulo bluetooth (JY-MCU V1.05).
trabaja por comunicación serial tipo serial-UART.
ya lo tengo funcionando con un Arduino UNO R3.
y funciona muy bien , el programa es sencillo cuando mando un "1" serial prende un led y cuando mando "2" se apaga el led.
ya sea comandado por la pc o por android.

el problema es cuando quiero usarlo con un PIC16F628A
cuando hago la comunicación de PIC a PIC el código funciona tanto en simulación en proteus como físicamente, pero cuando lo hago por medio del bluetooth ya no funciona.
el modulo funciona Default Baud Rate: 9600,8,1,n.
Al parecer esos módulos se comunican por medio de comandos AT.
Lee esta información, quizás te pueda servir: Setup JY-MCU BT BOARD v1.2

Suerte.
 
Buenas noches!!

Al parecer esos módulos se comunican por medio de comandos AT.
Lee esta información, quizás te pueda servir: Setup JY-MCU BT BOARD v1.2

Suerte.

Gracias D@rkbytes por la información.
no tengo problemas en la conexión ni en la configuración, como comento anteriormente lo estoy usando con un Arduino UNO R3 y Funciona de 10.
la conexión se establece ya sea por medio de un celular Android de bluetooth a bluetooth, o si lo quiero comandar de PC se conecta por el bluetooth de la PC.
bluetooth_04.jpg

Con arduino funciona muy bien.
Arduino_Bluetooth.jpg

pero con el pic nop =(

Saludos y seguimos en contacto
 
hay miles de maneras de hacerlo... con un amplificador operacional, con un transistor, etc etc... hay que ver aq qeu llamas buzzer pasivo... yo conozco solo un tipo de buzer... que impedancia tiene? para que tension es? son muchas las cuestiones y sin muchos datos / imagenes / diagramas, no se por done arrancar para orientarte

gracias por responder amigo torres electronico, ya lo solucione y simplemente era que en el sitio donde lo compre me habian vendido un buzzer de mayor voltaje al que requería, lo cambie y listo. Me podrian orientar como es la configuracion de los fuses para un pic 16f877a en pic basic? quiero migrar el codigo de un temporizador que realice con un 16f628a este chip, mejor dicho quiero relizar el programa para 4 temporizadores de minutos en un solo chip pero con funciones totalmente independientes uno del otro, osea serian 8 displays de 7 segmentos, mas reset para cada temporizador y ortos aditamentos, y por el numero de puertos que requiero, he mirado este chip para usarlo. he visto contadores de 4 digitos usando un solo 7447 para manejar los 4 display y 4 transistores para la multiplexacion, quiere decir esto que puedo usar 4 pines de un puerto para manejar las entradas de un solo 7447 y otro puerto con 8 pines para los 8 transistores de la multiplexacion y crear los 4 temporizadores que necesito, usando en total para los 8 display solo 12 pines? ojala me puedan colaborar con estas respuestas y remitirme a algunos ejemplos sobre manejo de 16f877 y multiplexacion para displays ya que el tema no lo entiendo mucho. espero su colaboracion y ya posteare mis inicios para que me colaboren con la adaptacion del codigo al nuevo chip. mil gracias por su tiempo muchachos.
 
Última edición:
Saludos hermanos del maravillosa mundo de los microcontroladores!!

Gracias D@rkbytes por la información.
no tengo problemas en la conexión ni en la configuración, como comento anteriormente lo estoy usando con un Arduino UNO R3 y Funciona de 10.
la conexión se establece ya sea por medio de un celular Android de bluetooth a bluetooth, o si lo quiero comandar de PC se conecta por el bluetooth de la PC.

Final mente de hacer pruebas y consultando manuales de Pic Basic Pro, Dí con el problema de la comunicación del modulo bluetooth y el PIC16F628A. :D
El problema era que yo estaba guiado de un manual para programación en Proton IDE y no todas las funciones de Proton IDE son compatibles para Pic basic pro.
en el Código que publique anterior en la parte de :
Código:
'*******************************************************************************
DEFINE HSER_BAUD 9600
DEFINE Hserial_RCSTA %10010000
DEFINE Hserial_TXSTA %00100100
DEFINE Hserial_Clear On
Resulta que esas declaraciones son mas que nada para Proton IDE y en vez de usar DEFINE se usa Declare.
pero en pic basic pro se usan :
Código:
'*******************************************************************************
' INICIALIZANDO USART
SPBRG = 25
RCSTA = %10010000
TXSTA = %00100100
'*******************************************************************************
el cual configura el pin de TX y RX y los 9600 Baudios asignado. Comunicación Uart
otra cosa que modifique fue en la recepción de datos en la parte :
Código:
if dato = 1 then
PORTA.0 = 1
pause 500
goto inicio
endif
if dato = 2 then
PORTA.0 = 0
pause 500
goto inicio
endif
en los if cuando definimos el valor para el primer caso que es 1 debe de usar comillas para que detecte como caracter y gual en el caso 2 en el numero 2 debe usar comillas y se sustituyo por :
Código:
if dato = "1" then
PORTA.0 = 1
pause 500
goto inicio
endif
if dato = "2" then
PORTA.0 = 0
pause 500
goto inicio
endif

Finalmente ya estoy trabajando con el modulo Bluetooth Funcionando.
Gracias a todos ustedes.
Adjunto archivo funcionando.

Saludos y seguimos en contacto.
 

Adjuntos

  • Receptor-UART.zip
    967 bytes · Visitas: 138
hola a todos.
les cuento que revisando el sistema de los mouse ópticos encontré que el componente que va en la rueda hace dos pulsos en secuencia así: 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 y pensé sera que no se podrá controlar un servo con este sistema en lugar de un potenciometro? y escribí este código pero no funciona obviamente a primera vista se ve que tiene errores de sintaxis sera que alguien entiende lo que quiero hacer y puede ayudarme a ver como se corrigen estos errores?:unsure:
Este es el código:
Código:
'**********************************************************************
' control servo con pulsador rotativo
@ device pic16F628A,intrc_osc,pwrt_on,wdt_off,mclr_off,lvp_off,protect_off
DEFINE OSC 4
'**********************************************************************
CMCON = 7                              
TRISB = 0
PORTB = 0
'**********************************************************************
pulso1 var porta.0
pulso2 var porta.1
servo1 var portb.0
x var byte

x = 150

inicio:
pulsout servo1,x
gosub timer
goto inicio

timer: 
if            ; aquí sería sí primero pulso1 y luego pulso2 entonces ir a "mas"
pulso1 = 0 
pause 10 
pulso2 = 0 
pause 10 
then gosub mas 
endif
return

if            ; aquí sería sí primero pulso2 y luego pulso1 entonces ir a "menos"
pulso2 = 0 
pause 10
pulso2
pause 10
then gosub menos
endif
return

mas:
pause 10
x=x+1
if x > 250 then x = 250
return

menos:
pause 10
x=x-1
if x < 50 then x = 50
return
end
agradezco su colaboración
 
Última edición:
hola a todos.
les cuento que revisando el sistema de los mouse ópticos encontré que el componente que va en la rueda hace dos pulsos en secuencia así: 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 y pensé sera que no se podrá controlar un servo con este sistema en lugar de un potenciometro? y escribí este código pero no funciona obviamente a primera vista se ve que tiene errores de sintaxis sera que alguien entiende lo que quiero hacer y puede ayudarme a ver como se corrigen estos errores?:unsure:
Este es el código............

Hola ferdy... :unsure: eso es un encoder y obviamente se podria implementar para tu proposito (yo diria que es lo ideal (y) )...

Fijate que vos describis justamente los pulsos :
count_up_downENCODER.GIF
Solo tienes que tener en cuenta que el registro donde va a estar la variable para que sepa cual es la posicion (ida o venida), tiene que ser un espacio de memoria que no se borre o vea afectado por nada, ya que ahi esta el corazon del proyecto...
Buscate la hoja de datos de ese enconder por que los hay de distintos tipos, asi te doy una mano ;)
 
Última edición:
Hola ferdy... :unsure: eso es un encoder y obviamente se podria implementar para tu proposito (yo diria que es lo ideal (y) )...

Fijate que vos describis justamente los pulsos :
Solo tienes que tener en cuenta que el registro donde va a estar la variable para que sepa cual es la posicion (ida o venida), tiene que ser un espacio de memoria que no se borre o vea afectado por nada, ya que ahi esta el corazon del proyecto...
Buscate la hoja de datos de ese encoder por que los hay de distintos tipos, asi te doy una mano ;)

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
 

Adjuntos

  • 288 Rotary Encoder.pdf
    1.7 MB · Visitas: 90
Última edición:
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
 

Adjuntos

  • 16f877a.rar
    9.7 KB · Visitas: 86
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 [B]step - 1[/B]
       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.
 

Adjuntos

  • 16F877A Contadores.rar
    11.9 KB · Visitas: 123
Última edición:
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.
 

Adjuntos

  • New-16F877A.zip
    11.1 KB · Visitas: 141
Última edición:
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.

Aquí otro ejemplo de tu contador cambiando al mismo tiempo. :)

Saludos y seguimos en contacto.



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.
 
Última edición:
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:

Ver el archivo adjunto 89727
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 :unsure:

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

Adjuntos

  • 16F628A Contador 0-99 MPX_001.rar
    21.6 KB · Visitas: 169
  • 16F628A Contador 0-99 MPX_002.rar
    21.8 KB · Visitas: 155
  • Vídeos.rar
    123.4 KB · Visitas: 134
Última edició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:

Ver el archivo adjunto 89727
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 :unsure:



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" (y) 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 :apreton:
 
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.
 
Última edición:
Atrás
Arriba