Cho em hỏi
Em có cái code này, xin được của 1 pro, em đã chỉnh lại tí chút, tuy nhiên nói chung là hoàn toàn không hiểu được nó, tại C của em kém quá.
Việc khai báo để nó kết nối ngon lành với máy tính thì có lẽ đi ăn sẵn ngon hơn, cái đó em không quan tâm.
Vấn đề em cần hỏi ở đây là, đâu là phần dữ liệu nhận về từ máy tính để so sánh, đâu là phần xuất tín hiệu điều khiển ra các chân. Em muốn điều chỉnh lại code cho nó phù hợp với các mục đích sử dụng khác nhau, em muốn truyền dữ liệu nhiều và liên tục.
Một điều nữa là muốn truyền ngược lại từ PIC lên PC thì phải làm sao?
Nếu có lòng hơn, nhờ mọi người giải thích dùm em xem cái chuẩn USB nó truyền nhận dữ liệu theo kiểu nào, tốc độ của nó phụ thuộc vào đâu. Nếu muốn can thiệp sâu hơn vào phần cứng, muốn tạo ra được một Host USB thì cần phải làm những gì?
Em có cái code này, xin được của 1 pro, em đã chỉnh lại tí chút, tuy nhiên nói chung là hoàn toàn không hiểu được nó, tại C của em kém quá.
Code:
//////////////////////////////////////////////////////////////////////////////// // // // Filename : 18F4550 USB Controler // Programmer : // Version : // Compiler : //////////////////////////////////////////////////////////////////////////////// #define __USB_PIC_PERIF__ 1 #include <18F4550.h> #device ADC=8 #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN #use delay(clock=20000000) #use rs232(stream=PC, baud=9600, 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 reports void 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_RDA void 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 } #define theSampleSize 512 #define usbConfirmAction 0 #define usbCheckStatus 1 #define usbWritePort 14 #define usbWritePin 16 void main() { int8 data_in[8]; int8 data_out[8]; int16 n, approxUS, approxMS, period; SETUP_ADC_PORTS(AN0_TO_AN4); 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); printf("\r\n\nPIC18f4550"); printf("\r\n\nMinh Duc ptit 2008"); usb_init(); 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, data_in, 8); data_out[0] = 255; data_out[1] = 255; data_out[2] = 255; data_out[3] = 255; data_out[4] = 255; data_out[5] = 255; data_out[6] = 255; switch (data_in[0]) { case usbWritePort: { output_b(data_in[1]); data_out[0] = usbConfirmAction; data_out[1] = usbWritePort; data_out[2] = data_in[1]; } break; case usbWritePin: { switch (data_in[1]) { case 0: output_bit(PIN_B0, data_in[2] & 1); break; case 1: output_bit(PIN_B1, data_in[2] & 1); break; case 2: output_bit(PIN_B2, data_in[2] & 1); break; case 3: output_bit(PIN_B3, data_in[2] & 1); break; case 4: output_bit(PIN_B4, data_in[2] & 1); break; case 5: output_bit(PIN_B5, data_in[2] & 1); break; case 6: output_bit(PIN_B6, data_in[2] & 1); break; case 7: output_bit(PIN_B7, data_in[2] & 1); break; } data_out[0] = usbConfirmAction; data_out[1] = usbWritePin; data_out[2] = data_in[1]; data_out[3] = data_in[2]; } break; } usb_put_packet(1, data_out, 8, USB_DTS_TOGGLE); delay_ms(1); } } } }
Vấn đề em cần hỏi ở đây là, đâu là phần dữ liệu nhận về từ máy tính để so sánh, đâu là phần xuất tín hiệu điều khiển ra các chân. Em muốn điều chỉnh lại code cho nó phù hợp với các mục đích sử dụng khác nhau, em muốn truyền dữ liệu nhiều và liên tục.
Một điều nữa là muốn truyền ngược lại từ PIC lên PC thì phải làm sao?
Nếu có lòng hơn, nhờ mọi người giải thích dùm em xem cái chuẩn USB nó truyền nhận dữ liệu theo kiểu nào, tốc độ của nó phụ thuộc vào đâu. Nếu muốn can thiệp sâu hơn vào phần cứng, muốn tạo ra được một Host USB thì cần phải làm những gì?
Comment