TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: risanti13 en 04 de Febrero de 2004, 09:37:00
-
Quiero usar el Tm0 Como Contador De Eventos En PBp ,
lo he realizado introduciondo lineas en ensamblador para activar la cuenta en el tocki (pic 16f84) con un prescalaster 256 .
mi pregunta es que si existe un comando en Pbp para hacer esto.
gracias 






-
Hola risanti13,
yo a la fecha lo sigo haciendo en ensamblador, no e visto ningun comando en pb pro o plus que realize una funcion automatica de lo que quieres. Pero si alguien la conose no tardara en contestarte y asi seremos dos con una duda menos de estos bichos.
Saludos
-
entonces lo mas practico sera introducir un para de comandos en ensamblador para configurar el tmr0 e en PBP, y alamacenar el resutaldo en una variable.. eso creo
si me equivo me avisan ......





-
Hola risanti13,
pues yo solo uso ensamblador para esos casos, es mas practico, la verdad como tew digo, no se si haya una forma, pero prefiero hacerlo a la tradicional con ASM.
Saludos panas
-
Hola:
Disculpame pero me voy a referir al PIC BASIC PRO en el manual esta como usar el contador .Si te estabas refiriendo al PBPlus disculpa haberme entrometido...El manual hace una brevisima referencia en pagina 167,dice que si no usas las instrucciones nap y sleep el trmo puede ser usado Como? sabe dios o algun colega.Bromas aparte lo he visto en algunos de los manuales de aplicacion en el foro fijate por favor creo que si es posible.
Saludos
khasistos
-
Hola:
yo sabia que lo habia visto ,te lo busque y aqui esta,te lo mando a tu correo pues si no no entra la respuesta
Espero haber despejado tus dudas
Saludos
khasistos
-
Hola, vi eso que mencionas, pero dice que si no usas esas instrucciones, puedes utilizar el tmr0, pero no dice que se puede hacer en PBP, o no?............
Haver que dicen
-
Que onda ejdm,
a lo que se refiere Khasistos es a dar de alta REGISTROS! lo cual es diferente a tener un COMANDO especifico que lo haga automaticamnte, mira por ejemplo si quieres usar la USART de un chip, lo puedes hacer de dos formas con COMANDO en PBP o dando de alta los registro individuales, que es lo que le comentaba a Risanti13.
De la primer forma tienes que dar de alta los REGISTROS:
TXSTA,RCSTA,SPBRG,PIE1,PIR1, etc..como?
declarandolos asi:
TXSTA=%01010101, y asi sucesivamente
igual para el TIMER:
OPTION_REG=$55 "para un preescaler a 16,xxx milisegundos, con tiemr, etc
De la segunda forma aunque parecida pero no iGUAL es la de COMANDO (no confundir REGISTROS, con COMANDOS especificos)
seria:
usando el comando HSERIN .
Es por eso que yo opine que no habia COMANDOS especificos en un compilador, a menos que se refiera a los que se le habian dicho a risanti13, osease los REGISTROS.
Al que se refiere Khasistos es al REGISTRO TMR0 lo cual lo puedes volcar como variable o definir como constante asi:
Dim TIMER AS TMR0L.BYTE (aqui declaramos o le pusimos un alias al TIMER0 la L indica que es el Byte LOW (el primer byte del word, esto lo hacemos por si quieres usar un valor grande a la hora de igualarlo)
TIMER= 12345 z--- aplica este valor al timer previamente definido, o de otra forma se puede usar, esta no es la uncia!!
Hay otros REGISTROS como el PRODL (QUE GUARDA EL low BYTE DE LA MULTIPLICACION POR HARDWARE DE 8*8, SI FUERA PRODH SERIA EL HIGH BYTE)
En fin, la cantidad de REGISTROS depende desde luego del Micro que usemos, como si fuera ASM pero en luegar de moverlos con MOVWF los igualas directamente con el valor que necesitas en el registros, e ahi la diferencia entre REGISTRO (se necestita saber del micro DS y asm) y un COMANDO
Pero insisto un solo COMANDO que este hecho especificamente para contar los eventos del tocki usando el tmr y con preescaler, repito por segunda vez, no que yo sepa, y si alguein sabe un COMANDO , no REGISTRO, por favor haganlo saber a TODO el foroo .Hay hay que dar de alta registros primero (configurar timer) y otras cosillas, pero que un solo COMANDO (eS LO QUE PREGUNTA RISANTI13, NO QUE SI SE PUEDE USAR EN PBP) no lo e visto en mi version ni de PBP pro2.44 ni en mi version pbp plus 2.1.3. Favor de decirme cual es el comando.
"Quiero usar el Tm0 Como Contador De Eventos En PBp ,
lo he realizado introduciondo lineas en ensamblador para activar la cuenta en el tocki (pic 16f84) con un prescalaster 256 .
mi pregunta es que si existe un comando en Pbp para hacer esto . "
Khasistos, te gardeceria mucho si me dijeras cual es el COMANDO, gracias
SALUDOS PANAS
-
Hola Amigos:
He tratado con mis conocimientos de novato en el PBP de acercar lo que he podido relacionado al tema.Ahora no se porque se transformo en una discusion de conocimientos, acerque con mi mejor ONDA lo que tenia a mano con respecto al tema por si le servia a risanti no quiero ni quise entrar en discuciones tecnicas si es comando o modificacion de registros,de una u otra forma repito acerque lo que considere que podia ser util,si a alguien ofendi pido disculpas o si alguien se sintio agraviado por mi humilde respuesta le pido disculpas no deseo transformar esto en una competencia no lo es para mi que no estoy a la altura de los mas sabios.Asi que concluyendo registro o comando ,yo aporte lo que tenia si sirvio para algo enhorabuena y si no sirve me lo dicen y listo.Aqui estoy para compartir TODO lo que tenga sin restricciones si es bueno mejor y si no lo es tanto por favor amigos no entremos en competencia no es mi intencion...
Un gran abrazo para todos y a vos pana no te pongas asi....no es para tanto........je je....yo no compito ,miro desde afuera .....
ABRAZOS
khasistos
Esto es lo que subi,LA MODIFICACION DE REGISTROS:::::
symbol LED = PORTB.1
TRISB = 0 "
PORTB = 0
INTCON = %00100000
OPTION_REG = %10000100
brojac = 0
TMR0 = 96
On Interrupt Goto ISR
INTCON = %10100000
Main:
if brojac = 200 then toggle LED
brojac = 0
endif
goto Main
Disable
ISR:
brojac = brojac + 1
TMR0 = 96
INTCON.2 = 0
Resume
Enable
End
-
Hola Khasistos,
Yo no veo la discusion, al contrario creo que este foro es para aportar informacion, y aqui la mayoria somos novatos ( INCLUYENDOME) , solo exprese lo que sabia, y por lo que veo no me supe expresar (veo que asi lo tomaron), pero repito yo no lo exprese como discusion, ni competencia,ni nada similar en este foro en la mayor parte de mis conocimientos se los debo a ustedes y muchos mas que han aportado con anterioridad informacion muy interesante y valiosa para mi, y es mi deber devolver todo lo que se tratando de ayudar a quien empieza. Asi que a dejar de discutir panas y a programar , que estos bichos cada ves tienen mas cosas.
Saludos panas
-
Hola a todos
, khasistos creo que esa es una forma facil, le pongo un boto.
-

Hola Compañeros del foro:
He Intentado Varias formas, pero hice in programa en PIc BAsic Plus que lo simule en proteus y resulto aqui esta:
Device 16F84
XTAL 4
"definicion LCD
DECLARE LCD_TYPE ALPHA
Declare LCD_DTPIN PORTB.4
Declare LCD_RSPIN PORTB.3
Declare LCD_ENPIN PORTB.2
Declare LCD_LINES 2
Declare LCD_INTERFACE 4
TRISA=%00001000
TRISB=255
dim cuent as byte
ASM
BSF 03,5
MOVLW B"00110000"
MOVWF OPTION_REG
BCF 03,5
ENDASM
CUENTA:
@ clrF TMR0
HIGH PORTA.4
PAUSE 1000
LOW PORTA.4 " para que el tmro no se incremente
ASM
movF TMR0,W
movwf cuent
ENDASM
cuent=cuent*2
PRINT $FE, 2, DEC cuent,"hz"
GOTO CUENTA
Esto lo hice en PIc BAsic PLus Y por lo menos si inyecta un frecuencia de 50 Hz en el Tocki El LCd se visualiza los 50Hz
mi duda es que si se puede hacer un arreglo para que es conteo se mas de 8 bits , o que cuentado lleve el tmr0 a su valor limite superior incremente otra variable y asi lograr una cuenta mas larga
todo esto es por que quiero hacer un frecuencimetro pero quiero
yo diseñar el programa....
Gracias por su ayuda especialmente lager y khasistos/TMR0 y a los demas del foro.. que en este tiempo que llevo en los pIC he aprendido gracias a las respuestas y preguntas de todo ....muchas gracias ......
Risanti 



-
Hola:
Te contesto al vuelo ,si hay forma de incrementar una variable tomando como referecia el desbordamiento del TMR0,hay un bit que te indica que el TMR= ha llegado a su final,pero si no quieres usar eso se me ocurre no dejar desbordar el TMR0 predefinirle un valor de conteo y luego con instrucciones if XX then =n+1 puedes tener todos los valores dado que cada variable que operes para un muestreo de 6 digitos estara compuesta por una variable que llege a nueve e incremente la proxima.Puedes hacer todo con 8 bits ,asi hice un contador hasta el numero que yo quisiese ,incrementando hasta nueve cada digito y el proximo seria 10 .No se si esta bien explicado o no pero es lo que recuerdo del contador .Otra seria que el bit de desbordamiento del TRM0 indique que pasarias al segundo octeto y tendrias un numero de 16 bits ,pero contarias hasta 65535 claro que con otras operaciones relacionadas podrias segirlo.CREO que la mas sencilla es la primera tomar digitos individuales e incrementar cuando se llege a 9 Su analogia mecanica seria como los contadores mecanicos esos de los viejos grabadores cuyas ruedas con numeros poseian u gatillo en el nueve para arrastrar el digito siguiente...Espero haberte sido algo util
Saludos
khasistos
-
BUneas

Para aumentar la cuenta no se usa el prescaler?
-
QUE ONDA,
Mira aumentar el timer0 no se puede ya que es solo de 8 bits(limitado), podrias usar un timer1 (pic16f628) pero este nada mas tiene 16 bits(no pasarias la escala de los 65khz), la forma mas eficiente seria usar la interrupcion del timer para incrementar la vairable 255 veces cada ves que suceda, ¿cuando sucede? cuando el timer cuenta mas de 255 bits (acuerdate que es una resolucion de 8 bits) por eso nada mas llegaria a 255(510 hz) solo tienes que configurar EL REGISTRO INTCON=%..... para habilitar la interrupcion de desborde del timer0, cada vez que desborde(dependiendo de el numero de pulsos , osea de la frecuencia de ingreses en el) ,cada ves que sobre pase los255 pulsos, sume 255 y limpies la interrupcion,por que si no no volvera a ir a la posicion de interrupciones y de ahi sume 255. cuantas interrupciones haya sera reflejado en la suma final y tu formula.
si suceden 2 interrupciones seran 510 pulsos(2*255) sumados o extras a el conteo del ultimo timer.
Asi pienso que te funcionaria tu frecuencimetro(creo que tiene limitante a 50 mhz, no me acuerdo bien
)
En lo que respecta alo que preguntas ejmc, sip , el prescaler hay que definirlo, con el registro OPTION_REG, los primeros 3 los definen y el 4 define si usas timer o perroguardian.
Otro comentario ejmc, podrias tambien usar los registros directos que usas en tu programa como OPTION_REG, no es necesario que entres en modo asm y cambies bancos, los compiladores aceptan la declaracion de estos registros directamente.
Sañudos panas
-
Escrito originalmente por ejmc
BUneas
Para aumentar la cuenta no se usa el prescaler?
Tengo entendido que el prescaler divide por n el numero de pulsos ingresados...
Asi por ejemplo si programas el prescaler X16 cada 16 pusos de ingreso solo se contara 1.
Saludos
khasistos
-
Entendido lo del preescaler

Ahora hay algo que ya pregunte en otra parte que hablaban de esto y no se entendia lo que queria saber, haver si en esta tengo suerte. Lo hago en forma de cuentito para que sea mas claro lo que quiero preguntar 
Supongamos que quiero contar cuantas personas subieron una escalera durante el dia. Para eso pongo un pulsador en el primer escalon y cuento las veces que fue pisado. La cuenta la habilito por medio de una llave.
llave var portb.1
pulsador var portb.2
contdes var word "CON ESTA GUARDO EL NUM DE DESBORDAMIENTOS
contact var word "CON ESTA GUARDO EL NUM ACTUAL DEL TIMER
total var word "Y AQUI GUARDO EL TOTAL DE PULSOS
Ahora pongo la configuracion de registros que no lo hago porque no lo tengo muy claro, pero pongo el prescaler en 255 y havilito la interrupcion por el desbordamiento del timer
Principal:if llave = 1 then cuento
goto llave
Cuento:if llave = 0 then resultado
goto cuento
resultado:contact = timer0
total = contdes*256 + contact
Y MUESTRO EL RESULTADO EN UN DISPLAY
"ETIQUETA DE INTERRUPCIONES:
Desbordo:contdes = contdes+1
aca tengo que poner en cero el timer?
y vuelvo a ``cuento´´
Si ya se esta lleno de errores, pero por haberlo hecho en un minuto 


Lo que quiero saber es si lo que esta en rojo se vale, haver si en esta la saco
-
Hola Juan:
Mira por lo que tengo entendido ,la activacion del TMR0 en PBP requiere la utilizacion de rutina asm en la entrada del prog.Asi definimos la utilizacion del TRM0,prescaler,clock de conteo externo/interno,asignacion de una variable al bit de desbordamiento,y clear de TRM0,aqui pego un prog de ejemplo del libro que si bien no es especificamente lo que quieres hacer te da una orientacion de como se maneja .Lo que yo he hecho fue un contador programable pero todo en asm,la teoria era que el TRMO contaba libre hasta 255 sin utilizar el desbordamiento,convertia de bin a decimal y tenia asignadas variables a cada digito del conteo,si estaban en 9 el proximo paso era el logico 0 y el comienzo del icremento en la proxima,asi hasta llegar al 9 nuevamenteEs decir todas contaban hasta el 0 momento en el cual se incrementaba el conteo en la siguiente Todas eran vigiladas en su conteo.Otra mas facil seria utilizar el conteo del TRM= y el bit de desbordamiento como multiplicador del fin del prescaler es decir si se desbordo dos veces tendriamos 2x 255 y asi susecivamente.El bit de desbordamiento incremetaria una variable que seria el multiplicador..Hay otra que se me ocurre sin recurrir a manejar asm Hay una instruccion en PBP que es pulse IN que si no me equivoco mide el ancho de pulso ingresado se podria usar matematicamente sabiendo que en tu caso todos los pulsos van a ser iguales para sumando todos loa valores y dividiendolos por cada ancho de pulso saber cuantos ingresaron MAS FACIL:ESO SI si quisiera tener total precision deberia pasar el puso por un monoestable para garantizarme que no exista variacion en los mismos..SE ME ocurre espero no estar delirando seria una forma de obviar el tan conflictivo TRMO.Bueno si quieres el que hice en asm pedimelo y aqui te pego el ejemplo del libro solo para orientacion y QUE LOS SABIOS ME JUZGEN...........
Saludos
khasistos
** Disable the watchdog timer **
@ Device wdt_off
Include "Modedefs.Bas"
Include "2k_Int.Inc" " Load the Interrupt register context saving macros
" ** Setup the Crystal Frequency, in Mhz **
Define OSC 4 " Set Xtal Frequency
Define INTHAND My_Int " Point to the Assembler interrupt handling routine
" ** Assign the connections to the Green LED **
Green_Led Var PortA.0
" ** Declare the bits and flags of the various registers **
T0IE Var INTCON.5 " Timer0 Overflow Interrupt Enable
T0IF Var INTCON.2 " Timer0 Overflow Interrupt Flag
GIE Var INTCON.7 " Global Interrupt Enable
PS0 Var OPTION_REG.0 " Prescaler division bit-0
PS1 Var OPTION_REG.1 " Prescaler division bit-0
PS2 Var OPTION_REG.2 " Prescaler division bit-0
PSA Var OPTION_REG.3 " Prescaler Assignment (1= assigned to WDT)
" (0= assigned to oscillator)
T0CS Var OPTION_REG.5 " Timer0 Clock Source Select (0=Internal clock)
" (1=External PORTA.4)
RBPU Var OPTION_REG.7 " PortB pullups (1=disabled, 0=enabled)
Goto Over_Interrupt " Jump over the interrupt handler
" This is our Interrupt handler subroutine
" It flashes an LED connected to PortB.0
" every time the interrupt is called
Asm
My_Int
Int_Start ; Context saving Macro
Movlw 255 ; Xor PortB with 255,Which will turn on on one interrupt
Xorwf PortB ; and turn off on the next, the led connected to PortB.0
Bcf INTCON,T0IF ; Clear the TMR0 overflow flag
Int_End ; Context restore and exit interrupt maco
Endasm
" ** THE MAIN PROGRAM STARTS HERE **
Over_Interrupt:
TrisB=0 " Configure PortB as all outputs
GIE=0 " Turn off global interrupts
While GIE=1:GIE=0:Wend " Make sure they are off
PSA=0 " Assign the prescaler to external oscillator
PS0=1 " Set the prescaler
PS1=1 " to increment TMR0
PS2=1 " every 256th instruction cycle
T0CS=0 " Assign TMR0 clock to internal source
TMR0=0 " Clear TMR0 initially
T0IE=1 " Enable TMR0 overflow interrupt
GIE=1 " Enable global interrupts
" This is the main program loop
" All it does is flash a Green LED connected to PortA.0
" every half a second
Again: High Green_Led " Turn on the Green LED
Pause 500 " For .5 seconds
Low Green_LED " Turn off the Green LED
Pause 500 " For .5 seconds
Goto Again " Do it forever
-
La int por tmr0 se puede atender totalmente en PBP, sin assembler.
Hay un ejemplo de un reloj en Rutinas y programas en PBP, busquenla alli...
No creo que sea mas exacta que en assembler, pero igual anda...

-
Gracias muchachos por sus respuestas

Lo que queria saver hera eso de rojo que lager me confirmo. Haciendo:
timer var word
timer=tmr0
Y asi tengo el valor del tmr0 guardado en la variable ``timer´´
Una ultima cosita: Si ocurre una interrupcion en PBP mientras se esta ejecutando una instruccion ``Pause 1000´´ hasta que no termine la pausa no atiende a la interrupcion, con el timer se tiene algun problema de estos, ademas de que no atienda a la interrupcion. Bueno eso nomas
-
Cambia el Pause 1000 por:
For I = 1 to 1000
Pause 1
Next I
De esta forma cuando caiga la interrupcion la demora en atenderla no sera superior a 1 milisegundo.
Si necesitas esperas menores utiliza Pauseus, con la cantidad de microsegundos que crees posibles de esperar sin dañar la deteccion....


