📄 init.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 + -