📄 speed.c
字号:
/*****************************************************
2004.07最终测速烧入程序
Samples\Intrupts\EXTINT_300O.C
Z-World, 2002
This program demonstrates how to use the external
interrupt lines to trigger an interrupt
service routine (ISR) in your code for the
Rabbit 3000 CPU. Unlike the Rabbit 2000 CPU, both
external interrupts are available for use on the
Rabbit 3000.
Two input lines should be attached to parallel port
E pins 0 and 1 for this example. The program will
separately count pulses on both input line until
20 pulses are counted on one of them.
The "interrupt" keyword is used to create an ISR in C code.
******************************************************/
#class auto
//#define TCP_BUF_SIZE 64
// tcp intialization
#define MY_IP_ADDRESS "202.206.44.21"
#define MY_NETMASK "255.255.255.0"
#define PORT 6666
#memmap xmem
#use "dcrtcp.lib"
//timer and interrupt intialization
int i,watchdog;
unsigned int SendEmptyPackageTimes;
long TcpOverTime,ZeroPackageOverTime,WheelOverTime,TempTcpTime0,TempTcpTime1;
unsigned long Temp0,Temp1,Temp2,Temp3,j;
unsigned long Int0UpTime,Int0DownTime,Int1UpTime,Int1DownTime;
unsigned long INT0PulWidth,INT1PulWidth,INT0PulWidthMax,INT1PulWidthMax;
unsigned long MAX0DiffUpTime,Int0MaxPulWidthUpTime,Int1MaxPulWidthUpTime;
unsigned long PreInt0MaxPulWidthUpTime,PreInt1MaxPulWidthUpTime;
unsigned long WheelSpeed,tempWheelSpeed,WheelNumber,SendedWheelNumber,WheelBase,tempWheelBase;
unsigned long Int0UpNumber,Int1UpNumber;
unsigned long TrainGone[4];
unsigned long DataPackage[4];
unsigned long ZeroPackage[4];
unsigned int Int0VoltFlag,Int1VoltFlag,TrainFlag,Int0GoneFlag,Int1GoneFlag;
unsigned int counterLSB,counterMSB; //系统时钟当前值
void timerb_isr();
void my_isr0();
void my_isr1();
void main()
{ tcp_Socket socket;
sock_init();
WheelNumber=0;
SendedWheelNumber=0;
INT0PulWidthMax=0;
INT1PulWidthMax=0;
PreInt0MaxPulWidthUpTime=0;
PreInt1MaxPulWidthUpTime=0;
Int0MaxPulWidthUpTime=1;
Temp0=0;
Temp1=0;
Temp2=0;
Temp3=0;
Int1UpTime=0;
Int1DownTime=0;
Int0UpNumber=0;
Int1UpNumber=0;
TcpOverTime=3000;
ZeroPackageOverTime=16384;
WheelOverTime=265536;
j=0;
INT0PulWidthMax=0;
counterLSB=0;
counterMSB=0;
TrainFlag=0;
SendEmptyPackageTimes=0;
TrainGone[0]=0x0C000000;
TrainGone[1]=0x00020000;
TrainGone[2]=0x00000000;
TrainGone[3]=0x00000000;
ZeroPackage[0]=0x0C000000;
DataPackage[0]=0x0C000000;
for(i=1;i<=3;i++)
{
ZeroPackage[i]=0x01000000*0;
}
//timer intialization
SetVectIntern(0x0B, timerb_isr); // set up ISR
WrPortI(TBCR, &TBCRShadow, 0x02); // clock timer B with (perclk) and
// set interrupt level to 2
WrPortI(TBL1R, NULL, 0x93); // set initial match!
WrPortI(TBM1R, NULL, 0x00);
//external interrupt intialization
WrPortI(PEDDR, &PEDDRShadow, 0x00); // set port E as all inputs
SetVectExtern3000(0, my_isr0);
SetVectExtern3000(1, my_isr1);
//enable temer and external interrupt
WrPortI(TBCSR, &TBCSRShadow, 0x03); // enable timer B and B1 match interrupts
WrPortI(I0CR, &I0CRShadow, 0x0D); // enable external INT0 on PE0, rising edge, priority 1
WrPortI(I1CR, &I1CRShadow, 0x0D); // enable external INT1 on PE1, falling edge, priority 1
tcp_listen(&socket,PORT,0,0,NULL,0);
printf("Waiting for connection...\n");
while(!sock_established(&socket) && sock_bytesready(&socket)==-1)
tcp_tick(NULL);
printf("Connection received...\n");
Int0VoltFlag=0;
Int1VoltFlag=0;
Int0GoneFlag=0;
Int0VoltFlag=BitRdPortI(PEDR,0); //读取INT0的电位,0:低电平,1:高电平
while(Int0VoltFlag==1)
{
Int0VoltFlag=BitRdPortI(PEDR,0); //读取INT0的电位,
//使系统在中断0信号为低电平时切入
}
//系统开始工作前清零系统时钟当前计数值
counterLSB=0;
counterMSB=0;
//enable temer and external interrupt
WrPortI(TBCSR, &TBCSRShadow, 0x03); // enable timer B and B1 match interrupts
WrPortI(I0CR, &I0CRShadow, 0x0D); // enable external INT0 on PE0, rising edge, priority 1
WrPortI(I1CR, &I1CRShadow, 0x0D); // enable external INT1 on PE1, falling edge, priority 1
// WrPortI(WDTCR, NULL, 0x5a);
watchdog=VdGetFreeWd(255); //watchdog intialization
while (1)
{
if(pd_havelink(0)==0)
{
tcp_listen(&socket,PORT,0,0,NULL,0);
printf("Waiting for Reconnection...\n");
while(!sock_established(&socket) && sock_bytesready(&socket)==-1)
tcp_tick(NULL);
printf("ReConnection received...\n");
}
Start:
if(TrainFlag==0)
{
Temp2=(long)counterMSB;
Temp2=(Temp2<<16)+counterLSB;
//车走定时发空包
if(Temp2-Temp3>ZeroPackageOverTime)
{
if(sock_fastwrite(&socket,ZeroPackage,16)==-1)
{
tcp_listen(&socket,PORT,0,0,NULL,0);
while(!sock_established(&socket) && sock_bytesready(&socket)==-1)
tcp_tick(NULL);
}else
{
Temp3=Temp2;
tcp_tick(&socket);
VdHitWd(watchdog);
}
}
}else
{
if(WheelNumber>SendedWheelNumber)
{
//WheelNumber=j;
//tempWheelSpeed=0;
Temp3=(long)counterMSB;
Temp3=(Temp3<<16)+counterLSB;
// INT0PulWidthMax=0;
// INT1PulWidthMax=0;
// Int0UpNumber=WheelNumber;
// Int1UpNumber=WheelNumber;
j=0;
SendedWheelNumber=WheelNumber;
DataPackage[1]=((0x000000ff&WheelNumber)<<24)+((0x0000ff00&WheelNumber)<<8);
DataPackage[2]=((0x000000ff&WheelSpeed)<<24)+((0x0000ff00&WheelSpeed)<<8);
DataPackage[3]=((0x000000ff&WheelBase)<<24)+((0x0000ff00&WheelBase)<<8);
// printf("WheelNumber=%ld\n",WheelNumber);
if(sock_fastwrite(&socket,DataPackage,16)==-1)
{
tcp_listen(&socket,PORT,0,0,NULL,0);
while(!sock_established(&socket) && sock_bytesready(&socket)==-1)
tcp_tick(NULL);
}else
{
tcp_tick(&socket);
VdHitWd(watchdog);
}
// printf("PreInt0MaxPulWidthUpTime=%lu Int1axPulWidthUpTime=%lu\n",PreInt0MaxPulWidthUpTime,Int1MaxPulWidthUpTime);
// printf("WheelNumber=%ld\n",j);
// printf("WheelNumber=%lu WheelSpeed=%lu WheelBase=%lu \n",WheelNumber,DataPackage[2],WheelBase);
// printf("Int0UpTime=%lu Int0DownTime=%lu\n",Int0UpTime,Int1UpTime);
//printf("Int1UpTime=%lu Int1DownTime=%lu\n",Int1UpTime,Int1DownTime);
// Int1UpTime=0;
// Int1DownTime=0;
}
j=j+1;
//车走定时发空包
if(j>WheelOverTime)
{
WheelNumber=WheelNumber+1;
WheelSpeed=Int1MaxPulWidthUpTime-PreInt0MaxPulWidthUpTime;
WheelBase=Int1MaxPulWidthUpTime-PreInt1MaxPulWidthUpTime;
DataPackage[1]=((0x000000ff&WheelNumber)<<24)+((0x0000ff00&WheelNumber)<<8);
DataPackage[2]=((0x000000ff&WheelSpeed)<<24)+((0x0000ff00&WheelSpeed)<<8);
DataPackage[3]=((0x000000ff&WheelBase)<<24)+((0x0000ff00&WheelBase)<<8);
if(sock_fastwrite(&socket,DataPackage,16)==-1)
{
tcp_listen(&socket,PORT,0,0,NULL,0);
while(!sock_established(&socket) && sock_bytesready(&socket)==-1)
tcp_tick(NULL);
}else
{
tcp_tick(&socket);
}
if(sock_fastwrite(&socket,TrainGone,16)==-1)
{
tcp_listen(&socket,PORT,0,0,NULL,0);
while(!sock_established(&socket) && sock_bytesready(&socket)==-1)
tcp_tick(NULL);
}else
{
tcp_tick(&socket);
}
TrainFlag=0;
Int0GoneFlag=0;
INT0PulWidthMax=0;
INT1PulWidthMax=0;
WheelNumber=0;
//Int0UpNumber=WheelNumber;
//Int1UpNumber=WheelNumber;
j=0;
SendedWheelNumber=0;
}
}
}
WrPortI(I0CR, &I0CRShadow, 0x00); // disable external interrupt 0
WrPortI(I1CR, &I1CRShadow, 0x00); // disable external interrupt 1
}//Main Function
/****** interrupt routines ******/
nodebug root interrupt void my_isr0()
{
Temp0=(long)counterMSB;
Temp0=(Temp0<<16)+counterLSB;
Int0VoltFlag=BitRdPortI(PEDR,0); //读取INT0的电位,0:低电平,1:高电平
if(Int0VoltFlag==0)
{
Int0DownTime=Temp0; //INT0下降沿边沿触发时间值
// if(Int1UpNumber<=SendedWheelNumber)
// {
//下降沿到计算脉宽
INT0PulWidth=Int0DownTime-Int0UpTime;
//找最大脉宽
//printf("Int0PulWidth=%lu Int0MaxPulWidthUpTime=%lu\n",INT0PulWidth,Int0MaxPulWidthUpTime);
if(INT0PulWidth>INT0PulWidthMax)
{
INT0PulWidthMax=INT0PulWidth;
Int0MaxPulWidthUpTime=Int0UpTime;
// }
}
}else
{
if(Int0GoneFlag==1)
{
INT0PulWidthMax=0;
INT1PulWidthMax=0;
WheelNumber=WheelNumber+1;
WheelSpeed=Int1MaxPulWidthUpTime-PreInt0MaxPulWidthUpTime;
if(WheelNumber==1)
{
WheelBase=0;
TrainFlag=1;
}else
{
WheelBase=Int1MaxPulWidthUpTime-PreInt1MaxPulWidthUpTime;
}
PreInt1MaxPulWidthUpTime=Int1MaxPulWidthUpTime;
}
Int0GoneFlag=0;
// Int0UpNumber=Int0UpNumber+1;
Int0UpTime=Temp0; //INT0上升沿边沿触发时间值
}
}
nodebug root interrupt void my_isr1()
{
Temp1=(long)counterMSB;
Temp1=(Temp1<<16)+counterLSB;
Int1VoltFlag=BitRdPortI(PEDR,1); //读取INT0的电位,0:低电平,1:高电平
if(Int1VoltFlag==0)
{
Int1DownTime=Temp1; //INT1下降沿边沿触发时间值
// if(Int0UpNumber<=SendedWheelNumber)
// {
INT1PulWidth=Int1DownTime-Int1UpTime;
if(Int0MaxPulWidthUpTime>PreInt0MaxPulWidthUpTime)
{
PreInt0MaxPulWidthUpTime=Int0MaxPulWidthUpTime;
Int0GoneFlag=1;
}
//在INT0未触发前取最大的时间间隔
if(INT1PulWidth>INT1PulWidthMax)
{
INT1PulWidthMax=INT1PulWidth;
Int1MaxPulWidthUpTime=Int1UpTime;
}
// }
}else
{
// Int1UpNumber=Int1UpNumber+1;
Int1UpTime=Temp1; //INT1上升沿边沿触发时间值
// }
}
}
#asm
timerb_isr::
push af ; save registers
push hl
ioi ld a, (TBCSR) ; load B1, B2 interrupt flags (clears flag); this
; should be done as soon as possible in the ISR
ld hl, (counterLSB)
inc hl ; decrement counter
ld (counterLSB),hl
ld a, h
and l
xor 0xff
jr nz, zhishu
ld hl,0000h
ld (counterLSB),hl
ld hl, (counterMSB)
inc hl ; decrement counter
ld (counterMSB),hl
zhishu:
ld a,0
ioi ld (TBM1R),a
ioi ld (TBL1R),a
done:
pop hl ; restore registers
pop af
ipres ; restore interrupts
ret ; return
#endasm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -