📄 dollycon1.c
字号:
#include <string.h>
#include "..\inc\option.h"
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\def.h"
void Isr_Init(void);
void HaltUndef(void);
void HaltSwi(void);
void HaltPabort(void);
void HaltDabort(void);
void setpwm(int ratio0); //调节定时器输出PWM波的占空比,设定驱动轮速度
void speedup(void); //加速
void speeddown(void); //减速
void init_Ext4567(void);
void __irq Eint4567Isr(void); //__attribute__ ((interrupt("IRQ")));
//****************************************************************
// * S3C44B0X developer's notes *
// ****************************************************************
extern int Speed=50;//ratio0为驱动轮电机,ratio1为捡球电机
void Main(void)
{
int freq1=200,ratio1=50; //定时器0用于输出控制驱动轮的PWM波,定时器1用于输出控制捡球电机的PWM波
rSYSCFG=SYSCFG_8KB;
#if (PLLON==1)
ChangePllValue(PLL_M,PLL_P,PLL_S);
#endif
Isr_Init();
Port_Init();
Uart_Init(0,115200);
init_Ext4567();
Uart_Select(0);
Delay(0); //calibrate Delay()
Delay(5000);
Uart_Printf("\n\n\n 欢迎使用Daniel SW3C44B0 测试程序V1.0 (2004-10-21 )\n\n");
Uart_Printf("\nS3C44B0X Test Program Ver 0.00 rSYSCFG=0x%x MCLK=%d\n\n",rSYSCFG,MCLK);
rPDATE = 0x157; //Beep = 10
//rPCONE = 0x596b; // tout2
rPCONE =0x15aab; //01 0101 1010 1010 1011 :6.7.8位为输出,3 4 5位为定时器输出
rPUPE = 0xff; //上拉电阻不允许接到对应位
rTCON &= 0xfffff0ff; //定时器1输出捡球电机PWM波
rTCFG0 &= 0xffffff0f;
rTCFG1 &= 0xffffff0f; // set Timer 0 1 MUX 1/16
rTCFG1 |= 0x0000003f;
rTCNTB2 = MCLK/(freq1*16); //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low
rTCMPB2 = (rTCNTB2*(100-ratio1))/100; //if set inverter on, when TCNT2<=TCMP2, TOUT is low, TCNT2>TCMP2, TOUT is high
rTCON |= 0x00000200; // manual update
rTCON &= 0xfffff0ff; // clear manal update bit
rTCON |= 0x00000d00; // auto reload, inverter on, start Timer 1
rADCPSR=128; //ADC预置比例因子寄存器
while(1)
{
int dir,i;
//dir=rPDATF&0x1E3; // f口的0,1,5,6,7,8位作为按键扫描口
dir=(rPDATF&0x1E0)>>5; //g口的高四位作为按键扫描口,采用开发板上的按键
//Uart_Printf("while");
Uart_Printf("%d \n",dir);
switch(dir)
{
case 0xE:
rPDATE=(rPDATE&0x13f)|0x80;
setpwm(Speed); Delay(200); break;//前进
case 0xD:
rPDATE=(rPDATE&0x13f)|0x40;
setpwm(Speed); Delay(200); break;//后退
case 0xB:
rPDATE=(rPDATE&0x13f)|0xc0;
setpwm(20); Delay(200); break;//左转
case 0x7:
rPDATE=(rPDATE&0x13f)|0x00;
setpwm(20); Delay(200); break;//右转
case 0xF:
rPDATE=(rPDATE&0x13f)|0x00;
setpwm(0); Delay(200); break;//停止,应该设置占空比为0; rTCON &= ~0x1100;
}
rADCCON=0x1|(0x0<<2);
while(rADCCON&0x1);
while(!(rADCCON&0x40));
for(i=0;i<rADCPSR;i++);
//Uart_Printf("A0=%d\n",rADCDAT);
if(rADCDAT>615) //pe8反号。大于指定值,捡球电机反向,否则,正常转动方向
rPDATE|=0x100;
else
rPDATE&=0x0ff;
}
}
void setpwm(int ratio0)
{
int Ratio0=ratio0,Freq=500; //定时器0输出驱动轮PWM波
//Uart_Printf("in ");
rTCON &= 0xfffffff0; // 清除手动更新位,关Timer0
rTCFG0 &= 0xfffffff0; // 设置定时器0和1的预分频值为0
rTCFG1 &= 0xfffffff0; // 是指定时器MUX0和MUX1输入为1/16
rTCFG1 |= 0x00000003;
rTCNTB0 = MCLK/(Freq*16); //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low
rTCMPB0 = (rTCNTB0*(100-Ratio0))/100; //if set inverter on, when TCNT2<=TCMP2, TOUT is low, TCNT2>TCMP2, TOUT is high
rTCON |= 0x00000002; // 手动更新
rTCON &= 0xfffffff0; // 清除手动更新位
rTCON |= 0x0000000d; // 自动装载,反向器开,打开定时器0
}
void speedup(void)
{
if(Speed+10<90)
{
Speed=Speed+10;
Uart_Printf("%d \n",Speed);
//setpwm(Speed);
}
else
Uart_Printf("upper limit!\n");
}
void speeddown(void)
{
if(Speed-10>20)
{
Speed=Speed-10;
Uart_Printf("%d \n",Speed);
//setpwm(Speed);
}
else
Uart_Printf("lower limit!\n");
}
void init_Ext4567(void)
{
rINTCON=0x5;
rINTMOD=0x0;
rINTMSK=~(BIT_GLOBAL|BIT_EINT4567);
pISR_EINT4567=(int)Eint4567Isr;
rPCONG=0xffff;
rPUPG=0x0; // 上拉电阻使能
rEXTINT=rEXTINT|0x22220000; // EINT4567 下降沿模式
rI_ISPC=BIT_EINT4567; // 清除挂起位
rEXTINPND=0xf; // 清除EXTINTPND寄存器
}
void __irq Eint4567Isr(void)
{
unsigned char i,key5=0,key6=0;
//采样六次
for(i=0;i<6;i++)
{
if(rEXTINPND==1) { Delay(250); key5++;}
else if (rEXTINPND==2) { Delay(250); key6++;}
else { break;}
}
if (key5==6) speedup();
else if(key6==6) speeddown();
rEXTINPND=0xf; //清除EXTINTPND寄存器
rI_ISPC|=BIT_EINT4567; //清除挂起位
}
void Isr_Init(void)
{
U32 i;
pISR_UNDEF=(unsigned)HaltUndef;
pISR_SWI =(unsigned)HaltSwi;
pISR_PABORT=(unsigned)HaltPabort;
pISR_DABORT=(unsigned)HaltDabort;
for(i=_RAM_STARTADDRESS;i<(_RAM_STARTADDRESS+0x20);i+=4)
{
*((volatile unsigned *)i)=0xEA000000+0x1FFE;
}
//rINTCON=0x1; // Vectored Int. IRQ enable,FIQ disable
rINTCON=0x5; // Non-vectored,IRQ enable,FIQ disable
rINTMOD=0x0; // All=IRQ mode
rINTMSK|=BIT_GLOBAL|BIT_EINT4567; // All interrupt is masked.
}
void HaltUndef(void)
{
Uart_Printf("Undefined instruction exception!!!\n");
while(1);
}
void HaltSwi(void)
{
Uart_Printf("SWI exception!!!\n");
while(1);
}
void HaltPabort(void)
{
Uart_Printf("Pabort exception!!!\n");
while(1);
}
void HaltDabort(void)
{
Uart_Printf("Dabort exception!!!\n");
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -