void Test_Uart0_AfcRx(void) { unsigned int i; rx_cnt=0; rx_end=0; afc_err=0; rxdataCk=(volatile U8 *)UARTBUFFER; rxdataPt=(volatile U8 *)UARTBUFFER; Uart_Port_Set(); Uart_Select(0); Uart_Printf("[Uart channel 0 AFC Rx Test]\n"); Uart_Printf("This test should be configured two boards.\n"); Uart_Printf("Connect Tx and Rx Board with twitsted(rx/tx, nCTS/nRTS) cable .\n"); Uart_Printf("\nConnect PC[COM1 or COM2] and UART1 of SMDK2410 with a serial cable!!! \n"); Uart_Printf("Then, press any key........\n"); Uart_Select(1); // Change the uart port Uart_Getch(); Uart_Printf("Press any key to start Rx and then Star Tx....\n"); Uart_Getch(); pISR_UART0=(unsigned) Uart0_AfcRxOrErr; rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit rUCON0 &= 0x400; // For the PCLK <-> UCLK fuction rUCON0 |= (1<<9)|(1<<8)|(1<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<2)|(1); //Clock,Tx:Lev,Rx:Lev,Rx timeout:o,Rx error int:o,Loop-back:x,Send break:x,Tx:o,Rx:o rUFCON0=(1<<6)|(0<<4)|(1<<2)|(1<<1)|(1); //Tx and Rx FIFO Trigger Level:4byte,Tx and Rx FIFO Reset,FIFO on rUMCON0=0x10; // Enable Uart0 AFC rINTMSK=~(BIT_UART0); rINTSUBMSK=~(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0); while(!rx_end); rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0); rUFCON0=(3<<6)|(2<<4)|(1<<2)|(1<<1)|(0); //Tx and Rx FIFO Trigger Level:12byte,Tx and Rx FIFO Reset,FIFO off Uart_Printf("\nEnd Rx, receive data count=%d\n",rx_cnt); for(i=0;i<AFC_BUFLEN;i++) if(i-(*rxdataCk++)) { Uart_Printf("i=%d\n",i); afc_err++; } if(afc_err) Uart_Printf("AFC test fail!! Error count=%d\n",afc_err); else Uart_Printf("AFC test is good!!\n"); Uart_Printf("\nConnect PC[COM1 or COM2] and UART0 of SMDK2410 with a serial cable!!! \n"); Uart_Printf("Then, press any key........\n"); Uart_Select(0); Uart_Getch(); Uart_Port_Return(); }
void Test_ADC(void) { U8 ch, mode; Uart_Printf("Select ADC Chanel: 0 or 1"); ch=Uart_Getch(); Uart_Printf("\n%c\n\n", ch); if (ch!='0' && ch !='1') { Uart_Printf("you select wrong chanel!\n"); return; } rADCDLY = 100; //ADC转换延时 // rADCTSC = 0; //设置ADC为普通模式 /* 进行ADC模块设置,其中x<<n表示第n位设置为x(若x超过一位,则向高位顺延) */ rADCCON = (0 << 0) | // ADC转换设置 未设置 (0 << 1) | // 读AD数据触发AD转换 未使用 (0 << 2) | // StandBy模式选择 为普通操作模式 (ch << 3) | // ADC通道选择 ch (49 << 6) | // CLKDIV = Fpclk /49+1/5 ,即转换时钟为1MHz Fpclk = 10M ADC转换频率400K (1 << 14) ; // 使能软件预设值 Uart_Printf("Select ADC Mode: 1.Enable 2.Read"); mode=Uart_Getch(); Uart_Printf("\n%c\n\n", mode); if (mode!='1' && mode !='2') { Uart_Printf("you select wrong model!\n"); return; } switch(mode) { case '1': Uart_Printf("ADC Enable-Convert Mode\n"); while(Uart_GetKey() != ESC_KEY) { AD_ENABLE(); } break; case '2': Uart_Printf("ADC Read-Convert Mode\n"); while(Uart_GetKey() != ESC_KEY) { AD_READ(); } break; // default: // break; } }
void Main(void) { unsigned int ret; //初始化串口0以方便调试 Uart0_Init_all(); //初始化软中断 swi_init(); //测试软中断 Uart_Printf("\n%s\n", "按下任意键,开始swi97 4个参数的软中断"); Uart_Getch(); swi97_int(11, 22, 33, 44); rGPFDAT |= 0xFF; rGPFDAT &=~(1<<4); Uart_Printf("\n%s\n", "按下任意键,开始swi98 4个参数的软中断"); Uart_Getch(); rGPFDAT |= 0xFF; rGPFDAT &=~(8<<4); delay(); rGPFDAT |= 0xFF; rGPFDAT &=~(4<<4); delay(); rGPFDAT |= 0xFF; rGPFDAT &=~(2<<4); delay(); rGPFDAT |= 0xFF; rGPFDAT &=~(1<<4); delay(); swi98_int(55, 66, 77, 88); Uart_Printf("\n%s\n", "按下任意键,开始swi99 4个参数的软中断"); Uart_Getch(); rGPFDAT |= 0xFF; rGPFDAT &=~(1<<4); delay(); rGPFDAT |= 0xFF; rGPFDAT &=~(2<<4); delay(); rGPFDAT |= 0xFF; rGPFDAT &=~(4<<4); delay(); rGPFDAT |= 0xFF; rGPFDAT &=~(8<<4); delay(); ret = swi99_int(91, 81, 71, 61); Uart_Printf("\nswi99返回值为%u\n", ret); while(1) { Uart_Getch(); } }
void Ts_Sep(void) { Uart_Printf("[Touch Screen Test.]\n"); Uart_Printf("Separate X/Y position conversion mode test\n"); rADCDLY = (50000); // ADC Start or Interval Delay rADCCON = (1<<14)|(ADCPRS<<6)|(0<<3)|(0<<2)|(0<<1)|(0); // Enable Prescaler,Prescaler,AIN7/5 fix,Normal,Disable read start,No operation rADCTSC = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3); // Down,YM:GND,YP:AIN5,XM:Hi-z,XP:AIN7,XP pullup En,Normal,Waiting for interrupt mode pISR_ADC = (unsigned)Adc_or_TsSep; rINTMSK =~(BIT_ADC); rINTSUBMSK =~(BIT_SUB_TC); Uart_Printf("\nType any key to exit!!!\n"); Uart_Printf("\nStylus Down, please...... \n"); Uart_Getch(); rINTSUBMSK |= BIT_SUB_TC; rINTMSK |= BIT_ADC; Uart_Printf("[Touch Screen Test.]\n"); }
void Check_Sel(void) { char yn; do{ rINTMSK |=BIT_GLOBAL|BIT_EINT2; Uart_Printf("\n\r Touch Screen coordinate Rang in:\n"); Uart_Printf(" (Xmin,Ymin) is :(%04d,%04d)\n",Xmin,Ymin); Uart_Printf(" (Xmax,Ymax) is :(%04d,%04d)\n",Xmax,Ymax); Uart_Printf("\n To use current settings. Press N/n key. "); Uart_Printf("\n\n\r Want to Set Again(Y/N)? "); yn = Uart_Getch(); rI_ISPC = BIT_EINT2; // clear pending_bit rINTMSK =~(BIT_GLOBAL|BIT_EINT2); if((yn == 0x59)|(yn == 0x79)|(yn == 0x4E)|(yn == 0x6E)) Uart_SendByte(yn); if((yn == 0x59)|(yn == 0x79)) { Uart_Printf("\n\n Touch TSP's Cornor to ensure Xmax,Ymax,Xmax,Xmin"); //Init X Y rectangle Xmax = 750; Xmin = 200; Ymax = 620; Ymin = 120; oneTouch = 0; CheckTSP = 1; // mask to check while(CheckTSP); }else break; }while(1); }
void Test_Uart0_AfcTx(void) { int i; tx_cnt=0; tx_end=0; txdataFl=(volatile U8 *)UARTBUFFER; txdataPt=(volatile U8 *)UARTBUFFER; for(i=0;i<AFC_BUFLEN;i++) *txdataFl++=i; // Initialize the AFC data Uart_Port_Set(); Uart_Select(0); Uart_Printf("[Uart channel 0 AFC Tx Test]\n"); Uart_Printf("This test should be configured two boards.\n"); Uart_Printf("Connect Tx and Rx Board with twitsted(rx/tx, nCTS/nRTS) cable .\n"); Uart_Printf("\nConnect PC[COM1 or COM2] and UART1 of SMDK2410 with a serial cable!!! \n"); Uart_Printf("Then, press any key........\n"); Uart_Select(1); // Change the uart port Uart_Getch(); Uart_Printf("Start Rx first and then press any key to start Tx.....\n"); Uart_Getch(); pISR_UART0=(unsigned) Uart0_AfcTx; rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit rUCON0 &= 0x400; // For the PCLK <-> UCLK fuction rUCON0 |= (1<<9)|(1<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1); //Clock,Tx:Lev,Rx:Lev,Rx timeout:x,Rx error int:x,Loop-back:x,Send break:x,Tx:int,Rx:int rUFCON0=(1<<6)|(0<<4)|(1<<2)|(1<<1)|(1); //Tx and Rx FIFO Trigger Level:4byte,Tx and Rx FIFO Reset,FIFO on rUMCON0=0x10; // Enable Uart0 AFC rINTMSK=~(BIT_UART0); rINTSUBMSK=~(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0); while(!tx_end); rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0); rUFCON0=(3<<6)|(2<<4)|(1<<2)|(1<<1)|(0); //Tx and Rx FIFO Trigger Level:12byte,Tx and Rx FIFO Reset,FIFO off Uart_Printf("\nEnd Tx, transfer data count=%d\n",tx_cnt); Uart_Printf("\nConnect PC[COM1 or COM2] and UART0 of SMDK2410 with a serial cable!!! \n"); Uart_Printf("Then, press any key........\n"); Uart_Select(0); Uart_Getch(); Uart_Port_Return(); }
void TS_Test(void) { Lcd_TC(); TS_init(); Check_Sel(); Uart_Printf("\n Pixel: 320 X 240. Coordinate Rang in: (0,0) - (320,240)\n"); Uart_Printf("\nLCD TouchScreen Test Example(please touch LCD screen)\n"); Uart_Printf("\npress any key to exit...\n"); Uart_Getch(); TS_close(); }
/********************************************************************************************* * name: main * func: c code entry * para: none * ret: none * modify: * comment: *********************************************************************************************/ void Main(void) { char input_char; /* user input char */ sys_init(); /* Initial 44B0X's Interrupt,Port and UART */ _Link(); /* Print Misc info */ while(1) { Uart_Printf("\n > Embest S3CEV40 board. < "); Uart_Printf("\n <<Extenal Interrupt>> Test. Y/y to continue,any key skip it.\n"); input_char = Uart_Getch(); if(input_char == 'Y' || input_char == 'y') Test_Eint(); } }
void Main(void) { Uart0_Init_all(); Led_Init() ; Uart_Printf("\n%s\n", "Led相关引脚已经初始化完毕!请按任意键开始闪烁"); Uart_Getch(); while(1) { rGPFDAT &= 0x0F; Uart_Printf("\n%s\n", "Led亮"); delay(); rGPFDAT |= 0xFF; Uart_Printf("\n%s\n", "Led灭"); delay(); } }
char Uart() { char id[20]={}; char nz[]={0x37,0x34,0x39}; char sj; char x,xx; char y=0; int data; Uart_Init(0,9600); Uart_Select(1); bz=0; if(rUTRSTAT1 & 0x1) { for(y=0;y<8;y++) { sj=Uart_Getch(); id[y]=sj; } } if(id[2]==nz[1]) { bz=1; } else bz=0; if(id[0]!=0) { x = id[1]; xx=id[2]; } return bz; }
void Uart_GetString(char *string) { char *string2 = string; char c; while((c = Uart_Getch())!='\r') { if(c=='\b') { if( (int)string2 < (int)string ) { Uart_Printf("\b \b"); string--; } }else{ *string++ = c; Uart_SendByte(c); } } *string='\0'; Uart_SendByte('\n'); }
void Test_Touchpanel(void) { rADCDLY=50000; //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value Uart_Printf("ADC touch screen test\n"); rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En pISR_ADC = (int)AdcTsAuto; rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear rINTSUBMSK=~(BIT_SUB_TC); Uart_Printf("\nType any key to exit!!!\n"); Uart_Printf("\nStylus Down, please...... \n"); Uart_Getch(); rINTSUBMSK|=BIT_SUB_TC; rINTMSK|=BIT_ADC; Uart_Printf("Touch Screen Test is Finished!!!\n"); }
/* void Test_Touchpanel(void) { rADCDLY=50000; //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value Uart_Printf("\nTouch Screen test\n"); rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En pISR_ADC = (int)AdcTsAuto; rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear rINTSUBMSK=~(BIT_SUB_TC); Uart_Printf("\nPress any key to quit!\n"); Uart_Printf("\nStylus Down, please...... \n"); Uart_Getch(); rINTSUBMSK|=BIT_SUB_TC; rINTMSK|=BIT_ADC; Uart_Printf("Touch Screen Test is Finished!!!\n"); } void __irq AdcTsAuto(void) { U32 saveAdcdly; if(rADCDAT0&0x8000) { //Uart_Printf("\nStylus Up!!\n"); rADCTSC&=0xff; // Set stylus down interrupt bit } //else //Uart_Printf("\nStylus Down!!\n"); rADCTSC=(1<<3)|(1<<2); //Pull-up disable, Seq. X,Y postion measure. saveAdcdly=rADCDLY; rADCDLY=40000; //Normal conversion mode delay about (1/50M)*40000=0.8ms rADCCON|=0x1; //start ADC while(rADCCON & 0x1); //check if Enable_start is low while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!! while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bit xdata=(rADCDAT0&0x3ff); ydata=(rADCDAT1&0x3ff); //check Stylus Up Interrupt. rSUBSRCPND|=BIT_SUB_TC; ClearPending(BIT_ADC); rINTSUBMSK=~(BIT_SUB_TC); rINTMSK=~(BIT_ADC); rADCTSC =0xd3; //Waiting for interrupt rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal. while(1) //to check Pen-up state { if(rSUBSRCPND & (BIT_SUB_TC)) //check if ADC is finished with interrupt bit { //Uart_Printf("Stylus Up Interrupt~!\n"); break; //if Stylus is up(1) state } } Uart_Printf("count=%03d XP=%04d, YP=%04d\n", count++, xdata, ydata); //X-position Conversion data rADCDLY=saveAdcdly; rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal. rSUBSRCPND|=BIT_SUB_TC; rINTSUBMSK=~(BIT_SUB_TC); // Unmask sub interrupt (TC) ClearPending(BIT_ADC); } */ void Test_Touchpanel(void)//触摸屏测试 { rADCDLY=50000; //设定ADC开始延迟寄存器的值,使得延迟为:(1/3.6864M)*50000=13.56ms rADCCON=(1<<14)|(9<<6); //rADCCON[14]=1,AD转换预分频器有效,rADCCON[13:6]=9,ADC频率=PCLK/10=5M Uart_Printf("\n触摸屏测试开始,请点击触摸屏!\n"); rADCTSC=(1<<7)|(1<<6)|(0<<5)|(1<<4)|(3); //??? pISR_ADC = (int)AdcTsAuto;//中断函数注册 rINTMSK=~BIT_ADC;//使能ADC中断 rINTSUBMSK=~(BIT_SUB_TC);//使能触摸点击子中断 Uart_Getch();//等待键盘输入,有输入退出等待,测试结束 Uart_SendString("\n触摸屏测试完毕!!!\n"); rINTSUBMSK|=BIT_SUB_TC;//禁止触摸点击子中断 rINTMSK|=BIT_ADC;//禁止ADC中断 }
//***************[ Change_IntPriorities ]************************* void Change_IntPriorities(void) { int key; // rINTMOD = 0x0; // rINTMSK = ~(BIT_ALLMSK); // rINTSUBMSK = ~(BIT_SUB_ALLMSK); Uart_Printf("[ Interrupt Controller Priority Policy ]\n\n"); Uart_Printf("1. Reverse Priority 2. Priority Rotate Off 3. Default\n\n"); Uart_Printf("Select : "); key = Uart_Getch(); Uart_Printf("%c\n\n",key); switch(key) { case '1': Uart_Printf("Reverse priority is selected.\n"); rPRIORITY = 0x7f; //Arbiter 0 to 6 group priority rotate enable rPRIORITY = (0x3fff<<7); //Arbiter 0 and 5 are group priority order set.(REQ 4-1-2-3) //Arbiter 1 to 4 and 6 are group priority order set.(REQ 0-4-1-2-3-5) break; case '2': Uart_Printf("Priority rotate off is selected.\n"); rPRIORITY = 0x0; //Arbiter 0 to 6 group priority does not rotate break; case '3': Uart_Printf("Default mode is selected.\n"); rPRIORITY = 0x7f; //Arbiter 0 to 6 group priority rotate enable break; default: break; } // rINTMSK = BIT_ALLMSK; // rINTSUBMSK = BIT_SUB_ALLMSK; }
/******************** PWM Timer Normal Operation Test ********************/ void Test_TimerNormal(void) { int save_B,save_G,save_H,save_PB,save_PG,save_PH,save_MI; char key;//, toggle; /* Save Current Register related to PWM Port */ //Save Current GPB, G, H Configure Registers save_B = rGPBCON; save_G = rGPGCON; save_H = rGPHCON; //Save Pull-Up Disable Register save_PB = rGPBUP; save_PG = rGPGUP; save_PH = rGPHUP; //Save Miscellaneous Control Register save_MI = rMISCCR; /* Setting Port related to PWM */ // PortB rGPBUP = rGPBUP & ~(0x1f) | 0x1f; //GPB[4:0] Pull Up rGPBCON = rGPBCON & ~(0x3ff) | 0x2 | 0x2 << 2 | 0x2 << 4 | 0x2 << 6 | 0x2 << 8; //TCKL0, TOUT[3:0] // PortG rGPGUP = rGPGUP & ~(0x800) | 0x800; //GPG11 Pull Up rGPGCON = rGPGCON & ~(0xc00000) | 0xc00000; //TCLK1 // PortH rGPHUP = rGPHUP & ~(0x200) | 0x200; //GPH9 Pull Up rGPHCON = rGPHCON & ~(0x3<<18) | (0x2<<18); //CLKOUT0 // Miscellaneous Control Register rMISCCR = rMISCCR & ~(0xf0) | 0x40; //Select PCLK with CLKOUT0 Uart_Printf("[Select Timer Test Setting]\n"); Uart_Printf("a. Prescaler 1, 0: 0, Dead zone Disable, MUX 4~0: 1/2, (H/L)duty 50 \nb. Prescaler 1, 0: 8, Dead zone Enable, MUX 4~0: 1/16, (H/L)duty 50 \nc. (H/L)duty 0, TCNT =< TCMP, Inverter On\nd. TCLK0, TCLK1 Input Divider Test\n"); Uart_Printf("Select [a ~ d]: \n"); key = Uart_Getch(); Uart_Printf("%c\n\n",key); /* Timer Configuration Reg.0, 1(TCFG0, TCFG1) Setting */ switch(key) { case 'a': rTCFG0 = rTCFG0 & ~(0xffffff) | 0x00000; //Dead zone=0, Prescaler1=0, Prescaler0=0 rTCFG1 = 0x0; //All Interrupt, MUX 4 ~ 0: 1/2 Uart_Printf("Prescaler1=0, Prescaler0=0, Dead Zone Disable, MUX 4 ~ 0: 1/2, Duty 50% \n"); break; case 'b': rTCFG0 = rTCFG0 & ~(0xffffff) | (0xc8)<<16 | (0x7)<<8 | (0x7); //Dead zone=0, Prescaler1=7, Prescaler0=7 rTCFG1 = rTCFG1 & ~(0xffffff) | (0x3)<<16 | (0x3)<<12 | (0x3)<<8 | (0x3)<<4 | (0x3); //All Interrupt, MUX 4 ~ 0: 1/16 Uart_Printf("Prescaler1=8, Prescaler0=8, Dead zone=200 Enable, MUX 4 ~ 0: 1/16, duty = 50%, Consider Dead zone effect\n"); break; case 'c': rTCFG0 = rTCFG0 & 0x0; //Dead zone=0, Prescaler1=0, Prescaler0=0 rTCFG1 = rTCFG1 & 0x0; //All Interrupt, MUX 4 ~ 0: 1/2 Uart_Printf("(H/L)Duty 0, TCNT =< TCMP, Inverter On\n"); break; case 'd': rTCFG0 = rTCFG0 & ~(0xffffff) | 0x00000; //Dead zone=0, Prescaler1=0, Prescaler0=0 rTCFG1 = rTCFG1 & ~(0xffffff) | 0x4 | 0x4 << 4 | 0x4 << 8 | 0x4 << 12 | 0x4 << 16; //All Interrupt, MUX 4 ~ 0: 1/2 Uart_Printf("TCLK0, TCLK1 Input Divider Test(if TCLK0, TCLK1=25.4MHZ)\n"); break; default: rGPBCON = save_B; rGPGCON = save_G; rGPHCON = save_H; rGPBUP = save_PB; rGPGUP = save_PG; rGPHUP = save_PH; rMISCCR = save_MI; return; } //(1/(PCLK/(Prescaler+1)/divider) * count(Max 65535) = Timer clock (Frequency) //(1/(50.8MHz/1/2)) * 2000 = 0.0787 msec ( 12.7 KHz) //(1/(50.8MHz/1/2)) * 4000 = 0.1575 msec ( 6.35 KHz) //(1/(50.8MHz/1/2)) * 5000 = 0.1969 msec ( 5.080 KHz) //(1/(50.8MHz/1/2)) * 10000 = 0.3937 msec ( 2.54 KHz) //(1/(50.8MHz/8/16)) * 2000 = 5.039 msec ( 198.45 Hz) //(1/(50.8MHz/8/16)) * 4000 = 10.079 msec ( 99.216 KHz) //(1/(50.8MHz/8/16)) * 5000 = 12.598 msec ( 79.38 Hz) //(1/(50.8MHz/8/16)) * 10000 = 25.197 msec ( 39.687 Hz) rTCNTB0 = 2000; rTCNTB1 = 4000; rTCNTB2 = 5000; rTCNTB3 = 10000; rTCMPB0 = 2000 - 1000; //(H/L)duty 50% rTCMPB1 = 4000 - 2000; rTCMPB2 = 5000 - 2500; rTCMPB3 = 10000 - 5000; rTCON = rTCON & ~(0xffffff) | 0x1<<1 | 0x1<<9 | 0x1<<13 | 0x1<<17 | 0x1<<21 ; //Manual update switch(key) { case 'a': rTCON = rTCON & ~(0xffffff) | 0x599909; //Auto reload, Inverter off, No operation, Start, Dead zone Disable break; case 'b': rTCNTB0 = rTCNTB0 & ~(0xffff) | 500; //(1/(50.8MHz/8/16)) * 500 = 1.273 msec ( 793.8 Hz) rTCMPB0 = 500 - 250; //(H/L)duty 50% rTCON = rTCON & ~(0xffffff) | 0x6aaa0a; //Auto reload, Inverter off, Manual update, Stop, Dead zone Disable rTCON = rTCON & ~(0xffffff) | 0x599909| (0x1) << 4; //Auto reload, Inverter off, No operation, Start, Dead zone Enable break; case 'c': rTCNTB0 = rTCNTB0 & ~(0xffff) | 1000; rTCMPB0 = 1000; rTCNTB1 = rTCNTB1 & ~(0xffff) | 1000; rTCMPB1 = 1000; rTCNTB2 = rTCNTB2 & ~(0xffff) | 1000; rTCMPB2 = 1000; rTCNTB3 = rTCNTB3 & ~(0xffff) | 1000; rTCMPB3 = 1000; rTCON = rTCON & ~(0xffffff) | 0x1 << 1 | 0x1 << 9 | 0x1 << 13 | 0x1 << 17 | 0x1 << 21; //Auto reload disable, Inverter off, Manual update, Stop, Dead zone Disable rTCON = rTCON & ~(0xffffff) | 0x1 | 0x1 << 2 | 0x1 <<8 | 0x1 << 10| 0x1 << 12 | 0x1 << 14 | 0x1 << 16 | 0x1 << 18| 0x1 << 20; //Auto reload enable, Inverter On, No Operation, Start, Dead zone Disable Uart_Printf("rTCNTB0 = Dec:%d, rTCNTO0 = Dec:%d, rTCMPB0 = Dec:%d\n",rTCNTB0, rTCNTO0, rTCMPB0); break; case 'd': rTCON = rTCON & ~(0xffffff) | 0x599909; //Auto reload, Inverter off, No operation, Start, Dead zone Disable break; default: break; } if(key=='a' && (PCLK==(203200000/4))) { Uart_Printf("PCLK 50.8MHz, Timer TOUT0 : 0.0787 msec ( 12.70 KHz)\n"); Uart_Printf("PCLK 50.8MHz, Timer TOUT1 : 0.1575 msec ( 6.35 KHz)\n"); Uart_Printf("PCLK 50.8MHz, Timer TOUT2 : 0.1969 msec ( 5.08 KHz)\n"); Uart_Printf("PCLK 50.8MHz, Timer TOUT3 : 0.3937 msec ( 2.54 KHz)\n"); } else if(key=='b' && (PCLK==(203200000/4))) { Uart_Printf("PCLK 50.8MHz, Timer TOUT0 : 1.273 msec (793.8 KHz)\n"); Uart_Printf("PCLK 50.8MHz, Timer TOUT1 : /TOUT0 \n"); Uart_Printf("PCLK 50.8MHz, Timer TOUT2 : 13.6094 msec ( 73.478 Hz)\n"); Uart_Printf("PCLK 50.8MHz, Timer TOUT3 : 27.2189 msec ( 36.739 Hz)\n"); } else if(key=='d' && (PCLK==(203200000/4))) { Uart_Printf("then Timer TOUT 0 : 0.0787 msec ( 12.70 KHz)\n"); Uart_Printf("then Timer TOUT 1 : 0.1575 msec ( 6.35 KHz)\n"); Uart_Printf("then Timer TOUT 2 : 0.1969 msec ( 5.08 KHz)\n"); Uart_Printf("then Timer TOUT 3 : 0.3937 msec ( 2.54 KHz)\n"); } Uart_Printf("\nProbe PCLK.\n"); Uart_Printf("Probe TOUT0.\n"); Uart_Printf("Probe TOUT1.\n"); Uart_Printf("Probe TOUT2.\n"); Uart_Printf("Probe TOUT3.\n"); Uart_Printf("\nCheck PWM (Pulse Width Modulation) Output\n"); Uart_Printf("Press any key.\n"); Uart_Getch(); /* Stop Timer0, 1, 2, 3, 4 */ rTCON = 0x0; //One-shot, Inverter off, No operation, Dead zone disable, Stop Timer rGPBCON = save_B; rGPGCON = save_G; rGPHCON = save_H; rGPBUP = save_PB; rGPGUP = save_PG; rGPHUP = save_PH; rMISCCR = save_MI; }
/******************** Timer DMA Request Test ********************/ void Test_TimerDma(void) { int i; rTCFG0 = rTCFG0 & ~(0xffffff) | 0x0; //Dead zone=0, Prescaler0,1 = 0 rTCFG1 = rTCFG1 & ~(0xffffff) | 0x3 << 0 | 0x1 << 20; //Mux0 1/16, DMA Request Channel 0 rTCNTB0 = 65500; rTCMPB0 = 30000; rTCNTB1 = 65500; rTCMPB1 = 30000; rTCNTB2 = 65500; rTCMPB2 = 30000; rTCNTB3 = 65500; rTCMPB3 = 30000; rTCNTB4 = 65500; rTCON = rTCON & ~(0xffffff) | 0x1<<1 | 0x1<<9 | 0x1<<13 | 0x1<<17 | 0x1<<21 ; //Manual update Uart_Printf("\nTimer 0 DMA Request Test\n\n"); rTCON = 0x1 | 0x1<<3; //Auto reload, Start for(i=0 ; i < 4 ; i++) DMA_M2M(0,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single rTCON = 0x0; //Timer Stop Uart_Printf("\nTimer 1 DMA Request Test\n\n"); rTCFG1 = rTCFG1 & ~(0xffffff) | 0x3 << 4 | 0x2 << 20; //Mux0 1/16, DMA Request Channel 2 rTCON = 0x1<<8 | 0x1<<11; //Auto reload, Start for(i=0 ; i < 4 ; i++) DMA_M2M(2,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single rTCON = 0x0; Uart_Printf("\nTimer 2 DMA Request Test\n\n"); rTCFG1 = rTCFG1 & ~(0xffffff) | 0x3 << 8 | 0x3 << 20; //Mux0 1/16, DMA Request Channel 3 rTCON = 0x1<<12 | 0x1<<15; //Auto reload, Start for(i=0 ; i < 4 ; i++) DMA_M2M(3,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single rTCON = 0x0; Uart_Printf("\nTimer 3 DMA Request Test\n\n"); rTCFG1 = rTCFG1 & ~(0xffffff) | 0x3 << 12 | 0x4 << 20; //Mux0 1/16, DMA Request Channel 0 rTCON = 0x1<<16 | 0x1<<19; //Auto reload, Start for(i=0 ; i < 4 ; i++) DMA_M2M(0,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single rTCON = 0x0; Uart_Printf("\nTimer 4 DMA Request Test\n\n"); rTCFG1 = rTCFG1 & ~(0xffffff) | 0x3 << 16 | 0x5 << 20; //Mux0 1/16, DMA Request Channel 2 rTCON = 0x1<<20 | 0x1<<22; //Auto reload, Start for(i=0 ; i < 4 ; i++) DMA_M2M(2,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single rTCON = 0x0; Uart_Printf("Press any key\n"); while(!Uart_Getch()); //Key board press check }
void Test_TimerInt(void) { variable0 = 0;variable1 = 0;variable2 = 0;variable3 = 0;variable4 = 0; /* Timer0,1,2,3,4 Interrupt service is available */ rINTMSK = ~(BIT_TIMER4 | BIT_TIMER3 | BIT_TIMER2 | BIT_TIMER1 | BIT_TIMER0); // Uart_Printf("rINTMSK (After) = 0x%8x <= Timer4,3,2,1 Bit[14:10]\n",rINTMSK); /* Timer0,1,2,3,4 Interrupt Service Routine Entry Point Determine */ pISR_TIMER0 = (int)Timer0Done; pISR_TIMER1 = (int)Timer1Done; pISR_TIMER2 = (int)Timer2Done; pISR_TIMER3 = (int)Timer3Done; pISR_TIMER4 = (int)Timer4Done; Uart_Printf("\n[Timer 0,1,2,3,4 Interrupt Test]\n\n"); rTCFG0 = rTCFG0 & ~(0xffffff) | 0xff | 0xff<<8; //Dead zone=0,Prescaler1=255(0x0f),Prescaler0=255(0x0f) rTCFG1 =rTCFG1 & ~(0xffffff) | 0x001233; //All interrupt,Mux4=1/2,Mux3=1/4,Mux2=1/8,Mux1=1/16,Mux0=1/16 rTCNTB0 = 30000; rTCNTB1 = 30000; rTCNTB2 = 30000; rTCNTB3 = 30000; rTCNTB4 = 30000; rTCMPB0 = 15000; rTCMPB1 = 15000; rTCMPB2 = 15000; rTCMPB3 = 15000; rTCON = rTCON & ~(0xffffff) | 0x1<<1 | 0x1<<9 | 0x1<<13 | 0x1<<17 | 0x1<<21 ; //Manual update rTCON = rTCON & ~(0xffffff) | 0x1 | 0x1<<3 ; //Timer 0 Start, Auto-reload rTCON = rTCON | 0x1<<8 | 0x1<<11 ; //Timer 1 Start, Auto-reload rTCON = rTCON | 0x1<<12 | 0x1<<15 ; //Timer 2 Start, Auto-reload rTCON = rTCON | 0x1<<16 | 0x1<<19 ; //Timer 3 Start, Auto-reload rTCON = rTCON | 0x1<<20 | 0x1<<22 ; //Timer 4 Start, Auto-reload //Auto reload,Inverter off,No operation,Dead zone disable,Start while(1) { if(variable4 == 8) break; } //Delay(1); //To compensate timer error(<1 tick period) rTCON = 0x0; //Stop Timers if(variable4==8 && variable3==4 && variable2==2 && variable1==1 && variable0==1) { Uart_Printf("Timer 0,1,2,3,4 Auto-reload Interrupt Test => OK!\n"); } else { Uart_Printf("Timer 0,1,2,3,4 Auto-reload Interrupt Test => Fail............\n"); } Uart_Printf("Timer0: %d (=1)\nTimer1: %d (=1)\nTimer2: %d (=2)\nTimer3: %d (=4)\nTimer4: %d (=8)\n", variable0,variable1,variable2,variable3,variable4); /* OneShot Test */ variable0 = 0;variable1 = 0;variable2 = 0;variable3 = 0;variable4 = 0; rTCON = rTCON & ~(0xffffff) | 0x6aaa0a; //Auto reload, Inverter off, Manual update, Dead zone disable, Stop rTCON = rTCON & ~(0xffffff) | 0x1 |(0x1)<<8| (0x1)<<12 | (0x1)<<16 | (0x1)<<20 ; //T0,1,2,3,4= One-shot,Inverter off,No operation,Dead zone disable,Start while(variable0 == 0); Delay(1); //To compensate timer error(<1 tick period) rTCON = 0x0; //One-shot, Inverter off, No operation, Dead zone disable, Stop if(variable4==1 && variable3==1 && variable2==1 && variable1==1 && variable0==1) { Uart_Printf("Timer 0,1,2,3,4 One-shot Interrupt Test => OK!\n"); } else { Uart_Printf("Timer 0,1,2,3,4 One-shot Interrupt Test => Fail............\n"); } Uart_Printf("Timer0: %d (=1)\nTimer1: %d (=1)\nTimer2: %d (=1)\nTimer3: %d (=1)\nTimer4: %d (=1)\n", variable0,variable1,variable2,variable3,variable4); /* Timer0,1,2,3,4 Interrupt Service is masked */ rINTMSK |= (BIT_TIMER4 | BIT_TIMER3 | BIT_TIMER2 | BIT_TIMER1 | BIT_TIMER0); Uart_Printf("Press any key\n"); while(!Uart_Getch()); //Key board press check }
// SMDK2410 EINT S/W // EINT0/2/11/19 void Test_Eint(void) { int i; int extintMode; Uart_Printf("[External Interrupt Test through PF0/2/11/19]\n"); Uart_Printf("1.L-LEVEL 2.H-LEVEL 3.F-EDGE 4.R-EDGE 5.B-EDGE\n"); Uart_Printf("Select the external interrupt type.\n"); extintMode=Uart_Getch(); //extintMode='3'; rGPFCON = (rGPFCON & 0xffcc)|(1<<5)|(1<<1); //PF0/2 = EINT0/2 rGPGCON = (rGPGCON & 0xff3fff3f)|(1<<23)|(1<<7); //PG3/11 = EINT11/19 switch(extintMode) { case '1': rEXTINT0 = (rEXTINT0 & ~((7<<8) | (0x7<<0))) | 0x0<<8 | 0x0<<0; //EINT0/2=low level triggered rEXTINT1 = (rEXTINT1 & ~(7<<12)) | 0x0<<12; //EINT11=low level triggered rEXTINT2 = (rEXTINT2 & ~(7<<12)) | 0x0<<12; //EINT19=low level triggered break; case '2': rEXTINT0 = (rEXTINT0 & ~((7<<8) | (0x7<<0))) | 0x1<<8 | 0x1<<0; //EINT0/2=high level triggered rEXTINT1 = (rEXTINT1 & ~(7<<12)) | 0x1<<12; //EINT11=high level triggered rEXTINT2 = (rEXTINT2 & ~(7<<12)) | 0x1<<12; //EINT19=high level triggered break; case '3': rEXTINT0 = (rEXTINT0 & ~((7<<8) | (0x7<<0))) | 0x2<<8 | 0x2<<0; //EINT0/2=falling edge triggered rEXTINT1 = (rEXTINT1 & ~(7<<12)) | 0x2<<12; //EINT11=falling edge triggered rEXTINT2 = (rEXTINT2 & ~(7<<12)) | 0x2<<12; //EINT19=falling edge triggered break; case '4': rEXTINT0 = (rEXTINT0 & ~((7<<8) | (0x7<<0))) | 0x4<<8 | 0x4<<0; //EINT0/2=rising edge triggered rEXTINT1 = (rEXTINT1 & ~(7<<12)) | 0x4<<12; //EINT11=rising edge triggered rEXTINT2 = (rEXTINT2 & ~(7<<12)) | 0x4<<12; //EINT19=rising edge triggered break; case '5': rEXTINT0 = (rEXTINT0 & ~((7<<8) | (0x7<<0))) | 0x6<<8 | 0x6<<0; //EINT0/2=both edge triggered rEXTINT1 = (rEXTINT1 & ~(7<<12)) | 0x6<<12; //EINT11=both edge triggered rEXTINT2 = (rEXTINT2 & ~(7<<12)) | 0x6<<12; //EINT19=both edge triggered break; default: break; } Uart_Printf("Press the EINT0/2/11/19 buttons or Press any key to exit.\n"); pISR_EINT0=(U32)Eint0Int; pISR_EINT2=(U32)Eint2Int; pISR_EINT8_23=(U32)Eint11_19; rEINTPEND = 0xffffff; rSRCPND = BIT_EINT0|BIT_EINT2|BIT_EINT8_23; //to clear the previous pending states rINTPND = BIT_EINT0|BIT_EINT2|BIT_EINT8_23; rEINTMASK=~( (1<<11)|(1<<19) ); rINTMSK=~(BIT_EINT0|BIT_EINT2|BIT_EINT8_23); Uart_Getch(); rEINTMASK=0xffffff; rINTMSK=BIT_ALLMSK; }
void PlayMusicTest(void) { int size, i, j, err; WAVEFORMATEX fmt; WAVEHDR hdr[2048]; HWAVEOUT hwo; U8 pause = 0; U8 mute = 0; U32 volume; unsigned char *buf; downloadAddress = _NONCACHE_STARTADDRESS; buf = (unsigned char *)downloadAddress ; for( i = 0; i < 243552; i++ ) buf[i] = WindowsXP_Wav[i] ; downloadFileSize = 243552 ; size = *(U32 *)(downloadAddress+0x28); i = 0; while(size>0) { hdr[i].lpData = (LPSTR)(downloadAddress+0x2c+i*BUF_SIZE); hdr[i].dwBufferLength = (size>BUF_SIZE)?BUF_SIZE:size; size -= BUF_SIZE; i++; } fmt.wFormatTag = WAVE_FORMAT_PCM; fmt.nChannels = *(U16 *)(downloadAddress+0x16); fmt.nSamplesPerSec = *(U32 *)(downloadAddress+0x18); fmt.nAvgBytesPerSec = *(U32 *)(downloadAddress+0x1c); fmt.nBlockAlign = *(U16 *)(downloadAddress+0x20); fmt.wBitsPerSample = *(U16 *)(downloadAddress+0x22); Uart_Printf("\nSample Rate = %d, Channels = %d, %dBitsPerSample, size = %d\n", fmt.nSamplesPerSec, fmt.nChannels, fmt.wBitsPerSample, *(U32 *)(downloadAddress+0x28)); hwo = 0; err = waveOutOpen(&hwo, 0, &fmt, 0, 0, 0); Uart_Printf("\nerr = %x\n", err); for(j=0;j<i;j++) waveOutWrite(0, &hdr[j], 0); Uart_Printf("Now playing the file\n"); Uart_Printf("Press 'ESC' to quit, '+' to inc volume, '-' to dec volume, 'm' to mute, 'p' to pause\n"); waveOutGetVolume(0, &volume); while(1) { U8 key = Uart_Getch(); if( key == ESC_KEY ) break; if(key=='p') { pause ^= 1; if(pause&1) waveOutPause(0); else waveOutRestart(0); } if(key=='m') { mute ^= 1; if(mute&1) waveOutSetVolume(0, 0); else waveOutSetVolume(0, volume); } if((key=='+')&&(volume<=64535)) { volume += 1000; waveOutSetVolume(0, volume); } if((key=='-')&&(volume>=1000)) { volume -= 1000; waveOutSetVolume(0, volume); } } waveOutClose(0); }
void RecordTest(void) { int size, i, j, err; WAVEFORMATEX fmt; WAVEHDR hdr[2048]; HWAVEIN hwi = 1; Uart_Printf( "\nThe Frequency of record is 48KHz\n" ); fmt.nSamplesPerSec = 48000; //²ÉÑùƵÂÊΪ48KHz fmt.wBitsPerSample = 16; fmt.wFormatTag = WAVE_FORMAT_PCM; fmt.nChannels = 2; fmt.nBlockAlign = fmt.wBitsPerSample*fmt.nChannels/8; fmt.nAvgBytesPerSec = fmt.nSamplesPerSec*fmt.nBlockAlign; downloadAddress = 0x30800000;//_NONCACHE_STARTADDRESS; downloadFileSize = size = 16*1024*1024; i = 0; while(size>0) { hdr[i].lpData = (LPSTR)(downloadAddress+0x2c+i*BUF_SIZE); hdr[i].dwBufferLength = (size>BUF_SIZE)?BUF_SIZE:size; size -= BUF_SIZE; i++; } *(U16 *)(downloadAddress+0x14) = fmt.wFormatTag; *(U16 *)(downloadAddress+0x16) = fmt.nChannels; *(U32 *)(downloadAddress+0x18) = fmt.nSamplesPerSec; *(U32 *)(downloadAddress+0x1c) = fmt.nAvgBytesPerSec; *(U16 *)(downloadAddress+0x20) = fmt.nBlockAlign; *(U16 *)(downloadAddress+0x22) = fmt.wBitsPerSample; *(U32 *)(downloadAddress+0x28) = downloadFileSize; err = waveInOpen(&hwi, 0, &fmt, 0, 0, 0); Uart_Printf("\nerr = %x\n", err); for(j=0;j<i;j++) if(waveInAddBuffer(hwi, &hdr[j], 0)) Uart_Printf("Add buffer error!"); Uart_Printf("Added %d buffer for record\n", i); Uart_Printf("Press any to Record\n"); Uart_Getch(); Uart_Printf("Now begin recording, Press 'ESC' to quit\n"); waveInStart(hwi); while(1) { U8 key; key = Uart_GetKey(); if( key == ESC_KEY ) break; // Uart_Printf("%x,%x,%x,%x,%x,%x,%x\n", rDISRC2, rDISRCC2, rDIDST2, rDIDSTC2, rDCON2, rDSTAT2, rDMASKTRIG2); // Uart_Printf("%x,%x,%x,%x\n", rIISCON, rIISMOD, rIISPSR, rIISFCON); } waveInClose(hwi); }
void comdownload(void) { ULONG size; UCHAR *buf; USHORT checksum; puts("\nNow download file from uart0...\n"); downloadAddress = _NONCACHE_STARTADDRESS; buf = (UCHAR *)downloadAddress; temp = buf-4; Uart_GetKey(); #ifdef USE_UART_INT pISR_UART0 = (ULONG)Uart0RxInt; //串口接收数据中断 ClearSubPending(BIT_SUB_RXD0); ClearPending(BIT_UART0); EnableSubIrq(BIT_SUB_RXD0); EnableIrq(BIT_UART0); #endif while((ULONG)temp<(ULONG)buf) { #ifdef USE_UART_INT Led_Display(0); Delay(1000); Led_Display(15); Delay(1000); #else *temp++ = Uart_Getch(); #endif } //接收文件长度,4 bytes size = *(ULONG *)(buf-4); downloadFileSize = size-6; #ifdef USE_UART_INT printf("Download File Size = %d\n", size); #endif while(((ULONG)temp-(ULONG)buf)<(size-4)) { #ifdef USE_UART_INT Led_Display(0); Delay(1000); Led_Display(15); Delay(1000); #else *temp++ = Uart_Getch(); #endif } #ifdef USE_UART_INT DisableSubIrq(BIT_SUB_RXD0); DisableIrq(BIT_UART0); #endif #ifndef USE_UART_INT printf("Download File Size = %d\n", size); #endif checksum = 0; for(size=0; size<downloadFileSize; size++) checksum += buf[size]; if(checksum!=(buf[size]|(buf[size+1]<<8))) { puts("Checksum fail!\n"); return; } puts("Are you sure to run? [y/n]\n"); while(1) { UCHAR key = getch(); if(key=='n') return; if(key=='y') break; } call_linux(0, 193, downloadAddress); }
void Test_HoldMode(void) { Uart_Printf("[ Power Saving Mode by Stopping Each Block ]\n"); Uart_Printf("LCD ENVID is turned off.\n"); Lcd_EnvidOnOff(0); Uart_Printf("Check the current cunsumption. Type any key to proceed.\n"); //Except GPIO,UART0 rCLKCON=0x7fff0; Uart_Getch(); Uart_Printf("NFC off.\n"); rCLKCON&=~(1<<4); Uart_Getch(); Uart_Printf("LCD off.\n"); rCLKCON&=~(1<<5); Lcd_EnvidOnOff(0); Uart_Getch(); Uart_Printf("USB host off(DP0/DN0 is suspended).\n"); rCLKCON&=~(1<<6); rMISCCR|=(1<<12); //USB port0 = suspend Uart_Getch(); Uart_Printf("USB device off(DP1/DN1 is also suspended).\n"); rCLKCON&=~(1<<7); rMISCCR|=(1<<13); //USB port1 = suspend Uart_Getch(); Uart_Printf("PWM Timer off.\n"); rCLKCON&=~(1<<8); Uart_Getch(); Uart_Printf("SDI off.\n"); rCLKCON&=~(1<<9); Uart_Getch(); Uart_Printf("UART1 off.\n"); rCLKCON&=~(1<<11); Uart_Getch(); Uart_Printf("UART2 off.\n"); rCLKCON&=~(1<<12); Uart_Getch(); Uart_Printf("RTC_control off.\n"); rCLKCON&=~(1<<14); Uart_Getch(); Uart_Printf("ADC off.\n"); rADCCON|=(1<<2); rCLKCON&=~(1<<15); Uart_Getch(); Uart_Printf("IIC off.\n"); rCLKCON&=~(1<<16); Uart_Getch(); Uart_Printf("IIS off.\n"); rCLKCON&=~(1<<17); Uart_Getch(); Uart_Printf("SPI off.\n"); rCLKCON&=~(1<<18); Uart_Getch(); Uart_Printf("Return to Normal Mode.\n"); rCLKCON=0xffff0; rADCCON&=(1<<2); rMISCCR&=~((1<<12)|(1<<13)); //USB port0,1 = normal Lcd_EnvidOnOff(1); }
int main(void) { main_init(); while(1) { //키보드로부터 데이터를 수신 switch(Uart_Getch(1)) { case 'A': OCR1C=700; count=45; _delay_ms(1000); Uart_Putch(1, 'A'); Uart_Putch(1, count); _delay_ms(1000); sbi(PORTB,0); cbi(PORTB,1);//왼쪽 dc정 sbi(PORTB,3); cbi(PORTB,2);//오른쪽 dc정 break; case 'B': count=count+5; OCR1C=400; _delay_ms(1000); Uart_Putch(1, 'B'); Uart_Putch(1, count); _delay_ms(1000); sbi(PORTB,1); cbi(PORTB,0);// dc 역 sbi(PORTB,2); cbi(PORTB,3); break; case 'C': count=100; OCR1C=count; Uart_Putch(1, 'C'); Uart_Putch(1, count); _delay_ms(1000); cbi(PORTB,1); cbi(PORTB,0);// dc중지 cbi(PORTB,2); cbi(PORTB,3); break; } } return 0; }