⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcu.c

📁 简单的在ATMEGA64上移植ucosII
💻 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 + -