/********************************************************************* * * Microchip USB C18 Firmware Version 1.2 * ********************************************************************* * FileName: user.c * Dependencies: See INCLUDES section below * Processor: PIC18 * Compiler: C18 3.11+ * Company: Microchip Technology, Inc. * * * Author Date Comment *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Shiroh Nakanishi 08/09/09 Original. * Shiroh Nakanishi 08/10/09 Added the counter function. * Shiroh Nakanishi 08/28/09 Added SW status initialize. * Shiroh Nakanishi 08/31/09 Added RS485 monitor. * Shiroh Nakanishi 09/30/09 Added ADC function. * Shiroh Nakanishi 10/31/09 Added Stteping Motor control. * Shiroh Nakanishi 11/30/09 Added I2C function. * Shiroh Nakanishi 12/28/09 Added SPI function. ********************************************************************/ /** I N C L U D E S **********************************************************/ #include #include "typedefs.h" #include "usb.h" #include "io_cfg.h" // I/O pin mapping #include "user.h" #include "stdio.h" #include "string.h" //#include "i2c.h" /** V A R I A B L E S ********************************************************/ #pragma udata #define uart_ptr_max 32 char input_buffer[16]; char output_buffer[16]; char UART_buffer[uart_ptr_max]; byte ctstart,REGC7,COM_stage,SW[3],DN[4][4][9]; static byte message_state = 0; //rom char welcome[]={"Full-Speed USB - CDC RS-232 Emulation Demo\r\n\r\n"}; rom char welcome[]={"Full-Speed USB - CDC RS-232 Emulation Demo\r\n\r\n"}; rom char ansi_clrscr[]={"\x1b[2J"}; // ANSI Clear Screen Command rom char lastmessage[]={"Start Demo\r\n"}; // ANSI Clear Screen Command #define E 2 // RB2 LCD R #define RS 3 // RB3 LCD RS /** P R I V A T E P R O T O T Y P E S ***************************************/ //void InitializeUSART(void); void InitializeI2C(void); //void BlinkUSBStatus(void); BOOL Switch2IsPressed(void); BOOL Switch3IsPressed(void); void Exercise_Example(void); void COMM_USB(void); void WR_EEPROM(byte address, byte data); byte RD_EEPROM(byte address); void CONN_ALL_OFF(byte device); void CONN_ALL_ON(void); void CONN_ON(byte ASD_type, byte ASD_num); void namecpy(byte i, byte j, byte length); void LCDmenu2(void); void LCDcontrol(byte data); void LCDlocate(byte data); void LCDstring(char *ptr, byte n); void LCDwrite(byte data); void waitmsec(byte wait); void waitusec(byte wait); /** D E C L A R A T I O N S **************************************************/ #pragma code static byte aa[32] = { "aaaaaaa\r\n" }; static byte va1[18] = { " " }; const byte tt[12] = { "MULTI " }; const byte tt2[12] = { " MONITOR" }; const byte nm[8]="(ユ)NSL "; const byte dt[8]="08/10/09"; const byte mn1[8] = { "1 COUNTR" }; const byte mn2[8] = { "2 I2C " }; const byte mn3[8] = { "3 RS485 " }; const byte mn4[8] = { "4 SPI " }; const byte mn5[8] = { "5 UART " }; const byte mn6[8] = { "6 VDC " }; const byte mn7[8] = { "7 ADC " }; const byte mn0[8] = { " N/A " }; const byte mn9[8] = { "USB MODE" }; static unsigned char cnt=4; // cnt,cnt1はLED更新周期用カウンタ static unsigned char cnt1=10; static byte a,menu,x,y,RCVFLG,oldRA1,oldRA2,oldRA3,dsp_on,menu_selected; static byte I2C_state,I2C_DA,I2C_MDATA,I2C_SDATA,I2C_RA,TMR0L1,TMR0H1; static unsigned long freq; static word cnt0,cnt01; static byte uart_ptr,buffer_ptr; void UserInit(void) { // InitializeUSART(); // InitializeI2C(); TRISC = 0x41; // ProtC RC0:SW2 GREEN,RC1:BLUE LED, RC2:YELLOW LED, // RC6:RX,RC7:TX/SDO PORTC|= 0x0F; // PortC TRISA = 0x3E; // PORTA RA0:ANALOG CURRENT,RA1:ANALOG VOLT, // RA2:SW4 YELLOW,RA3:SW1 BLUE, RA4:CLOCK IN/TXRX,RA5:#SS PORTA = 0x01; // PortA TRISB = 0x00; // PORTB RB4-RB7:LCD DB4-DB7, RB2:LCD E, // RB3:LCD RS 、RB0:SDA/SDI,RB1:SCL/SCK PORTB|= 0xF3; // PortB T0CON = 0xB7; // タイマ0の設定, 16ビットモード, 割込み使用 //外部クロック、1:256プリスケーラ T1CON = 0xB1; //タイマ1の設定,16ビットモード、割込み使用 //内部クロック、1:8プリスケーラ CCP1CON = 0; //***** 優先順位割込み使用宣言 RCONbits.IPEN=1; IPR1bits.TMR1IP=1; //***** 低レベル使用周辺の定義 INTCON2bits.TMR0IP = 0; //***** 割込み許可 INTCONbits.GIEH=1; // 高レベル許可 INTCONbits.GIEL=1; // 低レベル許可 INTCONbits.T0IE = 1; // タイマ0割込み許可 PIE1bits.TMR1IE = 1; // タイマ1割込み許可 UIE = 0x7F; // USB割込み許可 ADCON1 = 0x0F; // ADC設定 RCSTA = 0x90; TXSTA = 0x20; PIE1bits.RCIE = 1; oldRA3 = 1; oldRA2=1; oldRA1=1; waitmsec(60); PORTBbits.RB3 = 0; // RS=0 PORTB = 0x20; // set high niblle PORTBbits.RB2 = 1; // E=1 _asm NOP _endasm; _asm NOP _endasm; _asm NOP _endasm; _asm NOP _endasm; PORTBbits.RB2 = 0; // E=0 LCDcontrol(0x28); // Set Font(5x7), Lines(2) waitusec(39); LCDcontrol(0x0F); // Set Display(ON), Cursor(ON),Blink(OFF) waitusec(39); LCDcontrol(1); // Display CLEAR waitmsec(1); waitusec(53); LCDcontrol(0x06); // Set Moving(Increment),SHIFT(OFF) waitusec(39); RCVFLG = 0; LCDlocate(0); LCDstring(tt,8); LCDlocate(0x40); LCDstring(tt2,8); waitmsec(255); waitmsec(255); LCDlocate(0x47); menu=7; menu_selected=0; PORTAbits.RA0 = 0; }//end UserInit void Exercise_Example(void) { static byte start_up_state = 0; if(start_up_state == 0) { start_up_state++; } else if(start_up_state == 1) { if(mUSBUSARTIsTxTrfReady()) { putrsUSBUSART(ansi_clrscr); start_up_state++; } } else if(start_up_state == 2) { if(mUSBUSARTIsTxTrfReady()) { putrsUSBUSART("\rMicrochip Technology Inc., 2007\r\n"); start_up_state++; } } else if(start_up_state == 3) { if(mUSBUSARTIsTxTrfReady()) { putrsUSBUSART(welcome); message_state++; if(message_state > 5) { start_up_state ++; // putrsUSBUSART(lastmessage); } else start_up_state = 0; } } }//end Exercise_Example void COMM_USB(void) { static byte devaddr, regaddr, i2cdata, i2cdata2 ; byte i,j,k,ch,I2Cdata2,ASD_type,ASD_num, *mm0, *mm1,menu_change; menu_change=0; if(PORTAbits.RA3==1){ // SW1 BLUE SW MENU ON/OFF if(oldRA3==0){ oldRA3=1; if(menu_selected) { menu_selected=0; PORTAbits.RA0=0; LCDlocate(0x40); LCDmenu2(); } else { menu_selected=menu+1; PORTAbits.RA0=1; } } else { oldRA3=1; } } else oldRA3=0; if(PORTAbits.RA2==1){ // SW4 YELLOW SW MENU DOWN if(oldRA2==0){ oldRA2=1; menu_change=1; menu--; if(menu==0) menu=7; } else { oldRA2=1; } } else oldRA2=0; if(PORTCbits.RC0==1){ // SW2 GREEN SW MENU UP if(oldRA1==0){ oldRA1=1; menu_change=1; menu++; if(menu>7) menu=1; } else { oldRA1=1; } } else oldRA1=0; LCDlocate(0); if(menu_change){ switch(menu){ case 1 : LCDstring(mn1,8); break; case 2 : LCDstring(mn2,8); break; case 3 : LCDstring(mn3,8); break; case 4 : LCDstring(mn4,8); break; case 5 : LCDstring(mn5,8); break; case 6 : LCDstring(mn6,8); break; case 7 : LCDstring(mn7,8); break; } LCDlocate(0x40); } if(menu_change){ PORTAbits.RA0= 0; LCDmenu2(); LCDlocate(0); } if((menu_selected)&&(dsp_on)){ switch(menu){ case 0 : case 1 : dsp_on=0; LCDlocate (0x40); LCDstring(" ",8); freq=(cnt01*0x10000+TMR0H1*0x100+TMR0L1)*256/100; sprintf(va1,"%8ld",freq); LCDlocate(0x46-strlen(va1)); LCDstring(va1,strlen(va1)); // LCDwrite(0x30); // LCDwrite(0x4B); break; case 2 : case 3 : case 4 : case 5 : case 6 : case 7 : LCDlocate(0x40); LCDstring(mn0,8); break; } } if(getsUSBUSART(input_buffer,2)) { aa[0] = input_buffer[0]; aa[1] = input_buffer[1]; aa[3] = input_buffer[3]; switch(aa[0]){ case 'C' : // Initialize command LCDlocate(0x40); LCDstring(mn9,8); COM_stage=1; for ( i=0; i<4; i++){ for ( j=0; j<4; j++){ aa[0]=0x4E; aa[1]=i*16+0x40+j; for(k=0; k<9; k++){ aa[2+k]=RD_EEPROM(aa[1]+k+3); } // while(mUSBUSARTIsTxTrfReady()==0); mUSBUSARTTxRam(aa,11); } } break; case 'S' : // Swtich command case 'R' : // read command aa[0]=buffer_ptr; for (i=0; i>4) - 4; ASD_num = aa[1]&0x0F; getsUSBUSART(input_buffer,9); namecpy(ASD_type,ASD_num,9); while(mUSBUSARTIsTxTrfReady()==0); // if(mUSBUSARTIsTxTrfReady()) mUSBUSARTTxRam(aa,4); break; */ } } }//end of COMM_USB void WR_EEPROM(byte addr, byte data) { EEADR = addr; EEDATA = data; EECON1bits.WREN = 1; EECON2 = 0x55; EECON2 = 0xAA; EECON1bits.WR = 1; while (EECON1bits.WR); }//end of WR_EEPROM byte RD_EEPROM(byte address) { EEADR = address; EECON2 = 0x55; EECON2 = 0xAA; return EEDATA; } void namecpy(byte i, byte j, byte length) { byte k,address; address = i*12*4+j*12; for(k=0; k16) wait= 16; TMR1H = 16*wait; TMR1L = 0; T1CONbits.TMR1ON = 1; //Timer start while(PIR1.TMR1IF); */ for (i=0; i16) wait= 16; TMR1H = 16*wait; TMR1L = 0; T1CONbits.TMR1ON = 1; //Timer start while(PIR1.TMR1IF); */ for (i=0; i>4; if(a<10){ return 0x30+a; } else { return 0x37+a; } } byte hexL(byte data) { int a; a=data&0x0F; if(a<10){ return 0x30+a; } else { return 0x37+a; } } /*********************************************************  優先順位を使った複数割込み   高レベル:タイマ1  低レベル:タイマ0 機能   タイマ0   :外部クロックのカウント   タイマ1   :25msごとの割込み、100msごとのタイマ0値読み出し ********************************************************/  //****** 割込みの宣言 優先順位使用 #pragma interrupt isr save = PROD #pragma interruptlow tmr0 save = WREG,BSR,STATUS,PROD //***** 割込みベクタジャンプ命令セット #pragma code isrcode = 0x8 void isr_direct(void) { _asm goto isr _endasm } #pragma code lowcode = 0x18 void low_direct(void) { _asm goto tmr0 _endasm } //**** 高レベル 割込み処理関数 #pragma code void isr(void) // 割り込み関数 { INTCONbits.GIEH=0; // 高レベル禁止 INTCONbits.GIEL=0; // 低レベル禁止 INTCONbits.T0IE = 0; // Timer0割り込み禁止 PIE1bits.TMR1IE = 0; // Timer1割り込み禁止 if(PIR1bits.TMR1IF){ // タイマ1割り込み25ms=4x8x37500 @48MHz PIR1bits.TMR1IF=0; // タイマ1割り込みフラグを0にする TMR1H = 0x6D; TMR1L = 0x84-10; // 0x6D84=655368-37500 if(--cnt1==0){ // cnt1を-1して結果が0? cnt1=4; // cnt1にLEDの更新周期を書き戻す if(PORTCbits.RC2) // 100m秒@20MHz(4x25mS) PORTCbits.RC2=0; //LED YELLOWを0.5秒間隔で点滅 else PORTCbits.RC2=1; TMR0L1=TMR0L; TMR0H1=TMR0H; cnt01=cnt0; TMR0H=0; dsp_on =1; cnt0=0; TMR0L=0; INTCONbits.GIEL=1; // 低レベル許可 } } else if(PIR1bits.SSPIF){ //I2C割り込み? // PORTAbits.RA0 = 1; PIR1bits.SSPIF=0; switch(I2C_state){ case 0: if(SSPSTATbits.BF){ I2C_DA=SSPBUF; I2C_state=1; } break; case 1: if(SSPSTATbits.BF){ I2C_RA=SSPBUF; I2C_state=2; } break; case 2: if(SSPSTATbits.BF){ if(SSPSTATbits.R_W==1){ I2C_state=3; } else { I2C_MDATA=SSPBUF; I2C_state=0; } } break; case 3: if(!SSPSTATbits.BF){ SSPBUF=I2C_SDATA; I2C_state=0; } break; } PIE1bits.SSPIE=1; } else if(PIR1bits.RCIF){ //USART割り込み? PIR1bits.RCIF=0; RCVFLG=1; a=RCREG; UART_buffer[uart_ptr++]=a; if(uart_ptr>uart_ptr_max) uart_ptr=0; } INTCONbits.GIEH=1; // 高レベル許可 INTCONbits.GIEL=1; // 低レベル許可 INTCONbits.T0IE = 1; PIE1bits.TMR1IE = 1; } //***** 低レベル割込み処理関数 void tmr0(void) // 割り込み関数 { if(INTCONbits.T0IF){ // タイマ0割り込み? INTCONbits.T0IF=0; // タイマ0割り込みフラグを0にする cnt0++; if(--cnt==0){ // cntを-1して結果が0? cnt=10; // cntにLEDの更新周期を書き戻す } } } /** EOF user.c ***************************************************************/