// PIC16F877A Configuration Bit Settings
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disable)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define _XTAL_FREQ 20000000 //Specify the XTAL crystal FREQ
#include<xc.h>
void main(void)
{
PORTD = 0b00000000;
TRISC0 = 1; //PORTC R0 pins are used as Input encoder
TRISD4 = 0; //PORTD R4 pins are used as output.LED
TRISB1 = 1; //PORTC R0 pins are used as Input. sensor
//Loading starting value of counter 65486
TMR1H = 0xFF ; // High byte FF
TMR1L = 0xF6 ; // Low Byte F6
//Set T1CON Register
TMR1ON = 0; // Stops Timer1
TMR1CS = 1; // Oscillator is enabled
T1SYNC = 0; // Synchronize external clock input
T1OSCEN = 0; // Oscillator is shut-off
T1CKPS0 = 0; // 1:8 prescale value
T1CKPS1 = 0;
TMR1IF = 0 ; // Clear interrupt flag
TMR1ON = 1; //Start Timer1
while(1)
{
if(TMR1IF ==1)
{
RD4 = 1; // LED ON
__delay_ms(500); //
RD4 = 0; // LED OFF
TMR1IF=0; // Clear timer interrupt flag
TMR1ON = 0; //Stop Timer1
//reload counter
TMR1H = 0xFF ; // High byte FF
TMR1L = 0xF6 ; // Low Byte F6
}
}
}
Not necessary. It's a hardware timer/counter.Where is the part that's suppose to increment the counter?
Not necessary. It's a hardware timer/counter.
I don't know the frequency of the pulses, I just want to count them when they come in.What is your Pulse input frequency or its frequency range?
I don't want interrupt I want to set timer flag when counter overflow timer flag will set so I would check if flag is set, triggered LEDYou need to enable PEIE and GIE bits of INTCON register to enable global interrupts to get TMR1IF set.
// PIC16F877A Configuration Bit Settings
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disable)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define _XTAL_FREQ 20000000 //Specify the XTAL crystal FREQ
#include <xc.h>
void main(void)
{
PORTD = 0b00000000;
TRISC0 = 1; //PORTC R0 pins are used as Input encoder
TRISD4 = 0; //PORTD R4 pins are used as output.LED
TRISB1 = 1; //PORTC R0 pins are used as Input. sensor
//Loading starting value of counter 65486
TMR1H = 0xFF ; // High byte FF
TMR1L = 0xF6 ; // Low Byte F6
//Set T1CON Register
TMR1ON = 0; // Stops Timer1
TMR1CS = 1; // Oscillator is enabled
T1SYNC = 0; // Synchronize external clock input
T1OSCEN = 0; // Oscillator is shut-off
T1CKPS0 = 0; // 1:8 prescale value
T1CKPS1 = 0;
TMR1IF = 0 ; // Clear interrupt flag
TMR1ON = 1; //Start Timer1
while(1)
{
if (RB1 == 0)
{
TMR1ON = 0; //Stop Timer1
}
else if(TMR1IF ==1)
{
RD4 = 1; // LED ON
__delay_ms(500); //
RD4 = 0; // LED OFF
TMR1IF=0; // Clear timer interrupt flag
TMR1ON = 0; //Stop Timer1
//reload counter
TMR1H = 0xFF ; // High byte FF
TMR1L = 0xF6 ; // Low Byte F6
}
}
}
Still not clear. Which input is expected to advance the counter, which input to start and stop the counter?
The code looks basically right, I'm only missing TMR1ON set to '1' following RB1 input.
while(1)
{
if (RB1 == 0)
{
TMR1ON = 0; //Stop Timer1
}
else if(TMR1IF ==1)
{
RD4 = 1; // LED ON
__delay_ms(500); //
RD4 = 0; // LED OFF
TMR1IF=0; // Clear timer interrupt flag
TMR1ON = 0; //Stop Timer1
//reload counter
TMR1H = 0xFF ; // High byte FF
TMR1L = 0xF6 ; // Low Byte F6
}
}
}
void main() {
TMR1ON = 1;
while(1) {
}
}
Only if Timer is On the counter will work and so set it before the while(1) loop.
Code:void main() { TMR1ON = 1; while(1) { } }
if(RB1 == 0) {
__delay_ms(50);
if(RB1 == 0) {
TMR1ON = 1; //Stop Timer1
}
}
else if(RB1 == 1) {
__delay_ms(50);
if(RB1 == 1) {
TMR1ON = 0; //Stop Timer1
}
}
TMR1CS = 0; // Internal clock (FOSC/4)
TMR1CS = 1; // External clock from pin RC0/T1OSO/T1CKI (on the rising edge)
In this situation you have to test your code in various location
For me your #1 post code is correct except baileychic is pointed out with delay
Fist experiment
Code:TMR1CS = 0; // Internal clock (FOSC/4)
Once you change the above code Timer1 run with internal clock , then LED should ON and off at least one time
Then check that your encoder feeds the pulse for RC0 or you can manually feed the pulse to RC0
don't forget to re change for counter mode
Code:TMR1CS = 1; // External clock from pin RC0/T1OSO/T1CKI (on the rising edge)
My be help
else if(TMR1IF ==1)
{
RD4 = 1; // LED ON
__delay_ms(500); //
RD4 = 0; // LED OFF
TMR1IF=0; // Clear timer interrupt flag
TMR1ON = 0; //Stop Timer1
//reload counter
TMR1H = 0xFF ; // High byte FF
TMR1L = 0xF6 ; // Low Byte F6
}
Is LED blinking with internal clock ?
check and confirm us
Code:TMR1CS = 0; // Internal clock (FOSC/4)
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?