通过IO口的普通输出功能,软件IIC驱动5110 LCD。
在当中走了很多弯路,一是一开始用P2口驱动,后来查了Datasheet才发现P2口要外部上拉电阻,
后来就用了P5口驱动,这是发现LCD_back_lighton();时LCD时P2.7口没有输出高电平,查了Datasheet才知道。还有就是操作IO是,不及明白操某个IO时是如何的,后来问了hanshuyujifen才知道是要这样定义的#define LCD_CS P5_bit.no0。知道这两个问题好,下面的就好办了。
利用以前做的板上的3.3V为5110供电,
LCD5110+RTC
applilet3设置
首先要使能Subsystem clock(FSUB),选择XT1 外部晶振,选择Normal低功耗模式设置支不支持也没所谓。
这个是RTC页面设置
问题不大。
看图:
暂时还没有加上按钮设置初始时间,能过设置得到的初始时间,还需要加按钮设置,这个问题也不大。
代码:
void RTC_ConstPeriodInterruptCallback(void)
{
/* Start user code. Do not edit comment generated here */
UINT time_flag=0;
struct RTCCounterValue time;
RTC_CounterGet(&time);
if(time_flag==0)
{
year_month_day[3]=(UCHAR)((time.Year & 0x0F)+0x30);//看操作形式,这里弄了好久才搞定,总结多看例子
year_month_day[2]=(UCHAR)((time.Year >> 4)+0x30);
year_month_day[6]=(UCHAR)((time.Month & 0x0F)+0x30);
year_month_day[5]=(UCHAR)((time.Month >> 4)+0x30);
year_month_day[9]=(UCHAR)((time.Day & 0x0F)+0x30);
year_month_day[8]=(UCHAR)((time.Day >> 4)+0x30);
}
hour_min_sec[1]=(UCHAR)((time.Hour & 0x0F)+0x30);
hour_min_sec[0]=(UCHAR)((time.Hour >> 4)+0x30);
hour_min_sec[4]=(UCHAR)((time.Min & 0x0F)+0x30);
hour_min_sec[3]=(UCHAR)((time.Min >> 4)+0x30);
hour_min_sec[7]=(UCHAR)((time.Sec & 0x0F)+0x30);
hour_min_sec[6]=(UCHAR)((time.Sec >> 4)+0x30);
if((hour_min_sec[0]=='5')&(hour_min_sec[1]=='9')&(hour_min_sec[6]=='5')&(hour_min_sec[7]=='9'))
{
time_flag=0;
}
if(time_flag==0)
{
LCD_putstr(0,4,year_month_day);
delay_ms(2);
time_flag=1;
}
LCD_putstr(0,5,hour_min_sec);
delay_ms(2);
/* End user code. Do not edit comment generated here */
}
总结:
当中最要是这个函数year_month_day[3]=(UCHAR)((time.Year & 0x0F)+0x30);当中转换是这样子的time.Year & 0x0F,之前没有加上这个,数字在9跳变一次,16跳变一次,后来发现规律,在官网看了一个例子,证实转换的问题,也就能显示了,接着是发出时间跟实际差很远,猜想是时钟选择问题,看了初始化,发现OSMC = _80_CG_SUBINHALT_OFF | _00_CG_RTC_CLK_FSUB;原来的是OSMC = _10_CG_RTC_CLK_FIL;,刚开始时改变这这个,没有显示,想是没全能吧,就看到第一张图,里面的FSUB时钟没有使能,使能后就能显示了。这个例子还比较顺利.....有时间再加上按钮时间设置,这要到后面整体弄....
视频:http://v.youku.com/v_show/id_XNDQ2MDc0MjQw.html
直流电机PWM调速控制系统(只是控制部分,电机驱动部分迟点有时间再加,采用IR2110+IGBT方式)
功能主要包括:
1) 直流电机的正转;
2) 直流电机的反转;
3) 电阻调速;
4) 正转,反转速度显示(LCD5110);
5) 直流电机的停止;
正转,反转,停止按钮(采用KR0,KR1,KR2按钮中断)
电阻调速部分
显示,87r/s
示波器显示
这个占空比是通过改变chanel1和12记算得到的reg = (reg + 1) * ratio / 100U;
总结,
1:I/O口中断时,外部电路要接好才可以,原先只用51开发板上的一个按钮,可使能了3个,没有反应,后来通过取消,不改变其它程序的方法发现这个问题。
按钮中断程序
#pragma vector = INTKR_vect
__interrupt void MD_INTKR(void)
{
/* Start user code. Do not edit comment generated here */
if(P7_bit.no0==0)
{
stop_flag=0;
reversal_flag=0;
forward_flag=1;
}
if(P7_bit.no1==0)
{
stop_flag=0;
forward_flag=0;
reversal_flag=1;
}
if(P7_bit.no2==0)
{
stop_flag=1;
reversal_flag=0;
forward_flag=0;
}
/* End user code. Do not edit comment generated here */
}
2:用定时器输出PWM时,选择4通道时,1,3要为一组,2,4要为一组,不能1,2和3,4各为一组,试试,会发现波形不是想要的波形。一开始时就是这样,怎输出的波形不是想要,后来发现怎样操作,1,3,操作一个另一个也会变化,但是峰值很小,还以为要输出上拉,看了datasheet也不需要,就试着把1,3设为一组,就出来了。后来再看直流电机的驱动,需要2个通道就可以了,但想实现急刹,就是停步时实现两上管导通或者两下管同时导通。可刚这么一试,只是用定时器是不行的,应该要上管各加多一个与门,再用一个信号线实现同时上管导通或者下管导通。
精彩视频后续上传...
说说这RFP的一些细节问题
这里记得按一下Detail,然后再点Complete,
这也没什么的,不知叫不真正的串口下载,想不用板载上的,试过用51板上串口调试,老出错,看了瑞萨电子的文件后,应该很容易实现第三种的,可MD0跟MD1是那管脚...
这就写到这
ucOSII的移值,在http://micrium.com/page/home下载了原板的,ucOSII 还在学习中,借用别人的程序,实现了流水灯,我的任务见下面,写了一个LCD5110的,各个程序编译没错的,可下载就出现错误,不知是不是太大的原因,在找原因....
static void Task0_blink (void *p_arg)
{
(void)p_arg;
while (DEF_TRUE)
{ /* Task body, always written as an infinite loop. */
BSP_LED_On (1);
OSTimeDlyHMSM(0, 0, 0, 100);
BSP_LED_On (2);
OSTimeDlyHMSM(0, 0, 0, 100);
BSP_LED_On (3);
OSTimeDlyHMSM(0, 0, 0, 100);
BSP_LED_On (4);
OSTimeDlyHMSM(0, 0, 0, 100);
BSP_LED_On (5);
OSTimeDlyHMSM(0, 0, 0, 100);
BSP_LED_On (4);
OSTimeDlyHMSM(0, 0, 0, 100);
BSP_LED_On (3);
OSTimeDlyHMSM(0, 0, 0, 100);
BSP_LED_On (2);
OSTimeDlyHMSM(0, 0, 0, 100);
}
}
视频:
主程序:
void main(void)
{
/* Start user code. Do not edit comment generated here */
KEY_Enable();
AD_ComparatorOn();
AD_Start();
// TAU0_Channel0_Start();
LCD_init();
LCD_back_lightoff();
LCD_back_lighton();
LCD_clear();
LCD_putstr(0,0,"Hello EEPW !");
delay_1s(2);
LCD_putstr(0,2,"The speed is:");
delay_1s(2);
TAU0_Channel3_Start();
while (1U)
{
if(forward_flag==1|reversal_flag==1)
{
TAU0_Channel0_Start();
if(forward_flag==1)
{
motor_forward();
}
if(reversal_flag==1)
{
motor_reversal();
}
}
if(stop_flag==1)
{
motor_stop();
}
}
/* End user code. Do not edit comment generated here */
}
/* Start user code for adding. Do not edit comment generated here */
void motor_forward(void)
{
UCHAR motor_speed_forward=0;
motor_speed_forward=(UCHAR)motor_speed;
TAU0_Channel2_ChangeDuty(0);
delay_ms(3);
TAU0_Channel1_ChangeDuty(motor_speed_forward);
// TAU0_Channel0_Start();
}
void motor_reversal(void)
{
UCHAR motor_speed_reversal;
motor_speed_reversal=(UCHAR)motor_speed;
TAU0_Channel1_ChangeDuty(0);
delay_ms(3);
TAU0_Channel2_ChangeDuty(motor_speed_reversal);
// TAU0_Channel0_Start();
}
void motor_stop(void)
{
// TAU0_Channel0_Stop();
// delay_ms(3);
TAU0_Channel1_ChangeDuty(0);
TAU0_Channel2_ChangeDuty(0);
// TAU0_Channel0_Start();
}
AD转换中断函数(AD数据读取<10,>1010是了为了设置对应0%-100%)
#pragma vector = INTAD_vect
__interrupt void MD_INTAD(void)
{
/* Start user code. Do not edit comment generated here */
AD_Read(&AD_Reg_Value);
if(AD_Reg_Value<10)
{
AD_Reg_Value=10;
}
if(AD_Reg_Value>1010)
{
AD_Reg_Value=1010;
}
motor_speed=(AD_Reg_Value-10)/10;
/* End user code. Do not edit comment generated here */
}
显示函数,得宜chanel13内部定时器更新速度显示,定时时间为100ms
#pragma vector = INTTM03_vect
__interrupt void MD_INTTM03(void)
{
/* Start user code. Do not edit comment generated here */
motor_speed_display();
/* End user code. Do not edit comment generated here */
}
/* Start user code for adding. Do not edit comment generated here */
void motor_speed_display(void)
{
speed_display[1]=(UCHAR)((motor_speed%10)+0x30);
speed_display[0]=(UCHAR)((motor_speed/10)+0x30);
if(forward_flag==1|reversal_flag==1)
{
if(forward_flag==1)
{
LCD_putstr(0,3,"Forward ");
}
if(reversal_flag==1)
{
LCD_putstr(0,3,"Reversal ");
}
P7_bit.no7 =~ P7_bit.no7;
}
if(stop_flag==1)
{
LCD_putstr(0,3,"STOP ");
P7_bit.no7 =0;
}
LCD_putstr(0,4,speed_display);
delay_ms(2);
}
/* End user code. Do not edit comment generated here */
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
Let'sdo第3期任务合集被打赏50分 | |
与电子爱好者谈读图四被打赏50分 | |
Let‘s do 第三季 [电子测光表] 基础任务和进阶任务成果展示被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 |