?? dtm48-td.c
字號:
/******************************************/
/* 燕山大學無線電愛好者協會 */
/* 電子調速器 */
/* 作者:張翃鵬 2005-2-27 9:04:40 */
/* 目標MCU:MEGA8 晶振:INT RC 8MHZ */
/******************************************/
#include <iom48v.h>
#include <macros.h>
#include <eeprom.h>
#define uchar unsigned char
#define unit unsigned int
#define ulong unsigned long
#define xtal 8
#define j11 PORTD|=0x02
#define j10 PORTD&=~0x02
#define j21 PORTD|=0x10
#define j20 PORTD&=~0x10
#define j31 PORTB|=0x40
#define j30 PORTB&=~0x40
#define j41 PORTD|=0x40
#define j40 PORTD&=~0x40
#define LED1 PORTB|=0x08;
#define LED0 PORTB&=~0x08;
int mark=1500;
unit ai,aa;
uchar i,j,az,flag,flagh,zb,mid,pwm;
void port_init(void)
{
PORTB = 0x23;
DDRB = 0x58;
PORTC = 0x04; //m103 output only
DDRC = 0x38;
PORTD = 0x00;
DDRD = 0x52;
}
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x00 /*INVALID SETTING*/; //setup
TCNT1L = 0x00 /*INVALID SETTING*/;
OCR1AH = 0x00 /*INVALID SETTING*/;
OCR1AL = 0x00 /*INVALID SETTING*/;
OCR1BH = 0x00 /*INVALID SETTING*/;
OCR1BL = 0x00 /*INVALID SETTING*/;
ICR1H = 0x00 /*INVALID SETTING*/;
ICR1L = 0x00 /*INVALID SETTING*/;
TCCR1A = 0x00;
TCCR1B = 0x02; //start Timer
}
//TIMER2 initialize - prescale:8
// WGM: Normal
// desired value: 255uSec
// actual value: 255.000uSec (0.0%)
void timer2_init(void)
{
TCCR2B = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT2 = 0x01; //setup
OCR2A = 0;
OCR2B = 0x00;
TCCR2A = 0x00;
TCCR2B = 0x02; //start
}
void watchdog_init(void)
{
WDR(); //this prevents a timout on enabling
WDTCSR = 0x08; //WATCHDOG ENABLED - dont forget to issue WDRs
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();
timer2_init();
watchdog_init();
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK0 = 0x00; //timer 0 interrupt sources
TIMSK1 = 0x00; //timer 1 interrupt sources
TIMSK2 = 0x03; //timer 2 interrupt sources
PCMSK0 = 0x00; //pin change mask 0
PCMSK1 = 0x00; //pin change mask 1
PCMSK2 = 0x00; //pin change mask 2
PCICR = 0x00; //pin change enable
PRR = 0x00; //power controller
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
/* 微秒級延時程序 */
void del(int time)
{
do
{
time--;
}
while (time>1);
}
/* 毫秒級延時程序 */
void delay_1ms(void)
{ unsigned int i1;
for(i1=1;i1<(unsigned int)(xtal*143-2);i1++)
;
}
void delay(unsigned int n)
{
unsigned int i2=0;
while(i2<n)
{delay_1ms();
i2++; WDR();
}
}
#pragma interrupt_handler timer2_compa_isr:8
void timer2_compa_isr(void)
{
//compare occured TCNT2=OCR2a
if(zb<255)
{j10;j20; j30;j40;}
}
#pragma interrupt_handler timer2_ovf_isr:10
void timer2_ovf_isr(void)
{
if(zb>0)
{
if(flag==1)
{j11;j31;}
else
if(flag==0)
{j21;j41;}
}
TCNT2 = 0x0; //reload counter value
OCR2A=zb;
}
unit fenc(int bb)
{
int bc;
if((bb<mark-700)||(bb>(mark+700))) return(0);
if(mark<bb)
{
flag=1;
bc=bb-mark;
}
if(mark>bb)
{
flag=0;
bc=mark-bb;
}
if(bc<=25) { LED1; } else { LED0; }
if(bc<=50) return(0);
if(bc>=305) return(255);
else return(bc-50);
}
void cy(void)
{
if(!(PINC&0x04))
{
TCNT1=0;
while(!(PINC&0x04)) WDR();
aa=TCNT1;
zb=fenc(aa);
}
}
void main(void)
{
unit tr;
EEPROM_READ(0x10,ai);//校正振蕩頻率
OSCCAL=ai;
init_devices();
EEPROM_READ(0x112,ai);
if(ai==0xFFFF)
{
mark=1500; //0xD805
EEPROM_WRITE(0x110,mark);
aa=0;
EEPROM_WRITE(0x112,aa);
}
EEPROM_READ(0x110,mark);
while(1)
{
//cy();
if(!(PINC&0x04))
{
TCNT1=0;
while(!(PINC&0x04)) ;
aa=TCNT1;
zb=fenc(aa);
}
WDR();
if(!(PINB&0x20))
{
delay(300);
if(!(PINB&0x20))
{
cy();
WDR();
LED1;
delay(10);
mark=aa; EEPROM_WRITE(0x110,mark);
j10;j20;j30;j40;
CLI();
delay(500);
SEI();
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -