Autor Tema: Como usar el tmr0 en PBP  (Leído 8713 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado khasistos

  • PIC18
  • ****
  • Mensajes: 493
RE: Como usar el tmr0 en PBP
« Respuesta #15 en: 09 de Febrero de 2004, 16:27:00 »
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

Desconectado ejmc

  • PIC18
  • ****
  • Mensajes: 311
RE: Como usar el tmr0 en PBP
« Respuesta #16 en: 09 de Febrero de 2004, 22:11:00 »
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






Desconectado khasistos

  • PIC18
  • ****
  • Mensajes: 493
RE: Como usar el tmr0 en PBP
« Respuesta #17 en: 10 de Febrero de 2004, 06:16:00 »
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

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: Como usar el tmr0 en PBP
« Respuesta #18 en: 10 de Febrero de 2004, 06:42:00 »
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...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado ejmc

  • PIC18
  • ****
  • Mensajes: 311
RE: Como usar el tmr0 en PBP
« Respuesta #19 en: 10 de Febrero de 2004, 12:10:00 »
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

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: Como usar el tmr0 en PBP
« Respuesta #20 en: 10 de Febrero de 2004, 12:18:00 »
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....
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything