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

📄 init.c

📁 基于mega48单片机编码cmx865芯片驱动程序实现FSK通信模块。
💻 C
字号:
//ICC-AVR application builder : 2006-9-28 10:26:44
// Target : M48
// Crystal: 7.3728Mhz
#include "Init.h"

void port_init(void)
{
	PORTB = 0xFF;
	DDRB  = 0x3E;
	PORTC = 0x40; //m103 output only
	DDRC  = 0x7F;
	PORTD = 0xFF;
	DDRD  = 0xE2;
}

//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: 1mSec
// actual value:  0.998mSec (0.2%)
void timer0_init(void)
{
	TCCR0B = 0x00; //stop
	TCNT0 = 0x8D; //set count
	TCCR0A = 0x00; 
	TCCR0B = 0x03; //start timer
}

#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
	LINE_DATA *p;
	 TCNT0 = 0x8D; //set count
	 iTime++;
	 if (iTime>=cbDelay1MS)
	 {
		   bTX_flag = 0;
		   iTime	  	=0;
	  }
	 if (( FSKDelay1MS1!=0)&&(-- FSKDelay1MS1==0))
	 {
		fDelay1MS1=1;
	 }
	 if (( FSKDelay1MS2!=0)&&(-- FSKDelay1MS2==0))
	 {
	 	fDelay1MS2=1;
	 }
	 p=&aLineData;
	if((p->cbDelay10MS2!=0)&&(--p->cbDelay10MS2==0))		// 摘机延时发平台接入码时间计数器 //
	{
		p->fDelay10MS2=1;
	}

	 if ((ciDelay8MS!=0)&&(--itemp==0 ))
	 {
	 	ciDelay8MS--;
	 	itemp=250;
	 }
	 
 	if (ciDelay8MS==0)
 	{
		fDelay250MS=1;
		itemp=250;
 	}
	
 //TIMER0 has overflowed
}

//TIMER1 initialize - prescale:8
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 10mSec
// actual value:  9.999mSec (0.0%)
void timer1_init(void)
{
	TCCR1B = 0x00; //stop
	TCNT1H = 0xDC; //setup
	TCNT1L = 0x01;
	OCR1AH = 0x23;
	OCR1AL = 0xFF;
	OCR1BH = 0x23;
	OCR1BL = 0xFF;
	ICR1H  = 0x23;
	ICR1L  = 0xFF;
	TCCR1A = 0x00;
	TCCR1B = 0x02; //start Timer
}

#pragma interrupt_handler timer1_ovf_isr:14
void timer1_ovf_isr(void)
{
	//TIMER1 has overflowed
	TCNT1H = 0xDC; //reload counter high value
	TCNT1L = 0x01; //reload counter low value
	CheckLineState();
 }

//UART0 initialize
// desired baud rate: 19200
// actual: baud rate:19200 (0.0%)
void uart0_init(void)
{
	UCSR0B = 0x00; //disable while setting baud rate
	UCSR0A = 0x00;
	UCSR0C = 0x06;
	UBRR0L = 0x17; //set baud rate lo //17
	UBRR0H = 0x00; //set baud rate hi
	UCSR0B = 0x90;
}

#pragma interrupt_handler uart0_rx_isr:19
void uart0_rx_isr(void)
{
 //uart has received a character in UDR
	aHostRxBuf[iHostRxWr]=UDR0;
	++iHostRxWr;
	
}

#pragma interrupt_handler uart0_tx_isr:21
void uart0_tx_isr(void)
{
 	Uart0Transmit();//character transferred to shift register so UDR is now empty
}

void Uart0Transmit(void)
{
    if(cTX_num)
    {    
        UDR0 = aHostTxBuf[TX_addss];
        cTX_num--;
        TX_addss++;
        
        if(cTX_num == 0)                                                                  //字节发送完毕地址归零
        {  
            TX_addss = 0;
		UCSR0B &= ~0x28;                                                                                                   
        }    
    }  
    
} 
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{	
	ModemRxByte();
 //external interupt on INT0
}
//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 timer0_init();
 timer1_init();
 uart0_init();

 MCUCR = 0x00;
 EICRA = 0x02; //extended ext ints
 EIMSK = 0x01;
 
 TIMSK0 = 0x01; //timer 0 interrupt sources
 TIMSK1 = 0x01; //timer 1 interrupt sources
 TIMSK2 = 0x00; //timer 2 interrupt sources
 
 PCMSK0 = 0x00; //pin change mask 0 
 PCMSK1 = 0x00; //pin change mask 1 
 PCMSK2 = 0x00; //pin change mask 2
 //PCICR = 0x01; //pin change enable 
 PRR = 0x00; //power controller
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

/* re-entrant memset function */
void *mem_set(void *s, char val, int n)
{
    int i;
    char *p;

    p = (char *)s; 
    for(i=0; i<n; i++)
        *p++ = (char)(val);
	return s;
}

void * mem_cpy(void * s1, void *s2, int n)
{
	char *tmp = (char *) s1, *s = (char *) s2;

	while (n--)
		*tmp++ = *s++;

	return s1;
}

void VarInit(void)
{
	bTX_flag = 0; 
	iHostRxWr=0;
	iHostRxRd=0;

	memset(&aLineData,0,sizeof(aLineData));					// 初始化所有路的状态变量 //

	aLineData.bStatusWord=LINE_INIT;
	aLineData.bNowStatus=LINE_INIT;
	//aLineData.fTxEn=1;
	aLineData.cbRingTimes2=0;
	aLineData.ciRingStop=0;
	aLineData.ciRingStart=0;
	bDectLineOKNum=0;
	fFSKRecEnd=0;											// FSK收完的标志 //
	//FSKSendFlag=0;      	//FSK发送标志
	fValidData=0;
	//pWriteNumber=0;
	//pReadNumber=0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -