外设天下 - 电脑外设发烧友聚集地

123下一页
我的人缘0

[讨论] 打造自己的专属鼠标——鼠标DIY教程(五)

29 24420
楼主
跳转到指定楼层
发表于 2011-1-18 16:55 只看该作者 倒序浏览 阅读模式
本帖最后由 超电磁侠 于 2011-1-18 17:21 编辑

六、18f14k50 RTOS鼠标固件
   首先说明一下,按照上次列出的连接图,我们是有RC1RC2这两个接口空余的,原本我是将RC1做成了一个调节全彩LED的输出,但是考虑到教程的性质,到时还要将这个接口改成读取光学滚轮,那么我就把这个灯光效果的部分去掉,留下基础的功能。整体如下图所示:

注意: 除GPL发布声明的代码外, 其余程序均涉及私有代码库,不能视为开源,这些代码包括以下的鼠标固件代码,只能用于个人学习用途,商业使用需经版权人的授权。



#include <18F14k50.h>


#fuses HS,NOFCMEN,NOBROWNOUT,NOWDT,BORV30,NOPUT,NOCPD,STVREN,NOXINST,NOWRT,NOWRTD,NOWRTC,WDT32768,NOIESO,NOEBTR,NOEBTRB,NOMCLR,NOPROTECT,NOCPB,NOWRTB,CPUDIV1,USBDIV1,PLLEN,NOHFOFST,NOLVP
#use delay(clock=48000000)


#define USB_CONFIG_HID_TX_SIZE   64    // HID每次接收发送多少字节
#define USB_CONFIG_HID_RX_SIZE   64



#use rtos(timer=0,minor_cycle=150us)


#include <pic18_usb.h>   //Microchip PIC18Fxx5x hardware layer for usb.c
#include "usb_hid_mouse.h"   //USB Configuration and Device descriptors for this UBS device
                          //将附件中的usb_hid_mouse.h和主程序文件放一起
#include <usb.c>        //handles usb setup tokens and get descriptor reports

//#include <usb_bootloader.h>   // 我们暂时先不用bootloader,这行先注释掉
#include <math.h>
#include <stdlib.h>
//Global Var



#define CNCS  PIN_C6  //---------定义控制A3080的几个脚
#define NPD   PIN_C5
#define RESET PIN_C4


signed int8 DeltaX; //----------------存放读取出来的A3080坐标数据
signed int8 DeltaY;
signed int8 SumX;
signed int8 SumY;



//------------------------------------------

//--------------------------------------polling rate var
int PollCount=1;
int PollingRate=1;

int Squal; //----------------------存放 Squal





int16 Lcount;
int16 Lcount2;
int16 Rcount;
int16 Rcount2;
int16 Mcount;
int16 Mcount2;

int8 BLPressed;
int8 BRPressed;
int8 BMPressed;




int8 out_data2[4];
char out_data[64];
char in_data[64];





int8 ENStat;

#byte Portb=0xF81   //-----------------这个有点多余, P5=PIN_C5P7=PIN_C7,直接引用                           
                   //可以了,当时是为了方便引用吧。
#bit P5=PortB.5
#bit P7=PortB.7






#task(rate=600us,max=150us)  //定义RTOS各个任务
void  ReadButton( );


#task(rate=300us,max=150us)
void ReadMotion();

#task(rate=1050us,max=150us)
void UsbTransit ( );

#task(rate=9750us,max=150us)
void HidCom();





0
已赞
微信分享 收藏
回复

使用道具 举报

我的人缘0
推荐
发表于 2011-1-18 23:06 只看该作者
成立个Diy的群 如何 壳啥时候做 看不懂 帮顶
zsxh 发表于 2011-1-18 22:39

要再有两三个懂一点单片机,和想DIY的人才行, 我一个人就算神装也真心带不动一个群啊
回复 支持 1 反对 0

使用道具 举报

我的人缘0
2
发表于 2011-1-18 16:57 只看该作者
本帖最后由 超电磁侠 于 2011-1-18 17:17 编辑

//参照PDF,用NCS来控制SPI的使用,避免ESD等情况的影响,由NCS状态转换到SCLK停止,MOSI停止等要120~250ns
//保险起见直接定为1us
void SPI_Enable(void)

{
  output_low(CNCS);
  delay_us(1);
}

void SPI_Disable(void)
{
output_high(CNCS);
delay_us(1);
}


void HidCom()  //-------------HID 鼠标设置,对应野猫wildcat设置程序
{
  usb_task();
    int i;
    for(i=0;i<=63;i++){in_data=0;out_data=0;}

if (usb_enumerated())
      {


          if (usb_kbhit(1))
         {
            usb_get_packet(1, in_data, 64);


            if (in_data[0]==0x0D) { //----------------------------D for dpi, 这里就是用PC端发                       
                                 //送的字节来判断接收了什么命令


             if(in_data[1]==0x16){
             SPI_Enable();
             spi_write((0x80|0x0A));  //-------------------CCS内建的spi读写函数,
             spi_write(0x19);
             delay_us(50);           //根据A3080资料设置的延时,保险起见直接定为
                                   //50us
             SPI_Disable();          //用完SPI总线就关闭
             out_data[1]=0x16;}


             else if(in_data[1]==0x04){
             SPI_Enable();
             spi_write((0x80|0x0A));
             spi_write(0x09);
             delay_us(50);
             SPI_Disable();
            out_data[1]=0x04;}


             }






           if(in_data[2]==0x72){ //-------------------ascII:R, PollingRate,receive
           PollingRate=in_data[3];    //---------直接设置报告率
           out_data[3]=in_data[3];
           }




          if(in_data[4]==0x66){ //------------------------ASCII:F,FrameRate,receive, 6469~2000 的整数
          int lf=in_data[5];
          int hf=in_data[6];


          SPI_Enable();
          spi_write((0x80|0x19));
          spi_write((lf|0x00));
          delay_us(50);//---------------------------------lower


          spi_write((0x80|0x1A)); //-----------------------upper
          spi_write((hf|0x00));
          delay_us(50);


          SPI_Disable();
          out_data[5]=in_data[5];
          out_data[6]=in_data[6];






          }




          if(in_data[9]==0x73){ //--------------------------ascII:S, Squal,
            out_data[10]=Squal;}





            usb_put_packet(1, out_data, 64, USB_DTS_TOGGLE); // CCS内建函数,发送64个字节
         }




      }

}


回复 支持 反对

使用道具 举报

我的人缘0
3
发表于 2011-1-18 16:58 只看该作者
本帖最后由 超电磁侠 于 2011-1-18 17:06 编辑

void ReadButton( )                  // 读取按键,这里是加入了去抖动的算法,如下,
                                  //所谓抖动,就是金属弹片在开关时非常细微的跳动
                                 //造成端口在01之间快速变化,
                                  //会持续几十到100ms不等,用延时等方法也可,这
                                 //里用的办法比较巧妙,将读取的端口资料放入一个                     
                                //16bit的整数里,因为最后一次抖动到稳定状态肯定
                                 //100000000b这样的样式,
{


       Lcount=(Lcount<<1)|input(PIN_A3)|0xe000; //--------------left button
       if(Lcount==0xf000)
       BLPressed=0x01;


       if((ButtonStat&0x01)!=0x00)
      { Lcount2=(Lcount2<<1)|input(PIN_A3)|0xe000;
       if(Lcount2==0xefff)
       BLPressed=0x00;
      }
//-------------------------------------------------------- right button
      Rcount=(Rcount<<1)|input(PIN_C0)|0xe000;
       if(Rcount==0xf000)
       BRPressed=0x02;


       if((ButtonStat&0x02)!=0x00)
      { Rcount2=(Rcount2<<1)|input(PIN_C0)|0xe000;
       if(Rcount2==0xefff)
       BRPressed=0x00;
      }
//---------------------------------------------------------middle button
      Mcount=(Mcount<<1)|input(PIN_C3)|0xe000;
       if(Mcount==0xf000)
       BMPressed=0x04;


       if((ButtonStat&0x04)!=0x00)
      { Mcount2=(Mcount2<<1)|input(PIN_C3)|0xe000;
       if(Mcount2==0xefff)
       BMPressed=0x00;
      }




      ButtonStat=BRPressed | BLPressed | BMPressed ;




  }


void ReadMotion()
{

  int8 stat=0;
  int8 B2=0;
  int8 B3=0;
  int8 B4=0;
  int8 B5=0;
  int8 B6=0;
  int8 B7=0;
//------------------------------------------------
//以下用burst的办法读


SPI_Enable();


spi_write((0x00|0x50));   
delay_us(75);
stat=spi_read(0x00);             // CCS内建的spi读函数,读的时候必须提供一个时钟信
                              // 因为对18f14k50来说spi串口是双向传输的,所以加
                              //0x00,(在写入0x00的同时读取接收端)
B2=spi_read(0x00);
B3=spi_read(0x00);
B4=spi_read(0x00);
B5=spi_read(0x00);
B6=spi_read(0x00);
B7=spi_read(0x00);



SumX=SumX+B2;             //累加读入的移动数据
SumY=SumY+B3;
Squal=B4;

output_high(CNCS);   // 多余,只是提醒退出burst模式需要拉高NCS一定时间
delay_us(5);



  SPI_Disable();




}
回复 支持 反对

使用道具 举报

我的人缘0
4
发表于 2011-1-18 16:59 只看该作者
测试
本帖最后由 超电磁侠 于 2011-1-18 17:06 编辑

void UsbTransit ( )
{


    usb_task();              //-------usb任务



      if (usb_enumerated()) {



         DeltaX=SumX;       //----------------------这里可以根据需要加入修正算法,我喜
                           //欢无修正
         DeltaY=SumY;




         out_data2[0]=ButtonStat; //     button state goes here
         out_data2[1]=DeltaX;                         //  X




         out_data2[2]=(int)(~DeltaY)+1;    //2, 安华高定义的Y轴方向与HID鼠标的
                                       //定义是相反的。


        out_data2[3]=ENStat; //wheel state goes here
         ENStat=0x00;


        if(PollCount==PollingRate){   // 我们的这个任务是1050us循环一次,我们的原始
                                   //设定是1ms的报告率,只要加入延迟就可以做到
                                   //任意刷新率。                  
         PollCount=1;
         usb_put_packet(2,out_data2,4,USB_DTS_TOGGLE); //
         SumX=0;
         SumY=0;
         }
        else
         PollCount++;

      }

}


//----------------------------------------------------------
//控制adns-3080,初始化


//根据实际需要,NPD应该一直处于HIGH的状态,所以没有NPD_DOWN的函数
//  Wake from NPD  75 ms From NPD rising edge  to valid motion data at 2000 fps and shutter bound 8290. Max assumes





void NPD_START(void)
{
   output_high(NPD);
   delay_ms(10);
}

//触发3080reset脚,脉冲宽度最小10us,这里选用20us

void SENSOR_RESET(void)
{
   output_high(RESET);
   delay_us(50);
   output_low(RESET);


}



void SPI_RESET(void)
{
   output_high(CNCS);
   delay_us(1);
   output_low(CNCS);
   delay_us(1);
   SPI_Disable();
  }
//-----------------------------------------------------------------------




//根据pdf0x44-->0x20 ,  0x07--->0x23 , 0x88--->0x24 , 然后等1frame0x18--->0x14 , 然后开始burst mode0x60
//根据pdf,地址的MSB,写入3080时为1,因此此要确保是8
回复 支持 反对

使用道具 举报

我的人缘0
5
发表于 2011-1-18 17:00 只看该作者
本帖最后由 超电磁侠 于 2011-1-18 17:07 编辑

//--------------------------------------------------------------------------------------A3080SROM

const int8 SROM[]={
0xe6,0xff,0x40,0x22,0x86,0xaa,0x9f,0x73,0xdc,0x34,0x5f,0x1d,0x0d,0x05,0xe2,0xae,
0x5c,0xe7,0x5e,0x67,0x2f,0xd2,0x45,0xaa,0xb7,0x2d,0xf9,0x71,0xc0,0xe2,0x89,0x8f,
0x18,0xc0,0x50,0xb1,0x4c,0x5b,0x1e,0xb3,0x53,0x32,0x56,0x3a,0x14,0xe7,0x64,0x58,
0x41,0x24,0x03,0x3c,0xc5,0x2a,0x9c,0x8c,0x06,0xa7,0xa2,0x1f,0x23,0xf7,0x64,0xe6,
0x1b,0x50,0x97,0x3a,0x8a,0x86,0x16,0x4a,0xf5,0x77,0x5b,0x28,0x5d,0xa6,0xe0,0xcf,
0xc1,0x4a,0x28,0x62,0xfb,0x85,0x09,0x80,0x07,0xce,0x11,0x59,0xd4,0x89,0xcf,0xc1,
0x42,0x1d,0x05,0xea,0xa2,0x47,0x2e,0x0f,0xa1,0x10,0x0c,0xb4,0xe1,0x3f,0x95,0x70,
0x6d,0x4d,0xc0,0xce,0x8b,0x49,0x46,0x6e,0xfd,0x77,0x84,0x7e,0x62,0x0a,0x5d,0xaa,
0xc7,0x5d,0xa7,0x64,0x8d,0xc6,0x17,0x0d,0x44,0x6a,0xdc,0x56,0xae,0xa2,0x35,0xd0,
0xd9,0xdb,0xa7,0x68,0xc1,0xa5,0xcb,0xdb,0xda,0xdf,0xe9,0x65,0xb9,0x55,0x49,0xf0,
0x8f,0xe8,0x6e,0x4b,0xca,0xfc,0xe4,0x14,0x91,0x7a,0xaf,0x59,0x74,0x54,0x11,0x69,
0xf1,0xce,0x80,0xc0,0xd1,0x99,0x40,0x81,0x36,0x20,0x48,0x69,0x92,0xb1,0x44,0xdc,
0x97,0x4f,0x0e,0x95,0xc3,0x27,0x23,0xcf,0x7a,0xcd,0xe8,0x33,0x1b,0x12,0x9f,0xde,
0x2f,0x60,0x04,0x05,0x43,0x80,0x6b,0x0c,0xa1,0x72,0x26,0x36,0x46,0x51,0xbd,0x6c,
0xa2,0x4b,0x93,0x4b,0x3e,0x9b,0x5a,0x60,0xd8,0x23,0xa5,0x37,0x6b,0x04,0x37,0x11,
0xa8,0x32,0xec,0x1b,0x0b,0x06,0x6e,0x59,0xe8,0xf7,0x6c,0x26,0x03,0xb7,0xf2,0xec,
0x97,0x9d,0xc9,0x74,0x65,0xf3,0x90,0x58,0xa7,0x36,0x7b,0x6f,0xe8,0x31,0x05,0xfe,
0x04,0x9a,0xa4,0x73,0xa7,0xcf,0x27,0x78,0x8f,0xdc,0xd3,0xc6,0x14,0x55,0x76,0xa1,
0x24,0xcc,0xb0,0x38,0x53,0x7f,0x7b,0xf8,0x23,0xd7,0x09,0xd7,0xee,0xb8,0x19,0x1d,
0x0a,0x9a,0x70,0xdd,0xd8,0x5e,0x70,0x6f,0xd4,0xe9,0x2c,0x23,0x44,0xe0,0x3e,0xa7,
0x7d,0x31,0xf4,0x79,0xd0,0x40,0xfe,0x8e,0x8f,0x01,0xbc,0x4e,0x7f,0xbd,0x16,0xde,
0x9b,0xd5,0xcb,0xf5,0x18,0xb0,0x2a,0x00,0x31,0x26,0x89,0x4b,0x62,0x14,0x95,0x21,
0x45,0x2a,0x6a,0x99,0x38,0x8e,0xf3,0xad,0x25,0xfd,0xd0,0x1d,0x4a,0x91,0xf6,0xb7,
0x71,0x01,0x5a,0xcd,0xc1,0x99,0x50,0xad,0x77,0x55,0x95,0xfd,0x88,0x0e,0xde,0xeb,
0xb6,0x54,0xe1,0x8d,0xfd,0x6d,0x02,0x3d,0x00,0x15,0x75,0x43,0x88,0x17,0x04,0x15,
0x39,0x95,0xaa,0x25,0x40,0x67,0x91,0x9b,0x7e,0x1d,0x6b,0xf2,0xaa,0x73,0x8f,0xf3,
0x8f,0x75,0x0c,0x55,0x1a,0x41,0x8c,0xab,0xab,0x79,0xf8,0xc8,0x91,0xc2,0x70,0xe0,
0xca,0x2a,0x8b,0xde,0x97,0x1c,0xcc,0xc7,0xa5,0x8f,0x55,0x9f,0x08,0x0d,0xe8,0x89,
0x90,0xf9,0xe2,0xa1,0x87,0xb6,0x25,0xa0,0x5a,0x71,0xc5,0x28,0x6e,0x17,0xef,0xb2,
0x58,0x8c,0xc6,0xe2,0xcf,0x26,0x93,0x29,0x63,0x59,0xbc,0x71,0x8e,0xe0,0x91,0x61,
0x06,0xb0,0x65,0x07,0x51,0x45,0x2e,0xa3,0xa7,0x7c,0x75,0x6b,0x57,0x36,0x70,0xb2,
0xbc,0xe4,0x08,0x6b,0xe2,0x8c,0x44,0x06,0x39,0x11,0xe0,0xd7,0x9c,0x13,0x4b,0x09,
0xdc,0x16,0x9a,0xda,0x20,0x64,0xd5,0x8a,0xe5,0x4b,0x58,0x69,0x6c,0x96,0x05,0x07,
0x03,0xd2,0x2d,0xce,0xbb,0x4c,0x88,0xe2,0x64,0x05,0xa4,0x48,0x41,0xeb,0x15,0xd8,
0x42,0xaa,0xd5,0x83,0x52,0x79,0xcf,0xa5,0x3b,0x54,0x56,0xa2,0xe2,0xcb,0xf3,0xf2,
0xcb,0xf2,0x17,0x02,0x6b,0xff,0x32,0x27,0x4d,0xbb,0xe7,0x65,0x7d,0x88,0x36,0xad,
0x66,0x64,0x8b,0x1a,0x65,0xee,0xa2,0x0c,0xc3,0xde,0xce,0x7e,0xd7,0x4d,0xe2,0xd7,
0x5c,0xc1,0xd6,0xc3,0xe2,0x91,0x31,0x5d,0xaf,0x9c,0x93,0xb8,0x4a,0x83,0x22,0x07,
0x62,0x17,0xe8,0x73,0x06,0x8f,0xff,0x9e,0x24,0xd9,0xf7,0x11,0xdb,0x0f,0xbd,0x5c,
0xda,0x93,0x7f,0x96,0xd1,0x98,0xf8,0x2b,0x8c,0x77,0xfc,0xc3,0xc4,0x97,0x5d,0x74,
0x3a,0xa4,0x42,0xf5,0x97,0xe9,0x81,0x73,0x71,0xf3,0x81,0x94,0x47,0x96,0x91,0x60,
0x6e,0x8f,0x0d,0xf2,0xa4,0x62,0x1e,0x58,0xcf,0x03,0x7c,0x31,0x5b,0xa8,0x24,0x1b,
0xc9,0x31,0x30,0x07,0xdd,0xaa,0x31,0x86,0x55,0x93,0x42,0xec,0x17,0xca,0xdc,0x20,
0x2a,0x60,0x2d,0x4e,0xce,0xae,0xa4,0x66,0x48,0x09,0x7a,0xa5,0x4d,0x4d,0xdd,0xc2,
0xb3,0x85,0x1a,0x6f,0x0c,0x27,0xa8,0x5d,0xf8,0x2e,0xde,0xa3,0xde,0xf4,0xe8,0xaa,

回复 支持 反对

使用道具 举报

我的人缘0
6
发表于 2011-1-18 17:01 只看该作者
0x64,0xa7,0x69,0x9a,0xf8,0x78,0xba,0x73,0x8a,0xfd,0xee,0x06,0x72,0x5d,0xf2,0xe4,
0x90,0xf7,0xa0,0x46,0xe5,0x06,0x44,0xe3,0xc1,0xee,0x92,0x23,0xc2,0x7c,0xd1,0xd2,
0x31,0xba,0xeb,0x2f,0x16,0x4d,0xe2,0xf0,0xcf,0x98,0x38,0xbc,0x11,0x68,0xd7,0xc2,
0xeb,0x91,0xe6,0x34,0x60,0xd1,0x48,0x95,0x54,0x30,0x49,0xb3,0x30,0x8a,0x5a,0xb2,
0xec,0x14,0x41,0xe9,0xf4,0x84,0x46,0xea,0x31,0x5a,0xbc,0x29,0xb9,0xa1,0xc5,0x2c,
0x07,0x16,0xfd,0x90,0x5f,0x95,0x41,0xdc,0xf2,0xc3,0x6e,0x57,0xf0,0xea,0x0f,0xdc,
0xf0,0x58,0x5c,0x83,0x59,0x8a,0xff,0xe2,0xc9,0x33,0x5a,0xfc,0xde,0x4f,0x42,0x89,
0xbe,0x66,0xfe,0x27,0x93,0x94,0x2a,0xfb,0xca,0xd5,0x78,0x79,0x4a,0x64,0x71,0xb0,
0xb2,0xda,0x84,0x2c,0xd6,0x16,0xf3,0x79,0xfc,0x31,0x89,0x13,0xb8,0x39,0x2b,0x37,
0x5c,0xd3,0x1e,0xb6,0xfa,0x4a,0x79,0x62,0x9c,0x86,0xb6,0x22,0x00,0xcc,0xc6,0x05,
0x8c,0x86,0x98,0xd5,0x61,0x11,0xc2,0x67,0x06,0x8a,0x14,0x34,0xe9,0xd3,0x0a,0xae,
0x45,0x50,0x52,0x23,0x43,0xd5,0x6d,0x1f,0x45,0x7c,0x91,0xe5,0x2b,0x2d,0x2c,0xef,
0xbf,0x70,0x3a,0x0a,0x8c,0x50,0xc1,0xf4,0x21,0x0c,0x1e,0x34,0xc5,0xe3,0xad,0x7c,
0x94,0x87,0x49,0x96,0x58,0x91,0x8c,0xf9,0x26,0xa6,0xb6,0x72,0x0e,0xad,0x36,0x75,
0x38,0x0e,0x84,0x40,0xa1,0x60,0xc2,0xeb,0xd0,0xa8,0xbd,0x13,0x8d,0x3c,0x14,0x87,
0x49,0x96,0x48,0x4d,0x9f,0x21,0x4c,0xc2,0xf6,0xce,0x6c,0xd9,0x5a,0x2f,0x55,0x40,
0x47,0xd4,0x8c,0x7d,0x9b,0xbf,0xff,0xbe,0x88,0x06,0x7e,0x72,0x96,0xd3,0x66,0x0c,
0x9c,0x29,0x62,0xaf,0xb1,0xd8,0x32,0x84,0x19,0x08,0x44,0xac,0xdc,0x80,0x03,0x47,
0x18,0x8e,0xb5,0x2d,0xde,0x6a,0x2a,0xcd,0x41,0x82,0x8c,0x19,0x78,0xc8,0x08,0xa8,
0x42,0x01,0x1f,0x9b,0x73,0xab,0x71,0x42,0x99,0x97,0x75,0x44,0xf3,0x7c,0x42,0x47,
0x89,0x5b,0xb1,0xb1,0x34,0xe1,0x73,0xf2,0x60,0x68,0xc6,0x25,0x3b,0x12,0xdb,0x9e,
0x1f,0x90,0x88,0xb6,0x9b,0x49,0xa0,0xa6,0x9e,0x0e,0xb7,0x0c,0x42,0xb4,0x62,0x4a,
0x0f,0x5c,0x59,0xc2,0x83,0xd9,0x53,0xea,0x4e,0x5e,0xf0,0x8c,0x9d,0xb1,0xe1,0x1c,
0xa6,0x7f,0x07,0x76,0x39,0x8c,0x4f,0xc0,0x10,0x8f,0xaf,0xf1,0x53,0xe8,0x40,0x0e,
0x8c,0x96,0x9d,0x95,0x7a,0x5b,0x07,0x80,0xb1,0xac,0xe9,0x6f,0xd1,0xb2,0xc7,0x36,
0x96,0x07,0xf0,0xcc,0x08,0x9e,0x8d,0x94,0x99,0x9d,0x8b,0xb6,0x8e,0x26,0x9b,0x7b,
0xd8,0xe3,0x8e,0x79,0x43,0x29,0xc2,0x0a,0x84,0x89,0x4b,0xa5,0x1b,0x9e,0x87,0x79,
0x90,0xce,0x0e,0x81,0xb5,0xd0,0x11,0x83,0xb8,0xf7,0x1f,0xc4,0x14,0xca,0x11,0xb2,
0xea,0x12,0xdd,0xb3,0xe0,0xf5,0x57,0xed,0x17,0x2e,0x44,0x0f,0x8e,0xbe,0xa6,0xaf,
0xdf,0xe9,0xcb,0x3b,0x70,0x12,0xe2,0x55,0x67,0x67,0x5e,0x13,0x76,0x2d,0x71,0x07,
0x9e,0x7c,0xed,0xc9,0xe5,0x7f,0x04,0xe4,0x58,0x1f,0x6e,0x73,0x57,0xe0,0x71,0x43,
0xd9,0xf4,0x44,0x08,0x80,0x8e,0xad,0xbd,0x11,0x4c,0xfa,0x43,0x40,0xb2,0x40,0x95,
0xd8,0x8d,0x19,0x85,0x4d,0x89,0x14,0xfb,0x29,0x58,0x35,0xed,0x83,0x8b,0x61,0x35,
0x3c,0xd6,0x18,0xaa,0xe0,0xad,0x73,0x11,0x24,0x61,0x69,0x7b,0x14,0x56,0xf9,0x95,
0x48,0xfc,0x02,0xe9,0xf7,0xf1,0x28,0x15,0x4c,0xa0,0x73,0xc5,0x29,0x7d,0xab,0x4c,
0x67,0xd9,0xc5,0xd0,0x86,0xec,0x38,0xb9,0xa8,0x21,0xf4,0x53,0x78,0x78,0x3c,0xc6,
0xfb,0x12,0xe5,0xb3,0x94,0x37,0x7e,0x19,0x53,0xc1,0x75,0x03,0x57,0xab,0x59,0x2a,
0xcc,0x9a,0x60,0x34,0x08,0x8f,0x1e,0x36,0xec,0x89,0xb8,0x27,0xdc,0x8d,0x3d,0x2d,
0xbd,0x3f,0x5e,0x54,0x12,0x5f,0x6a,0x2c,0xfc,0x17,0x9a,0x92,0xc0,0x38,0x7f,0x7c,
0x67,0x37,0x47,0x8e,0x0e,0x1d,0x95,0x2c,0x10,0x0d,0x73,0xcd,0x9d,0x56,0x2c,0x68,
0x5b,0x05,0x2f,0xf5,0x07,0x5d,0x78,0x29,0xf6,0xbb,0x22,0xb8,0x58,0x8c,0x85,0x89,
0xe2,0x89,0x1c,0xd1,0x83,0x0f,0x8d,0x2e,0x4f,0xe8,0xff,0x6c,0x3f,0x99,0x4d,0xa7,
0xca,0x15,0xa9,0x59,0xea,0x33,0x25,0xff,0x80,0xaf,0x88,0x6e,0x93,0x0d,0xab,0x61,
0x00,0x18,0x11,0x9a,0x67,0xda,0x42,0x83,0xf8,0xf7,0x8d,0x19,0x3c,0xe4,0x36,0x64,
0x69,0xf0,0x07,0x55,0x7f,0x1f,0x23,0xbf,0x03,0x55,0xb0,0x5c,0x08,0x84,0x4b,0xc1,
0x0a,0xb9,0x53,0x75,0x9a,0x09,0x0b,0x37,0x55,0x63,0x9c,0xa5,0x7f,0x62,0xab,0x34,
0x1e,0xb4,0x24,0x48,0x83,0x57,0x93,0xff,0x1f,0x08,0x03,0x5c,0xe6,0xb6,0x6f,0x9b,
0x98,0x97,0x69,0x97,0xdb,0x67,0xc9,0xd7,0x84,0x66,0xc9,0xb6,0x9f,0x40,0x07,0x4b,
0x93,0x95,0x6d,0x9f,0x65,0xe6,0xcf,0xba,0x9d,0x70,0xa7,0x0b,0x2f,0x95,0x4c,0xdd,
0x1e,0xcc,0xfc,0x9c,0x35,0x89,0x70,0xa5,0x66,0xcc,0x1b,0x73,0xd8,0xf6,0x88,0x55,
0xb7,0x8f,0x7a,0x90,0xc0,0xba,0x35,0x2f,0xac,0x03,0x4c,0x7c,0x74,0x49,0xa7,0xc5,

回复 支持 反对

使用道具 举报

我的人缘0
7
发表于 2011-1-18 17:01 只看该作者
0xb5,0x0b,0x26,0x09,0x66,0xbb,0xf0,0x1e,0x19,0x96,0xbc,0xc1,0x3c,0x2f,0x0e,0x36,
0x31,0x2b,0x04,0x3e,0x6a,0x4f,0x39,0x7f,0xeb,0x05,0x74,0x53,0xdf,0x67,0xac,0xb6,
0x5c,0xe1,0xe5,0xc7,0x5f,0x25,0x34,0xd2,0xe3,0x83,0x62,0x33,0xe6,0x10,0x8d,0xa4,
0x59,0x1d,0x36,0xc8,0xe9,0xbf,0xf8,0x0e,0x0d,0xb5,0x5a,0xef,0x77,0x10,0x10,0x6e,
0xb1,0xe7,0x0c,0xc7,0x7d,0x37,0x1d,0x17,0x67,0xa7,0x2e,0xbe,0x56,0x27,0x38,0x03,
0xbb,0x3a,0x0b,0x11,0x16,0x82,0xb7,0x22,0x64,0xb1,0x42,0x07,0x05,0x60,0xb6,0xfe,
0xa0,0x4c,0x27,0x68,0xa6,0xc2,0x46,0x33,0x05,0x07,0xdc,0x26,0x69,0xd7,0xda,0x87,
0x6a,0x70,0x91,0xf9,0x90,0x65,0x35,0xab,0x2c,0xf7,0xe2,0x20,0xb3,0xdb,0x6c,0xa2,
0xb6,0xd7,0x8f,0x77,0xed,0x55,0x82,0x6a,0x25,0xd2,0xa4,0xa3,0x47,0x0d,0x6b,0x4e,
0x19,0x77,0xb2,0x04,0x6a,0x70,0x47,0x19,0x73,0x82,0x45,0x51,0xc2,0xc1,0xa1,0x5d,
0xa7,0xd5,0x98,0x7e,0xd1,0x01,0x44,0x64,0xb2,0xeb,0x94,0x0c,0x8e,0x68,0xaf,0xc7,
0x61,0x31,0x15,0xe6,0x21,0xc1,0x76,0x43,0x77,0x56,0xa2,0xd6,0xcb,0x7a,0x7d,0x73,
0xd2,0xea,0xd8,0x35,0xfb,0x2c,0x5c,0x38,0xe8,0x4c,0x89,0x9c,0x9d,0x8f,0x6c,0x42,
0x88,0x80,0x98,0x6c,0xc9,0x3d,0x6a,0x6c,0xbe,0xdd,0xfc,0xd4,0x15,0x68,0xf1,0xc6,
0xf4,0x41,0x7f,0x27,0x4f,0xf3,0x91,0x0f,0x88,0xa7,0x3a,0xba,0x45,0x32,0x44,0xe5,
0xed,0xd7,0x20,0x64,0xbc,0xb6,0x61,0x21,0x5a,0x0a,0x52,0x88,0x56,0x79,0x73,0x41,
0xf0,0x3a,0x71,0x60,0x58,0x0d,0x0b,0xb9,0x58,0x1f,0x07,0xb0,0x07,0xe2,0x02,0xb0,
0xe7,0x44,0x1b,0x8d,0xf8,0x5f,0x26,0xf1,0xf3,0x28,0x40,0x38,0x74,0x6e,0xfb,0xda,
0x2b,0xb1,0x03,0x03,0x5c,0x34,0x55,0x12,0x05,0x65,0xfd,0xb6,0xfd,0xe0,0xd5,0xe4,
0xb9,0xca,0x75,0x64,0xef,0xd3,0x6f,0xb6,0x58,0xfe,0xf2,0x41,0x9a,0x6b,0xf1,0xef,
0x7e,0xe5,0x29,0xb3,0xf5,0x30,0x47,0x0a,0x8c,0xa5,0x5b,0x19,0x19,0xbe,0x64,0x76,
0x8b,0x1b,0xf7,0xd6,0x2a,0xdc,0x2b,0xcc,0x9a,0x99,0x8b,0x8a,0x05,0x84,0xf9,0x4a,
0x70,0x64,0xef,0xb2,0xbc,0x32,0x05,0xee,0x68,0xc0,0x7d,0x42,0x66,0x44,0xde,0x70,
0x32,0x5b,0xa3,0xe9,0xa3,0xdf,0xbd,0xd3,0xe0,0xcd,0x73,0xaf,0x4b,0x39,0x5c,0x3e,
0x64,0x57,0xe8,0xbc,0x9f,0x4a,0x17,0x8d,0x89,0xa9,0x43,0x29,0x3a,0xfe,0xe4,0x76,
0xaa,0x59,0x55,0xde,0x39,0xfc,0x4a,0x2f,0x4f,0x31,0x78,0x5c,0xde,0xd8,0x69,0x98,
0x06,0xa2,0x43,0xa2,0xbc,0xf2,0xa4,0x4d,0x04,0x6f,0xb3,0xd0,0xaf,0xd5,0xf2,0xa8,
0xc4,0xd8,0x92,0xa7,0x36,0xe2,0xe9,0xdf,0x6d,0x84,0xa9,0x36,0x5f,0x20,0x51,0x0d,
0x00,0x88};
回复 支持 反对

使用道具 举报

我的人缘0
8
发表于 2011-1-18 17:02 只看该作者
本帖最后由 超电磁侠 于 2011-1-18 17:11 编辑

void Load_SROM(void)
{
  int16 i;



  SPI_Enable();




       spi_write((0x80|0x20)); //地址
       spi_write(0x44); //data
       delay_us(50);



      spi_write((0x80|0x23)); //地址
      spi_write(0x07); //data
      delay_us(50);



      spi_write((0x80|0x24)); //地址
      spi_write(0x88);      //data


      delay_us(50);
      SPI_Disable();


     delay_us(20); // 延迟>=1 frame






     SPI_Enable();


                      // SROM Enable , 根据pdf 写完这个reg到写完SROM load的地址,至少要间隔40us, 保险起见直接定为40us

    spi_write((0x80|0x14));
    spi_write(0x18);


    SPI_Disable();


    delay_us(40);


  SPI_Enable();            //特殊的模式,
  spi_write((0x80|0x60)); //打开burst模式,地址0x60
  delay_us(9);
  for(i=0;i<=1985;i++)
  {
     spi_write(SROM);
     delay_us(9);
  }
  SPI_Disable();
  delay_us(110);   //exit burst mode




}



//-------------------------------------------------------------


#INT_RB                 //-
------------------------机械编码器的解码,利用RB5interrupt
                         //on change来读取, 这里没有去抖动的机制,实测工作正常,            
                         //但是考虑到泛用性的问题,将来要加上,暂时没头绪,严格
                        //来说,不应该用中断来做的,这几天我试试用rtos的任务来解        
                        //决这个编码器的读取

