TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: marce0252 en 02 de Noviembre de 2006, 23:05:31
-
:-/ hola a todos
Tendo que contar los pulsos de un encoder de 1000 pulsos por revolucion pero este esta alimentado con 12V y tengo que pasarlo a 5V para poder leerlo con un pic 877. Y cuestion es como hacer esto. y por otro alguna linea de codigo de PBP para poder contar los pulsos continuamente y no en un determina tiempo como la instruccion COUNT.
agradeceria mucho a cualquiera que me pueda dar una mano. chauu :mrgreen:
-
Puedes poner una resistencia, para reducir tension.
-
:) gracias. mi otro problema es el del codigo en pbp para leer pulsos del encoder continuamente y almacenarlo en una variable. :?
-
Hola:
Puedes utilizar esta funcion:
PULSIN Pin,State,Var
Measures pulse width on Pin. If State is zero, the width of a low pulse is measured. If State is one, the width of a high pulse is measured. The measured width is placed in Var. If the pulse edge never happens or the width of the pulse is too great to measure, Var is set to zero. If an 8-bit variable is used, only the LSB of the 16-bit measurement is used. Pin may be a constant, 0 - 15, or a variable that contains a number 0 - 15 (e.g. B0) or a pin name (e.g. PORTA.0). The resolution of PULSIN is dependent upon the oscillator frequency. If a 4MHz oscillator is used, the pulse width is returned in 10us increments. If a 20MHz oscillator is used, the pulse width will have a 2us resolution. Defining an OSC value has no effect on PULSIN. The resolution always changes with the actual oscillator speed.
Example
' Measure high pulse on Pin4 stored in W3
PULSIN PORTB.4,1,W3
-
gracias. :)
Pero esta funcion de PULSIN mide solamente el ancho de pulso. Como hago para poder contar los pulsos uno a una para poder ir incrementando una variable? Yo use COUNT pero solo cuenta en un determinado tiempo prefijado en milisegundos. Hay otra forma.
saludos :P
-
Podrias adaptar el pulsin para que te cuente todo un pulso uno alto y uno bajo, pero si lo unico que quieres que cuente es una señal on/off crea una rutina que sea capaz de contar las veces que se enciende el pin especifico donde mides por ejemplo un pulso cuadrado de 3 ondas serian 3 ons con sus respectivos offs talvez si haces una rutina que incremente una variable cada que se prenda el pin.....
Por aqui en el foro hay varios temas asi pero usan count y pulsin por que no los checas, quizas te sirvan???
Suerte
-
Pulsin te cuenta el tiempo en que una terminal pasó de un estado a otro.
Count te cuenta las veces que esa terminal cambió de estado en un tiempo.
Puedes usar los contadores en hardware, con esos no hay límite de tiempo y su respuesta al cambio es rápida.
-
:shock: MARIO
Como hago por hardware? tenes algun ejemplo... eso seria barbaro por el tiempo de respuesta, ya que la señal del encoder va a variar segun la velocidad y nose la frecuencia de los pulsos.Cuanto mas rapido y confiable MEJOR... :)
-
Ve a ésta página y baja el archivo counter.zip que está al final de la página.
Utiliza un 18F84 pero la configuración es la misma para todos los timers de µicrochip.
En este caso usa el TMR0 y revisa sobreflujo; puedes usar el TMR1 que trae el 16F877 ya que es de 16 bits ó, puedes usar el TMR0 del 16F877 y utilizar el código.
Sería recomendable que realizaras una búsqueda dentro del foro para saber si ya hay programas o temas que se relacionen con lo que buscas.
http://www.microengineeringlabs.com/resources/samples.htm
-
:mrgreen: GRACIAS muy buen dato.
Porfavor Algun ejemplo para configurar TMR1 del 877 para que cuente e incremente una variable por que no termino de entender bien el tema de PIR1 y PIE1 y la configuracion de la interrupcion.
El donde entra la señal es el RC0? .
Como se detecta la interrupcion cuando se inyecta señal en el pin?
Perdonen si insisto pero este tema me rompe la cabeza :(
Y me fije los ejemplos del foro de PBP me falta entender... :? :?
-
El paso de 12V a 5V lo podrias hacer con un transistor, polarizando la base con 12V y una resistencia de unos 10k y el colector con 5V con una resistencia de 1k por ejemplo, o con un optoacoplador que seria lo mas recomendable (un optotransistor PC817 por ejemplo), con el otro asunto, la opcion de PULSIN es buena si lo que quieres es un "tacometro", si quieres contar los pulsos, yo me inclinaria por contarlos por interrupcion por Rb0 o por interrupcion por cambio de estado en el puerto B, asi cada que tienes una interrupcion haces que se incremente en uno un registro, y luego con ese registro puedes hacer lo que sea. En el datasheet del 877 esta como manejar las IT ya sea por RB0 o por el modulo CCP, claro que las configuraciones te las dan en ASM. Si tienes algun problema yo te puedo ayudar con un algoritmo de programa o mejor aun con algun segmento de programa. Saludos
-
El meterse con interrupciones es muy complicado para lo que pides.
Si se incrementa RC0, se incremeta el TIMER1; primero el TMR1L y luego el TMR1H.
No necesitas interrupciones.
Revisa la hoja de datos en el TIMER1 y te darás cuenta.
Regresaré en la noche, te pondré un código simple.
-
Releí el tema y creo que si necesitarás una interrupción pero primero necesito saber una cosa:
¿Sabes manejar interrupciones?
Si no lo sabes, puedes preguntar por TMR1IF (creo que asi se llama) sin necesidad de activar las interrupciones. Esta bandera se activa cuando el contador/timer 1 tiene sobreflujo de 16 bits a 17. Si está activada quiere decir que hubo sobreflujo y que debes incrementar un registro.
El valor en dicho registro equivale a (65536)(#en registro) ya que cada incremento en él representa 65536.
Busca en el foro cómo configurar interrupciones en basic ó mejor aún, busca en el manual del PBP, al final dice cómo hacerle.
Si no puedes, considero que primero deberías crear un tema sobre cómo manejar interrupciones en PBP; después regreses a este. Pero en el foro debe haber ejemplos.
-
:) BUENO SEGURO QUE HAY QUE REVISARLO PORQUE NO FUNCA, SEGURO QUE ALGO LE FALTA... :mrgreen:
POR QUE NO CUENTA Y PORQUE NO TENGO CLARO EL TEMA... SI PUEDEN AYUDARME A QUE FUNCIONE.
MARIO: cuando hay superflujo es cuando TMR1 conto arriba de los 65536 y hay que limpiar a cero TMRIF (PIR1.0 = 0)?
y el papel de PIE1.0 ?? __Gracias por tus consejos y perdon mi ignorancia... es la unica forma que tengo de aprender. :mrgreen:
' INYECTO UNA SEÑAL CUADRADA EN EL PIN RC0
DEFINE OSC 20
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 4
DEFINE LCD_LINES 2
Contador var word 'variable a incrementar
Contador.lowbyte = TMR1L
contador.Highbyte = TMR1H
TMR1L = 0
TMR1H = 0
INTCON = %11000000 'prende las interrupciones globales y perifericas
T1CON = %00000011 'prende el TMR1 y habilita el pin RC0 como fuente ext. de reloj
PIR1.0 = 0 'limpia bandera de superflujo de TMR1
PIE1.0 = 1 'habilita interrupcion periferica de superflujo de TMR1
on interrupt goto Encoder 'interrupcion en PBP
enable
pause 400
Lcdout $FE,1,"Contador"
while 1=1 'bucle principal
pause 200
low portb.7 'apago led para saber cuando estoy en el bucle
lcdout $FE,$C0,dec contador 'muestro el conteo en LCD
wend
disable
Encoder: ' Interrupcion
high portb.7 ' prendo un led para ver si entro en la interrupcion
Contador = Contador + 1 '????????
resume
enable
-
Por lo que has escrito creo que nunca verás la actualización de cada revolución; solo verás cada incremento cuando exista sobre flujo en el LCD.
Además que nunca verás (si tienes vista biónica si :D) el led prendido cuando exista sobreflujo porque no le asignas ningún retardo.
Y todo eso lo sabrás una sola vez ya que no borras la bandera de interrupción.
No es recomendable usar las interrupciones en Basic, toman tiempo...... luego te explico. Dame tiempo, hoy en la noche te hago un programa con interrupciones en ensamblador usando Basic (mezcla) en donde siempre estés viendo el incremento de sobreflujo en el LCD en la línea 1.
-
Listo, 345 líneas de las 8192 para un 16F877.
Utilicé la ayuda que te viene en el PBP (muy útil).
-
:-/ :-/ :-/ FUNCIONA GRACIAS MARIO SOS UN CAPO :-/ :-/
Lo unico que cambie fue esta linea porque no aparecia nada en el LCD
T1CON = %00000001 'prende el TMR1 y habilita el pin RC0 como fuente ext. de reloj
le active el T1CON.1 = 1
funciono pero en la simulacion del PROTEUS el display del LCD PARPADEA es asi? o falta algo? al codigo .... :-)
-
Que extraño que no funcione con todo lo binario....... pero suele pasar.
Sobre el parpadeo:
Es normal, solo agrégale una pausa de un cuarto o medio segundo después de la segunda línea.
Parpadea porque se está actualizando rápidamente, escribe y borra, no deja nada de espacio.