TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: modelo75 en 09 de Junio de 2005, 17:36:00
-
hola, estoy usando el pic12f683 y ccs 3.222, el siguiente programa funciona bien
#include <12F683.h>
#device adc=8
#use delay(clock=4000000, restart_wdt)
#fuses WDT,INTRC_IO, NOCPD, NOPROTECT, NOMCLR, NOPUT, NOBROWNOUT, NOIESO, NOFCMEN
#use rs232(baud=9600,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=8,restart_wdt,errors)//DISABLE_INTS
#ROM 0x7FF={0x3400}
#priority CCP1
long rise;
//--------------------------------
#int_CCP1
CCP1_isr()
{
putc("X");
}
/*si hay señal en el pin,, imprime una "X", sino imprime PER=0 cada 2 seg.*/
//---------------------------------
void Init (void);
void main()
{
restart_wdt();
printf("start
"
;
Init ();
while (1)
{
restart_wdt();
printf("PER: =%lu
", rise);
delay_ms(2000);
rise=0;
}
}
//-----------------------------------------------
void Init (void)
{
restart_wdt();
set_tris_a(0b001110);
#ASM
movlw 0x8f// OSCCON
movwf 0x04
movlw 0b1100101// 4M, intternal clock, stable
movwf 0x00
movlw 0x90// OSCTUNE – OSCILLATOR TUNING
movwf 0x04
movlw 0b00000 //
movwf 0x00
movlw 0x81 // OPTION REG
movwf 0x04
movlw 0b11001000 // pull up dis,prescaler a wdt
movwf 0x00
movlw 0x10 //T1CON
movwf 0x04
movlw 0b00001001
movwf 0x00
#ENDASM
set_timer1(0);
rise=0;
setup_adc_ports(0);
setup_adc(ADC_OFF);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_CAPTURE_RE);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_CCP1);
enable_interrupts(GLOBAL);
}
Ahora si en la fc que maneja la interrupcion cambio
#int_CCP1
CCP1_isr()
{
rise = get_timer1();
set_timer1(0);
}
Cuando se produce la interrupcion obtengo caracteres raros, como si cambiase la velocidad del clock. Como estoy usando el osc interno, creeria que al usar el timer1 se produce algun error. Puede ser por ahi el tema o alguien ve otra causa??
-
¿No te faltará en el main el setup_timer_1(....); ?
-
Pienso lo mismo que Pocher, salvo que este trozo de ASM haga lo mismo que el setup_timer_1();
movlw 0x10 //T1CON
movwf 0x04
movlw 0b00001001
movwf 0x00
¿Qué hace concretamente?
-
Si nocturno,
en el main llamo a la fc init que inicializa los seteos y el trozo de ASM al que te refieres, le da al registro 10h (T1CON) el valor 0b00001001, que lo setea como interno, sin prescaler, estable; que es lo mismo que la intruccion setup_timer_1( T1_INTERNAL | T1_DIV_BY_1 );
, pero en asembler tiene un par mas de parametros.
He probado de las dos formas y nada.
Tambien probe usar la interrupcion del timer1 y funciona. Pero no puedo tomar el valor del timer.
Sigo buscando, cualquier ayuda es bienvenida.
saludos
-
Te lo he estado probando en el simulador para un 16F876 y va bien. Eso sí debes quitar rise=0 del while, de lo contrario no verás el valor capturado del TMR1.
Un saludo
-
gracias pocher, yo tambien lo he probado en el 16f876A y funciona bien, salvo que en este uso oscilador externo, pero en el 12f683 con oscilador interno no funciona. Probe medir el periodo de una señal leyendo un pin (sin interupcion) y funciona, asi que adios a la interrupcion.
saludos