void ReadEnc(void)

{

int k=P7;
int g=P5;



if(g==0)
{
   if(k==1)
    {Enstat=0x01;

    }
    if(k==0)
    {Enstat=0xFF;

     }

clear_interrupt(INT_RB5);

}

if(g==1)
{
    if(k==0)
      {Enstat=0x01;

      }

    if(k==1)
      {Enstat=0xFF;

      }
clear_interrupt(INT_RB5);

}



}
回复 支持 反对

使用道具 举报

我的人缘0
9
发表于 2011-1-18 17:02 只看该作者
测试
本帖最后由 超电磁侠 于 2011-1-18 17:16 编辑

void main(void) {




   int i;
   for(i=1;i<=63;i++){out_data
=0;in_data=0;}  




   set_tris_b(0xA0);

   P5=0;
   p7=0;


   setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_XMIT_L_TO_H | SPI_CLK_DIV_16);//spi 初始化




   port_a_pullups(8);
   delay_us(10);



   clear_interrupt(INT_RB5);
   enable_interrupts(INT_RB5);







   enable_interrupts(GLOBAL);



    Lcount=0;
    Lcount2=0;
    Rcount=0;
    Rcount2=0;
    Mcount=0;
    Mcount2=0;



    ButtonStat=0;

  //-----------------------------------------------------------  
    SENSOR_RESET();
    delay_us(50);


    NPD_START();


    SPI_RESET();


    Load_SROM();


//--------------------------------------   以上为A3080的标准初始化流程

  SPI_Enable();



  spi_write((0x80|0x0A));  //---------------------------------------设置默认dpi1600
  spi_write(0x19);
  delay_us(50);




   output_high(CNCS);
   delay_ms(1);
   output_low(CNCS);




  delay_us(1);


  spi_write((0x80|0x0B));//----------------------------设置Frame Rate6469
  spi_write(0x01);
  delay_us(50);


  spi_write((0x80|0x19));
  spi_write(0x7E);
  delay_us(50);//---------------------------------lower


  spi_write((0x80|0x1A)); //-----------------------upper
  spi_write(0x0E);
  delay_us(50);


  delay_ms(1);


SPI_Disable();


   usb_init_cs();         //------------------CCS USB库,初始化USB


   rtos_run();           //运行 RTOS




}


编译出hex文件, 然后把这个hex文件用我在教程(一)提到的PicKIT3MPLAB写入真正的Pic18f14k50,那么我们最核心的工作就完成了60%了。下期我将讲解如何搭建出PIC18f14k50的最小运行板,然后如何改造金环蛇。
附件为编译好的hex和USB描述的头文件,方便有需要的人自行编译
mouse rtos.rar (15.15 KB, 下载次数: 185)
回复 支持 反对

使用道具 举报

我的人缘0
10
发表于 2011-1-18 17:10 只看该作者
9# 超电磁侠 顶LZ
回复 支持 反对

使用道具 举报

123下一页
高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则