?? mcu.c
字號:
#define _MCU_C_
#include <include.h>
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
PORTE = 0x00;
DDRE = 0x00;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x00;
}
//Watchdog initialize
// prescale: 2048K
//復位時間2.2s
void watchdog_init(void)
{
//this prevents a timout on enabling
//這在使能的時候可以防止溢出
WDR();
//05.8.9先置位WDCE和WDE
WDTCR=(1<<WDCE)|(1<<WDE);
//WATCHDOG ENABLED - dont forget WDR
//看門狗啟動 別忘了喂狗 WDR
WDTCR = 0x0F;
WDR();
}
void WDT_off(void)
{
WDR();
//置位WDCE和WDE
WDTCR=(1<<WDCE)|(1<<WDE);
//關閉WDT
WDTCR=0;
}
//TIMER1 initialize - prescale:1024
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Sec
// actual value: 1.000Sec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xD5; //setup
TCNT1L = 0xD1;
OCR1AH = 0x2A;
OCR1AL = 0x2F;
OCR1BH = 0x2A;
OCR1BL = 0x2F;
OCR1CH = 0x2A;
OCR1CL = 0x2F;
ICR1H = 0x2A;
ICR1L = 0x2F;
TCCR1A = 0x00;
TCCR1B = 0x05; //start Timer
}
//ADC initialize
// Conversion time: 2uS
void adc_init(void)
{
ADCSRA = 0x00; //disable adc
ADMUX = 0x00; //select adc input 0
ACSR = 0x80;
ADCSRB = 0x00;
ADCSRA = 0x81;
}
//call this routine to initialize all peripherals
void Init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
watchdog_init();
timer1_init();
adc_init();
uartInit(0);
uartInit(1);
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x04; //timer interrupt sources
// Bit 2 – TOIE1: T/C1 溢出中斷使能
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
uint8 Adc(uint8 channel)
{
//disable adc
//ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
//使能 開始 自動觸發使能 中斷標志 中斷使能 分頻因子5=32
ADCSRA = 0x00;
//REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
//外加濾波電容 左對齊 AD通道選擇
ADMUX = channel + 0x60;
ADCSRA = 0x85;
ADCSRB = 0x00;
//啟動
ADCSRA = ADCSRA|(1<<ADSC);
//等待轉換結束
while(ADCSRA&(1<<ADSC))
WDR();
return ADCH;
}
void EEPROM_write(uint16 uiAddress, uint8 ucData)
{
//等待上次寫操作結束 EEWE=0
//while 為真執行,為假跳出
while(EECR&(1<<EEWE))
;
//設置地址和數據寄存器
EEAR=uiAddress;
EEDR=ucData;
//置位EEMWE
EECR|=(1<<EEMWE);
//置位EEWE啟動寫操作
EECR|=(1<<EEWE);
}
uint8 EEPROM_read(uint16 uiAddress)
{
//等待上一次寫操作結束
while(EECR&(1<<EEWE));
//設置讀地址
EEAR=uiAddress;
//設置EERE啟動讀操作
EECR|=(1<<EERE);
return EEDR;
}
// actual value: 1.000Sec (0.0%)
#pragma interrupt_handler timer1_ovf_isr:15
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0xD5; //reload counter high value
TCNT1L = 0xD1; //reload counter low value
// if(Flag_timer1_counter==1) // 在Delay1S(); 函數中應用
// Timer1_counter++;
DelCnt++; // 在定時1小時刪除短信中應用
Sec_Counter++; // 秒計數加1
cmgl_cnt++; // 在每20秒發送,AT+CMGL中應用
if(Flag_alarm==1) // 在機箱外告警指示中使用
{
PORTA^=BIT(PA0); //告警指示燈
//PORTE^=BIT(PE6); //LGC
}
else
{
PORTA&=(~BIT(PA0));
//PORTE&=(~BIT(PE6));//LGC
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -