Autor Tema: Dudas contador externo Timer1 (en CCS)  (Leído 5042 veces)

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

Desconectado canto_mctr

  • PIC10
  • *
  • Mensajes: 1
Dudas contador externo Timer1 (en CCS)
« en: 07 de Junio de 2008, 02:40:19 »
Hola, tengo unas cuantas dudas con el contador del Timer1, en mi caso para un 16F877A.

He configurado un pequeño programa para que me cuente los pulsos que le entran al pic por el pin 15 (T1CKI), me muestre la cuenta del mismo por los puertos B y D, y que al desbordarse se encienda el pin A0. Además puse una condición para activar el modo de bajo consumo (sleep) cuando entre una señal por el pin A1, para checar que la cuenta siga a pesar de que el pic esté dormido y que lo despierte al ocurrir la interrupción (pues esta en modo asíncrono).

El problema es que cada vez que le doy un pulso con un botón al pin del timer1 (15) me toma en cuenta tanto el flanco de subida como el de bajada. Resolví esto con una trampa  :D, al establecer el prescaler en 2, para que solo contará cada 2 pulsos, y ahora detecta solo el flanco de bajada. Pero mi primera duda es, ¿por qué se incrementa el contador en ambos flancos?, y además ¿es posible establecer que flanco quiero?

Otra cosa que note, es que al meterle los pulsos por el pin 16 (T1OSCI) no sucede esto, ya que se incrementa solo en los flancos de subida, como yo esperaba. Pero una nueva duda es ¿acaso no es el pin 15 el que debe contarme esos pulsos?

Por otra parte, aún no se como se usan T1OSCI y T1OSCO; tengo la vaga idea de que por ellos se conecta un reloj externo de baja potencia o algo así (por lo que medio entendí en la Datasheet), pero ¿como le indico eso al pic?

Una última duda: ¿qué hace el modo T1_CLK_OUT al configurar el timer1 con setup_timer_1?

Este es el código con el que estoy probando y sacando tantas dudas  :-)

#include <16f877a.h>
#FUSES NOWDT, XT, NOCPD, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(a)
#use fast_io(d)

#byte RB=6
#byte RD=8
#bit A0=5.0

#int_timer1
void timer1(){A0++;}

void main(){
set_tris_b(0);
set_tris_a(2);
set_tris_d(0);
setup_timer_1(T1_external|T1_div_by_1);
enable_interrupts(int_timer1);
enable_interrupts(global);
output_a(0);
set_timer1(0xFFF0);  //lo puse en este valor inicial para poder ver lo de la interrupción y el sleep sin tener que pasar por tantos números
while(true){
RB=get_timer1();
RD= make8(get_timer1(),1);
if(input(pin_A1)){sleep();}}}

También les adjunto los archivos para que simulen y vean sin problemas.

Espero que puedan aclarar mis dudas e indicarme si estoy haciendo algo mal. Saludos desde México
"Wer sich nicht mehr wundern und in Ehrfurcht verlieren kann, ist seelisch bereits tot" Einstein


 

anything