Autor Tema: No logro Dominar Timer 1 del 16F628A  (Leído 5969 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Memin_Pic

  • PIC10
  • *
  • Mensajes: 3
No logro Dominar Timer 1 del 16F628A
« en: 25 de Mayo de 2010, 20:54:37 »
Bueno, resulta que debo hacer un proyecto para el colegio y necesito hacer funcionar 4 servos con un Pic, me he conseguido un 16F628A y un cristal de 20 Mhz, he leido el algoritmo de redpic sobre control de 8 servos usando el timer 1 y pretendo adaptar el codigo a Pic Basic Pro (que es el unico que me se) y utilizarlo en mi tarea. Anteriormente he hecho programas con luces y cosas asi y solo utilizando el timer 0 del pic. Pero por mucho que intento no logro dominar el timer 1 y se me acaba el tiempo para presentar mi proyecto. He hecho un programa simple para ver el funcionamiento del timer pero no me resulta, este es el programa:


symbol led1 = PORTB.4
symbol led2 = PORTB.5

x var byte


TRISB=%00000000
TRISA = %11110000
PORTB = %00000000
PORTA = %00000000

CMCON = 7

T1CON=%00000011

INTCON=%11010010

PIR1.0 = 0
PIE1=%00000001

on interrupt goto ISR

Main:
if pir1.0 = 1 then goto ISR
if x = 100 then
    if led1 = 0 then
     high led1
    else
     low led1
    endif
    x = 0
endif

goto main


disable
ISR:
x = x +1
PIR1.0 = 0

resume
enable

end


Lo que quiero conseguir es que el led se encienda cada 1 seg y fraccion, pues tengo entendido que con el timer 1 y un cristal de 20 Mhz y prescaler 1:1 el timer se desborda cada 13,1072 ms, ¿correcto?. Bueno solo quiero probar con esto que el timer funciona adecuadamente y luego aprender a precargar el timer. Por favor si alguien puede correguir este programa y decirme como debo precargar el timer, si dandole un valor a TMR1H o a TMR1L o Ambos para asi luego poder hacer el programa que necesito . En fin, se que debe ser una tonteria pero no encuentro la solucion. Gracias de antemano.

Ps: por si acaso estoy simulando en proteus 7.6 con PBP 2.50

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: No logro Dominar Timer 1 del 16F628A
« Respuesta #1 en: 26 de Mayo de 2010, 08:32:15 »
Código: vb.net
  1. 'Configuracion Timer1 a 1mSeg. con clock de 20Mhz.
  2. T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
  3. T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
  4. T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
  5. TMR1H = 0xec  'carga el registro del contador para que desborde cada 1mSeg, byte alto
  6. TMR1L = 0x78  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
  7. T1CON.TMR1ON = 1  'habilitacion del TMR1, comienza a incrementarce
  8. 'PIE1.TMR1IE = 1  'activa las interrupciones del timer1
  9. 'INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
  10. 'CALCULO TIMER PARA 1 mSeg. a 20Mhz y prescales 1:1
  11. '(0.001Seg/(1/(20000000/4)))- 65536 = 60536 = EC78Hex.
  12. 'La formula la he puesto de memoria, pero creo que esta bien punto + o punto - (+/- 0.2uSeg.).
  13. 'Si se usan los divisores ya cambia la formula.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: No logro Dominar Timer 1 del 16F628A
« Respuesta #2 en: 26 de Mayo de 2010, 12:11:12 »
Comprobación:
Máximo valor del registro contador del timer1 65535+1=65536
Valor de inicio del contador del timer1 60536
Tiempo de ejecución (incremento de Timer1) del Pic a 20Mhz = 1/(20000000/4)=0.2uSeg.
(65536-60536)*0.2uSeg.=1000uSeg=1mSeg.
Saludos desde Granada, España.

Desconectado Memin_Pic

  • PIC10
  • *
  • Mensajes: 3
Re: No logro Dominar Timer 1 del 16F628A
« Respuesta #3 en: 04 de Junio de 2010, 22:15:00 »
gracias por tu respuesta me ayudo ,ucho. Pero  ahora me surgio otra duda. ¿existe una forma o rutina para que el pic carge automaticamente el timer1?, he visto que en C existe una comando set_Timer1= 60000 (ejemplo), ¿existe un comando orutina similar para pbp? si es asi como lo hago, pues como me dijiste al cargar el timer pongo TMR1H = $CB: TMR1L=$96 (por ejemplo) pero para hacer esto carg manualmente los registros, lo cual me limita mucho. Me podrias decir alguna forma de dividir el numero y asignar cada valor al registro correspondiente con el pics. Quizas la pregunta es muy basica pero estoy en pañales con esto de los pics y no he encontrado ejemplos en pbp que me sirvan. Bueno de nuevo gracias y espero tu respuesta con ansias. Perdon si me tardo en responder pero ya no cuento con internet en mi casa asi que tengo que recurrir al del colegio.

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: No logro Dominar Timer 1 del 16F628A
« Respuesta #4 en: 04 de Junio de 2010, 23:02:39 »
Hola memin, en el manual de PBP estan los comandos para utilizarlo.

Esto es lo que dice el manual:

ALIAS INDICE

VAR también puede ser usado para crear un alias para una variable. Esto es muy útil para acceder al interior de una variable.

fido var perro´ fido es otro nombre de perro

b0 var w0.byte0 ´ b0 es el primer byte de word w0

b1 var w1.byte1 ´ b1 es el segundo byte de word w0


flea var perro.0 ´ flea es bit0 de perro


Por ejemplo si tienes tu variable TIEMPITO tipo word para tiempo digamos 1000 ticks del timer1, cargas los registros asi:

TMR1H = TIEMPITO.byte1
TMR1L = TIEMPITO.byte0


Saludos

« Última modificación: 04 de Junio de 2010, 23:06:27 por KALLITOS »
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado Memin_Pic

  • PIC10
  • *
  • Mensajes: 3
Re: No logro Dominar Timer 1 del 16F628A
« Respuesta #5 en: 08 de Junio de 2010, 10:37:50 »
Gracias, en realidad poco despues e escribir el mensaje anterior encontre la respuesta, como dijiste solo faltaba leer mas detenidamente el manual. Te cuento que ya hice mi proyecto, pero me gustaria seguir aprendiendo sto de los pic y ahora estoy intebtando comunicar el pic con el pc utilizando el max232, pero  no se como deberia hacer la interrupcion por entrada de datos, es decir el programa ya cuenta con una interrupcion del timer que controla los servos y ahora quisiera otra interrupcion que atienda la entrada de datos, pero como reconoceria el pic cual interrupcion atender , habia pensado crear un condicional desntro del main que evisara si la bandera de entrada de datos esta activada y saltara a un pocedimiento que leyera los datos, pero me gustaria saber como hacer que el pic diferencie el tipo de interrupcion y salte al procedimiento que lee corresponde, desde ya gracias por tu ayuda. yo seguire buscando info.

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: No logro Dominar Timer 1 del 16F628A
« Respuesta #6 en: 08 de Junio de 2010, 11:46:15 »
habia pensado crear un condicional desntro del main que evisara si la bandera de entrada de datos esta activada y saltara a un pocedimiento que leyera los datos

Pues eso mismo, com odispones de un solo nivel de interrupciones, cuando se detecta una interrupción, cualquiera fuera, salta a la atencion de la interrupcion si saber cual es.
Dentro de la rutina de interrupcion lo que haces es ver el estado de los bits flag de las interrupciones que piensas darle función, y asi diferencias cual es la que tienes que atender. Puedes usar un registro auxiliar para setear las banderas por si quieres entrar en determinada seccion de tu programa principal, o simplemente si es poco el codigo lo insertas dentro de la rutina de interrupciones.

En basic no sabria decirte como hacerlo, pero creo es muy basico, con un par de condicionales lo haces.

Recuerda siempre que cuando sales de la rutina que atiende las interrupciones tienes que limpiar los flag de las interrupciones que atendiste.

Espero me allas comprendido, saludos
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.