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

📄 18f2550 usb hid crc oscilloscope.c

📁 用电脑作示波器
💻 C
字号:
//////////////////////////////////////////////////////////////////////////////////                 PIC18F2550 USB HID Oscilloscope//// Filename     : 18F2550 USB HID CRC Oscilloscope.c// Programmer   : Steven Cholewiak, www.semifluid.com// Version      : Version 1.0 - 03/27/2006// Remarks      : More information on the circuit can be found at://                http://www.semifluid.com/PIC18F2550_usb_hid_oscilloscope.html////////////////////////////////////////////////////////////////////////////////#define __USB_PIC_PERIF__ 1#include <18F2550.h>#device ADC=8#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN#use delay(clock=48000000)#build(reset=0x1, interrupt=0x8)          // Necessary for Bootloader#ORG 0x0F00,0x0FFF {}                     // Necessary for Bootloader#use rs232(stream=PC, baud=115200, xmit=PIN_C6, rcv=PIN_C7, ERRORS)// CCS Library dynamic defines#DEFINE USB_HID_DEVICE  TRUE //Tells the CCS PIC USB firmware to include HID handling code.#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers#define USB_EP1_TX_SIZE    64  //allocate 64 bytes in the hardware for transmission#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for OUT bulk/interrupt transfers#define USB_EP1_RX_SIZE    64  //allocate 64 bytes in the hardware for reception// CCS USB Libraries#include <pic18_usb.h>   //Microchip 18Fxx5x hardware layer for usb.c#include <usb_desc_hid 8-byte.h>	//USB Configuration and Device descriptors for this UBS device#include <usb.c>        //handles usb setup tokens and get descriptor reportsvoid usb_debug_task(void) {   static int8 last_connected;   static int8 last_enumerated;   int8 new_connected;   int8 new_enumerated;   new_connected=usb_attached();   new_enumerated=usb_enumerated();   if (new_connected && !last_connected) {      printf("\r\n\nUSB connected, waiting for enumaration...");}   if (!new_connected && last_connected) {      printf("\r\n\nUSB disconnected, waiting for connection...");}   if (new_enumerated && !last_enumerated) {      printf("\r\n\nUSB enumerated by PC/HOST");}   if (!new_enumerated && last_enumerated) {      printf("\r\n\nUSB unenumerated by PC/HOST, waiting for enumeration...");}   last_connected=new_connected;   last_enumerated=new_enumerated;}#INT_RDAvoid serial_isr()                         // Serial Interrupt{   int8 uReceive;   disable_interrupts(GLOBAL);            // Disable Global Interrupts   uReceive = fgetc(PC);   switch (uReceive) {      case 0x12: {            if (fgetc(PC) == 0x34 & fgetc(PC) == 0x56 & fgetc(PC) == 0x78 & fgetc(PC) == 0x90) #asm reset #endasm         }         break;   }   enable_interrupts(GLOBAL);                // Enable Global Interrupts}int calc_crc(int oldcrc, int newbyte) {   // Please see: http://pdfserv.maxim-ic.com/arpdf/AppNotes/app27.pdf   int shift_reg, data_bit, sr_lsb, fb_bit, j;   shift_reg=oldcrc;   for(j=0; j<8; j++) {   // for each bit      data_bit = (newbyte >> j) & 0x01;      sr_lsb = shift_reg & 0x01;      fb_bit = (data_bit ^ sr_lsb) & 0x01;      shift_reg = shift_reg >> 1;      if (fb_bit)         shift_reg = shift_reg ^ 0x8c;      }   return(shift_reg);}#define theSampleSize            512#define usbConfirmAction         0#define usbCheckStatus           1#define usbReadRam               2#define usbWriteRam              3#define usbReadADC               4#define usbReadADCnTimes         5#define usbReadADCPeriod         6#define usbReadADCnTimesMS       7#define usbClearRam              8#define usbSetRamByte            9#define usbSetUseCRC             10#define usbClearUseCRC           11#define usbReadADCnTimesUS       12#define usbError                 66void main() {   int1 useCRC;   int8 in_data[8];   int8 out_data[8];   int8 adcData[theSampleSize];   int8 theCRC, tempADC;   int16 n, approxUS, approxMS, period;   SETUP_ADC_PORTS(AN0);   SETUP_ADC(ADC_CLOCK_DIV_64);   SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_1);   SETUP_TIMER_1(T1_DISABLED);   SETUP_TIMER_2(T2_DISABLED, 127, 1);   SETUP_TIMER_3(T3_INTERNAL | T3_DIV_BY_8);   SETUP_CCP1(CCP_OFF);   SETUP_CCP2(CCP_OFF);   enable_interrupts(INT_RDA);   enable_interrupts(GLOBAL);   usb_init();   useCRC = true;   set_adc_channel(0);   delay_ms(1);   while (TRUE) {      usb_task();      usb_debug_task();      if (usb_enumerated()) {         if (usb_kbhit(1)) {            usb_get_packet(1, in_data, 8);            if (useCRC) {               theCRC = 0;               theCRC = calc_crc(theCRC,in_data[0]);               theCRC = calc_crc(theCRC,in_data[1]);               theCRC = calc_crc(theCRC,in_data[2]);               theCRC = calc_crc(theCRC,in_data[3]);               theCRC = calc_crc(theCRC,in_data[4]);               theCRC = calc_crc(theCRC,in_data[5]);               theCRC = calc_crc(theCRC,in_data[6]);            }            else {               theCRC = in_data[7];            }            if (theCRC = in_data[7]) {               out_data[0] = 255;               out_data[1] = 255;               out_data[2] = 255;               out_data[3] = 255;               out_data[4] = 255;               out_data[5] = 255;               out_data[6] = 255;               switch (in_data[0]) {                  case usbReadRam: {                        if (make16(in_data[1],in_data[2]) <= theSampleSize) {                           out_data[0] = usbConfirmAction;                           out_data[1] = usbReadRam;                           out_data[2] = in_data[1];                           out_data[3] = in_data[2];                           out_data[4] = adcData[make16(in_data[1],in_data[2])];                        }                        else {                           out_data[0] = usbError;                           out_data[1] = usbReadRam;                           out_data[2] = in_data[1];                           out_data[3] = in_data[2];                        }                     }                     break;                  case usbWriteRam: {                        if (make16(in_data[1],in_data[2]) <= theSampleSize) {                           adcData[make16(in_data[1],in_data[2])] = in_data[3];                           out_data[0] = usbConfirmAction;                           out_data[1] = usbWriteRam;                           out_data[2] = in_data[1];                           out_data[3] = in_data[2];                           out_data[4] = in_data[3];                        }                        else {                           out_data[0] = usbError;                           out_data[1] = usbWriteRam;                           out_data[2] = in_data[1];                           out_data[3] = in_data[2];                           out_data[4] = in_data[3];                        }                     }                     break;                  case usbReadADC: {                        tempADC = READ_ADC();                        out_data[0] = usbConfirmAction;                        out_data[1] = usbReadADC;                        out_data[2] = tempADC;                     }                     break;                  case usbReadADCnTimes: {                        if (make16(in_data[1],in_data[2]) <= theSampleSize) {                           set_timer3(0);                           for (n=0;n<make16(in_data[1],in_data[2]);n++)                           {                              adcData[n] = READ_ADC();                           }                           period = get_timer3();   // 1000/((clock/4)/8) for ms                           out_data[0] = usbConfirmAction;                           out_data[1] = usbReadADCnTimes;                           out_data[2] = in_data[1];                           out_data[3] = in_data[2];                        }                        else {                           out_data[0] = usbError;                           out_data[1] = usbReadADCnTimes;                           out_data[2] = in_data[1];                           out_data[3] = in_data[2];                        }                     }                     break;                  case usbReadADCPeriod: {                        out_data[0] = usbConfirmAction;                        out_data[1] = usbReadADCPeriod;                        out_data[2] = make8(period,1);                        out_data[3] = make8(period,0);                     }                     break;                  case usbReadADCnTimesUS: {                        if (make16(in_data[1],in_data[2]) <= theSampleSize) {                           approxUS = make16(in_data[3],in_data[4]);                           for (n=0;n<make16(in_data[1],in_data[2]);n++)                           {                              set_timer3(0);                              adcData[n] = READ_ADC();                              while (get_timer3() * 2/3 < approxUS);   // 1000000/((clock/4)/8)                           }                           out_data[0] = usbConfirmAction;                           out_data[1] = usbReadADCnTimesUS;                           out_data[2] = in_data[1];                           out_data[3] = in_data[2];                           out_data[4] = in_data[3];                           out_data[5] = in_data[4];                        }                        else {                           out_data[0] = usbError;                           out_data[1] = usbReadADCnTimesUS;                           out_data[2] = in_data[1];                           out_data[3] = in_data[2];                           out_data[4] = in_data[3];                           out_data[5] = in_data[4];                        }                     }                     break;                  case usbReadADCnTimesMS: {                        if (make16(in_data[1],in_data[2]) <= theSampleSize) {                           approxMS = make16(in_data[3],in_data[4]);                           for (n=0;n<make16(in_data[1],in_data[2]);n++)                           {                              set_timer3(0);                              adcData[n] = READ_ADC();                              while (get_timer3() * 1/1500 < approxMS);   // 1000/((clock/4)/8)                           }                           out_data[0] = usbConfirmAction;                           out_data[1] = usbReadADCnTimesMS;                           out_data[2] = in_data[1];                           out_data[3] = in_data[2];                           out_data[4] = in_data[3];                           out_data[5] = in_data[4];                        }                        else {                           out_data[0] = usbError;                           out_data[1] = usbReadADCnTimesMS;                           out_data[2] = in_data[1];                           out_data[3] = in_data[2];                           out_data[4] = in_data[3];                           out_data[5] = in_data[4];                        }                     }                     break;                  case usbClearRam: {                        for (n=0;n<512;n++)                        {                           adcData[n] = 0;                        }                        out_data[0] = usbConfirmAction;                        out_data[1] = usbClearRam;                     }                     break;                  case usbSetRamByte: {                        for (n=0;n<512;n++)                        {                           adcData[n] = in_data[1];                        }                        out_data[0] = usbConfirmAction;                        out_data[1] = usbSetRamByte;                        out_data[2] = in_data[1];                     }                     break;                  case usbSetUseCRC: {                        useCRC = true;                        out_data[0] = usbConfirmAction;                        out_data[1] = usbSetUseCRC;                     }                     break;                  case usbClearUseCRC: {                        useCRC = false;                        out_data[0] = usbConfirmAction;                        out_data[1] = usbClearUseCRC;                     }                     break;               }               if (useCRC) {                  theCRC = 0;                  theCRC = calc_crc(theCRC,out_data[0]);                  theCRC = calc_crc(theCRC,out_data[1]);                  theCRC = calc_crc(theCRC,out_data[2]);                  theCRC = calc_crc(theCRC,out_data[3]);                  theCRC = calc_crc(theCRC,out_data[4]);                  theCRC = calc_crc(theCRC,out_data[5]);                  theCRC = calc_crc(theCRC,out_data[6]);                  out_data[7] = theCRC;               }               usb_put_packet(1, out_data, 8, USB_DTS_TOGGLE);            }            delay_ms(1);         }      }   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -