?? 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; //系統(tǒng)時鐘當(dāng)前值
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的電位,
//使系統(tǒng)在中斷0信號為低電平時切入
}
//系統(tǒng)開始工作前清零系統(tǒng)時鐘當(dāng)前計數(shù)值
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;
//車走定時發(fā)空包
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;
//車走定時發(fā)空包
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下降沿邊沿觸發(fā)時間值
// 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上升沿邊沿觸發(fā)時間值
}
}
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下降沿邊沿觸發(fā)時間值
// if(Int0UpNumber<=SendedWheelNumber)
// {
INT1PulWidth=Int1DownTime-Int1UpTime;
if(Int0MaxPulWidthUpTime>PreInt0MaxPulWidthUpTime)
{
PreInt0MaxPulWidthUpTime=Int0MaxPulWidthUpTime;
Int0GoneFlag=1;
}
//在INT0未觸發(fā)前取最大的時間間隔
if(INT1PulWidth>INT1PulWidthMax)
{
INT1PulWidthMax=INT1PulWidth;
Int1MaxPulWidthUpTime=Int1UpTime;
}
// }
}else
{
// Int1UpNumber=Int1UpNumber+1;
Int1UpTime=Temp1; //INT1上升沿邊沿觸發(fā)時間值
// }
}
}
#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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -