?? fosc100hz.c
字號:
/*
Title: AVR-GCC fosc100Hz program for the test 100Hz output
Author: yfzhang
Date: 3/2004
Purpose:
needed
Software: AVR-GCC to compile
needed
Hardware: ATmega8 on test board cpu oscclk=3.6864MHz
LED connect to PD6
and 100Hz output connect to PB2 (OCR1B)
Note: To contact me, mail to
yfzhang@ele.pku.edu.cn
*/
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <avr/iom8.h>
#include <avr/sleep.h>
typedef unsigned char u08;
typedef char s08;
typedef unsigned short u16;
typedef short s16;
typedef unsigned long u32;
typedef long s32;
static volatile u08 T_125ms_num; /* Number of 125ms timer0 */
static volatile u08 T_12_5ms_num; /* Number of 12.5ms timer0 */
static volatile u08 T_Second_num; /* Number of 1s timer0 */
static volatile u08 Two_Second;
static volatile u08 One_Second;
void led_on(void);
void led_off(void);
SIGNAL(SIG_OVERFLOW0) /* signal handler for Time0 interrupt */
{
T_12_5ms_num++; //12.5ms 執行一次
if(T_12_5ms_num==10){
T_12_5ms_num=0; //125ms 執行一次
T_125ms_num++;
if(T_125ms_num>15){ //per 2 second exec one time
T_125ms_num=0;
Two_Second=1;
}
else if((T_125ms_num==1)||(T_125ms_num==3)) led_on();
else if((T_125ms_num==2)||(T_125ms_num==4)) led_off();
else if((T_125ms_num==5)||(T_125ms_num==13)){ //per 1 second exec one time
T_Second_num++;
One_Second=1;
}
else
;
}
TCNT0 = 0xd3; /* Set TIMER0 3.6kHz/45=80Hz (12.5ms) 0xd3=0x100-0x2d (0x2d=45) */
}
void AvrInit (void)
{
PORTD = 0x7f ; /* bit 6..0 input pull-up */
DDRD = _BV(DDB6); /* PortD bit 6 is LED output =0 for LED on =1 for LED off*/
DDRB = _BV(DDB2); /*PortB bit 2 OCR1B output*/
TCCR0 = _BV(CS02)| _BV(CS00); /* Set TIMER0 prescaler to CLK/1024=3.6kHz CPU CLK= 3.6864 MHz */
TCNT0 = 0xd3; /* Set TIMER0 3.6kHz/45=80Hz (12.5ms) 0xd3=0x100-0x2d (0x2d=45) */
TCCR1B = _BV(CS12)|_BV(WGM12); /* Set TIMER1 prescaler to CLK/256 and mode =CTC */
TCCR1A = _BV(COM1B0); /* Set OCR1B fosc100Hz out */
OCR1AH = 0;
OCR1AL = 71; //fosc=(fcpu/256)/(2*(1+OCR1A)) 3686400/256/(2*(1+71))=100 100Hz
T_125ms_num=0;
T_12_5ms_num=0;
timer_enable_int(_BV(TOIE0)); /* Enable TIMER0 overflow interrupt for LED */
}
void led_on(void)
{
PORTD &= ~_BV(DDB6);
}
void led_off(void)
{
PORTD |= _BV(DDB6);
}
int main(void)
{
cli(); /* disable interrupts */
AvrInit(); /* Initialize the AVR UART and Timer */
sei();
for (;;) {
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -