Hola denuevo he improvisado y mejorado un poco el programa utilizando el vector interrupcion . Lo que me gustaria saber es si estoy realizando bien las cuentas , yo elijo un clock en OSCCON , ej : en este caso 250 khz y luego al activar el TMR1 con preescaler 1:8 quedaria un clock de 31.25 khz ?
el calculo realizado es el siguiente =
{[1/ (250 000)] * 4 } = 8 us para el clock del microcontrolador
Y Ademas , el clock del timer con preescaler de 1:8 seria =
{[1/(250 000 /8)] * 4} = 128 us para el clock del TMR1
por lo cual para 1200 RPM quedaria
1/1200 = 83 us
1/600 = 1.6 ms
1/100 = 1 ms
1/50 = 0.02 s
1/10 = 0.1 s
por lo tanto verificamos que el clock no se desborda ==>
TMR1 (CLK = 31.25 khz)
16 BITS = 65536 cuentas con las cuales desbordaria el contador para lo cual vemos que
65536 * 128 us = 8.3886 seg
con lo cual el clock nunca desboradara y en cuanto al periodo entre pulso y pulso que me da el timer 1 sera medianamente exacto .
Programa
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#define _XTAL_FREQ 4000000
/*
* Captura tiempo entre pulsos entrantes por RB0
*/
// CONFIG1
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CCPMX = RB0 // CCP1 Pin Selection bit (CCP1 function on RB0)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
// CONFIG2
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
#pragma config IESO = ON // Internal External Switchover bit (Internal External Switchover mode enabled)
void interrupt isr (void)
{
if (PIR1bits.TMR1IF == 1){
TMR1H = 0 ;
TMR1L = 0 ;
PIR1bits.TMR1IF = 0 ;
}
if (PIR1bits.CCP1IF == 1){
PORTBbits.RB3 = 1 ;
PIR1bits.CCP1IF = 0 ;
PORTBbits.RB3 = 0 ;
}
}
void main ()
{
OSCCON = 0x10 ;
TRISA = 0x00 ;
TRISB = 0x01 ;
PORTA = 0x00 ;
PORTB = 0x00 ;
CCP1CON = 0x00 ;
TMR1H = 0x00 ;
TMR1L = 0x00 ;
INTCON = 0xD0 ;
PIE1 = 0x05 ;
PIR1 = 0x00 ;
CCP1CON = 0x05 ;
T1CON = 0x31 ;
while (1){
}
igualmente me da error el codigo y no se el xq me dice que espera un end al final de todo ... ? ?
Estoy en lo correcto ?? falta algo alguna mejora ?? Y por supuesto muchas gracias a todo el que me de una mano !