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

📄 speed.c

📁 2004年黄河R3000最终程序!个人编写
💻 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 + -