📄 rfid_timers.c
字号:
// $Id: rfid_Timers.c,v 1.5 2006/10/20 15:26:44 tprescott Exp $
/*****************************************************
Project : rfid_Timers.c
Date : 9/08/2006
Author : Toby Prescott
Company : Atmel
Comments: AVR Studio GCC
Revisions:
v1.0 - Started for CodeVision
v2.2 - 3/8/06 Changed the I/O processing to interrupt based
v2.6 - 9/8/06 Clean for WinAVR
*****************************************************/
#include "rfid_Timers.h"
unsigned volatile int RdTime = 0; //Global var used for edgetiming
unsigned volatile char RFIDTimerFlag = 0; //Global flag
unsigned volatile char GenericTimerFlag = 0; //Global flag
unsigned char RFIDTimerValH = 0; //Local timer vars
unsigned char RFIDTimerValL = 0;
unsigned char LCDTimerVal = 150;
volatile unsigned char RFIDTimerEdgeFlag = 1; //Local flag
unsigned char brightCount = 0; //Local timer var used for backlighting
/*********** Timer Function Description ****************/
// Timer 0 is used for the Real Time Clock(atml_Rtc.c) //
// Timer 1 is used for the RFID Read and Write timing //
// Timer 2 is used for the LCD backlighting opperation //
// Timer 3 is used for a general timer //
/*******************************************************/
// *******************************************************************************
// * Set RFIDTimer Count Value
// *******************************************************************************
void RFIDTimer_Set(unsigned char cValH, unsigned char cValL)
{
RFIDTimerValH = 0xFF - cValH;
RFIDTimerValL = 0xFF - cValL;
// Same for mega128 and usb1287
TCNT1H = RFIDTimerValH;
TCNT1L = RFIDTimerValL;
}
// *******************************************************************************
// * RFIDTimer Initialization of for Write Routine
// *******************************************************************************
void RFIDTimer_WR_Init(void)
{
#if defined (__AVR_ATmega128__)//mega128
TIMSK &= ~0x3C; //Disable TC1 interrupts
TCNT1H = RFIDTimerValH; //Load TC1 count value
TCNT1L = RFIDTimerValL;
TCCR1A = 0x00; //Normal mode
TCCR1B = 0x02; //prescale the timer to be clock source / 8 to make it
//exactly 1 us for every timer step
TCCR1C = 0x00; //Normal mode
TIFR |= 0x3C; //clear interrupt flags for TC1
TIMSK |= 0x04; //set Timer/Counter1 Overflow Interrupt Enable
#elif defined (__AVR_AT90USB1287__)//usb1287
TIMSK1 &= ~0x2F; //Disable TC1 interrupts
TCNT1H = RFIDTimerValH; //Load TC1 count value
TCNT1L = RFIDTimerValL;
TCCR1A = 0x00; //Normal mode
TCCR1B = 0x02; //prescale the timer to be clock source / 8 to make it
//exactly 1 us for every timer step
TCCR1C = 0x00; //Normal mode
TIFR1 |= 0x2F; //clear interrupt flags for TC1
TIMSK1 |= 0x01; //set Timer/Counter1 Overflow Interrupt Enable
#endif
}
// *******************************************************************************
// * RFIDTimer Initialization of for Read Routine
// *******************************************************************************
void RFIDTimer_RD_Init(void)
{
#if defined (__AVR_ATmega128__)//mega128
TIMSK &= ~0x3C; //Disable TC1 interrupts
TCNT1H = RFIDTimerValH; //Load TC1 count value
TCNT1L = RFIDTimerValL;
TCCR1A = 0x00; //Normal mode
TCCR1B &= ~ICP1; //Look for Falling Edge on ICP1
TCCR1B |= 0x02; //prescale the timer to be clock source / 8 to make it
//exactly 1 us for every timer step
TCCR1C = 0x00; //Normal mode
TIFR |= 0x3C; //clear interrupt flags for TC1
TIMSK |= 0x24; //set Timer/Counter1 Input Capture & Interrupt Enable
#elif defined (__AVR_AT90USB1287__)//usb1287
TIMSK1 &= ~0x2F; //Disable TC1 interrupts
TCNT1H = RFIDTimerValH; //Load TC1 count value
TCNT1L = RFIDTimerValL;
TCCR1A = 0x00; //Normal mode
TCCR1B &= ~ICP1; //Look for Falling Edge on ICP1
TCCR1B |= 0x02; //prescale the timer to be clock source / 8 to make it
//exactly 1 us for every timer step
TCCR1C = 0x00; //Normal mode
TIFR1 |= 0x2F; //clear interrupt flags for TC1
TIMSK1 |= 0x21; //set Timer/Counter1 Input Capture & Interrupt Enable
#endif
}
// *******************************************************************************
// * Shutdown RFIDTimer
// *******************************************************************************
void RFIDTimer_Stop(void)
{
#if defined (__AVR_ATmega128__)//mega128
TIMSK &= ~0x3C; //Disable TC1 interrupts
//
TCCR1A = 0x00;
TCCR1B = 0x00; //No clock source / Timer Stopped
TCCR1C = 0x00;
TIFR |= 0x3C; //clear interrupt flags for TC1
#elif defined (__AVR_AT90USB1287__)//usb1287
TIMSK1 &= ~0x2F; //Disable TC1 interrupts
//
TCCR1A = 0x00;
TCCR1B = 0x00; //No clock source / Timer Stopped
TCCR1C = 0x00;
TIFR1 |= 0x2F; //clear interrupt flags for TC1
#endif
}
// *******************************************************************************
// * RFIDTimer Overflow Interrupt Routine
// *******************************************************************************
#if defined (__AVR_ATmega128__)//mega128
ISR(TIMER1_OVF_vect)
#elif defined (__AVR_AT90USB1287__)//usb1287
ISR(TIMER1_OVF_vect)
#endif
{
//Same for mega128 and usb1287
TCNT1H = RFIDTimerValH; //Reset TC1 Count value
TCNT1L = RFIDTimerValL;
RFIDTimerFlag = 2; //Set Flag = 2 (overflow)
}
// *******************************************************************************
// * RFIDTimer Input Capture Interrupt Routine
// *******************************************************************************
#if defined (__AVR_ATmega128__)//mega128
ISR(TIMER1_CAPT_vect)
#elif defined (__AVR_AT90USB1287__)//usb1287
ISR(TIMER1_CAPT_vect)
#endif
{
//Same for mega128 and usb1287
TCNT1H = RFIDTimerValH; //Reset TC1 Count value
TCNT1L = RFIDTimerValL;
RdTime = ICR1L; //Store counter value for edge timing
RdTime += ((unsigned int)ICR1H<<8);
if(RFIDTimerEdgeFlag == 1) //Check current Read flag bit state
{
TCCR1B |= ICP1; //Look for rising edge on ICP1
RFIDTimerEdgeFlag = 0; //Change Read flag state
}
else
{
TCCR1B &= ~ICP1; //Look for falling edge on ICP1
RFIDTimerEdgeFlag = 1; //Change Read flag state
}
RFIDTimerFlag = 1; //Set TC1 Flag = 1 (edge)
}
// *******************************************************************************
// * Set LCDTimer Count Value
// *******************************************************************************
void LCDTimer_Set(unsigned char cVal){LCDTimerVal = 0xFF - cVal;}
// *******************************************************************************
// * LCD Timer Initialization Routine
// *******************************************************************************
void LCDTimer_Init(void)
{
#if defined (__AVR_ATmega128__)//mega128
TIMSK &= ~0xC0; //Disable TC2 interrupts
TCNT2 = 0xFF-LCDTimerVal; //Load TC2 with count value
TCCR2 = 0x02; //prescale the timer to be clock source / 8 to make it
//exactly 1 us for every timer step
TIFR |= 0xC0; //clear interrupt flags for TC2
TIMSK |= 0x40; //set 8-bit Timer/Counter2 Overflow Interrupt Enable
#elif defined (__AVR_AT90USB1287__)//usb1287
TIMSK0 &= ~0x07; //Disable TC0 interrupts
TCNT0 = 0xFF-LCDTimerVal; //Load TC0 with count value
TCCR0A = 0x00; //
TCCR0B = 0x02; //prescale the timer to be clock source / 8 to make it
//exactly 1 us for every timer step
TIFR0 |= 0x07; //clear interrupt flags for TC0
TIMSK0 |= 0x01; //set 8-bit Timer/Counter0 Overflow Interrupt Enable
#endif
}
// *******************************************************************************
// * Shutdown LCDTimer
// *******************************************************************************
void LCDTimer_Stop(void)
{
#if defined (__AVR_ATmega128__)//mega128
TIMSK &= ~0xC0; //Disable TC2 interrupts
TCCR2 = 0x00; //No clock source / Timer Stopped
TIFR |= 0xC0; //clear interrupt flags for TC2
#elif defined (__AVR_AT90USB1287__)//usb1287
TIMSK0 &= ~0xC0; //Disable TC0 interrupts
TCCR0A = 0x00; //No clock source / Timer Stopped
TCCR0B = 0x00; //No clock source / Timer Stopped
TIFR0 |= 0xC0; //clear interrupt flags for TC0
#endif
}
// *******************************************************************************
// * LCDTimer Overflow Interrupt Routine
// *******************************************************************************
#if defined (__AVR_ATmega128__)//mega128
ISR(TIMER2_OVF_vect)
{
TCNT2 = 0xFF-LCDTimerVal; //Reload TC0 Count Value
#elif defined (__AVR_AT90USB1287__)//usb1287
ISR(TIMER0_OVF_vect)
{
TCNT0 = 0xFF-LCDTimerVal; //Reload TC0 Count Value
#endif
if(brightPercent == 0){PORTC &= ~0x40;} //Check for backlight off
else if(brightCount == 10) //Check for counter upper limit
{
brightCount = 0; //Reset Backlighting counter to zero
PORTC |= 0x40; //Backlighting turned ON
}
else if(brightCount == brightPercent) //When counter reaches specified percentage
{
PORTC &= ~0x40; //Backlighting turned OFF for remaining counts
}
brightCount++; //Increment the backlighing counter
if(ioActive==1)
{
#if defined (__AVR_ATmega128__)//mega128
if((PINE & PWRDETECT128) == 0) //Check that PWR switch is on
#elif defined (__AVR_AT90USB1287__)//usb1287
if((PINC & PWRDETECT1287) == 0) //Check that PWR switch is on
#endif
{
slp_EnterSleep(); //If PWR switch is off, got to sleep
}
else{;} //else continue startup
}
}
// *******************************************************************************
// * GenericTimer Initialization of for General Use
// *******************************************************************************
void GenericTimer_Init(void)
{
#if defined (__AVR_ATmega128__)//mega128
ETIMSK &= ~0x37; //Disable TC3 interrupts
TCCR3A = 0x00; //Normal mode
TCCR3B = 0x02; //prescale the timer to be clock source / 8 to make it
//exactly 1 us for every timer step
TCCR3C = 0x00; //Normal mode
ETIFR |= 0x37; //clear interrupt flags for TC3
ETIMSK |= 0x04; //set Timer/Counter3 Overflow Interrupt Enable
#elif defined (__AVR_AT90USB1287__)//usb1287
TIMSK3 &= ~0x2F; //Disable TC3 interrupts
TCCR3A = 0x00; //Normal mode
TCCR3B = 0x02; //prescale the timer to be clock source / 8 to make it
//exactly 1 us for every timer step
TCCR3C = 0x00; //Normal mode
TIFR3 |= 0x2F; //clear interrupt flags for TC3
TIMSK3 |= 0x01; //set Timer/Counter3 Overflow Interrupt Enable
#endif
}
// *******************************************************************************
// * Shutdown GenericTimer
// *******************************************************************************
void GenericTimer_Stop(void)
{
#if defined (__AVR_ATmega128__)//mega128
ETIMSK &= ~0x37; //Disable TC3 interrupts
TCCR3A = 0x00;
TCCR3B = 0x00; //No clock source / Timer Stopped
TCCR3C = 0x00;
ETIFR |= 0x37; //clear interrupt flags for TC3
#elif defined (__AVR_AT90USB1287__)//usb1287
TIMSK3 &= ~0x2F; //Disable TC3 interrupts
TCCR3A = 0x00;
TCCR3B = 0x00; //No clock source / Timer Stopped
TCCR3C = 0x00;
TIFR3 |= 0x2F; //clear interrupt flags for TC3
#endif
}
// *******************************************************************************
// * GenericTimer Overflow Interrupt Routine
// *******************************************************************************
#if defined (__AVR_ATmega128__)//mega128
ISR(TIMER3_OVF_vect)
#elif defined (__AVR_AT90USB1287__)//usb1287
ISR(TIMER3_OVF_vect)
#endif
{
GenericTimerFlag = 2; //Set TC3 Flag = 2 (overflow)
}
void Timer_delay_us(unsigned int iDelay)
{
//PORTF &= ~0x02;
TCNT3 = 0xFFFF- iDelay;
GenericTimer_Init();
GenericTimerFlag = 0; // Clear Timer Flag
while(!GenericTimerFlag); // Wait for overflow
GenericTimer_Stop();
//PORTF |= 0x02;
}
void Timer_delay_ms(unsigned int iDelay)
{
unsigned int i;
for(i=0; i<iDelay;i++){Timer_delay_us(1000);}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -