注册
登录
电子工程世界-论坛
返回首页
EEWORLD首页
频道
EE大学堂
下载中心
Datasheet
专题
单片机
物联网
汽车电子
嵌入式
手机/便携
模拟电子
家用电子
网络通信
电源管理
工业控制
测试测量
半导体设计/制造
安防电子
传感器
医疗电子
peiyangyisheng的个人空间
https://home.eeworld.com.cn/space-uid-485689.html
[收藏]
[复制]
[分享]
[RSS]
空间首页
动态
记录
日志
相册
主题
分享
留言板
个人资料
借用开发板
论坛
淘帖
Collection
查看新帖
最新回复
社区活动
联系管理员
我的空间
帖子
日志
收藏
好友
勋章
积分
安全验证
请完成以下验证码
日志
新手第一次提问,真心调试了几天,有bug解决不了,求助!
已有 1820 次阅读
2013-5-31 20:23
硬件为MSP430G2553,小弟大一,还没有数电和模电基础,硬学试试。
麻烦先看看要求:
1.AD 模块的使用
使用内部ADC 模块持续测量一个外部电压(0—2.5V )
2.定时器模块的使用
用 1 中测量的电压值决定两个 LED 中一个的闪烁频率,电压越高闪烁越快,另一个暂时熄灭
3. 外部中断,按键的使用
测量电压的同时,如果按一次按键,则触发外部中断,使两个LED 交换闪烁和熄灭状态
4 .串行通信模块的使用
在 3 的中断触发后,串口发送一个小写a 到z 的英文字母,如按第一次发送一个 a,按第二次发送一个b。(发送至z后从按开始重新发送)同时用串口接收自己发送的数据。
[code]#include
unsigned int adc_value=0;
unsigned int t=0;
unsigned char re;
float voltage_value;
unsigned char flag=0;
void delay(int i) //延迟函数,用于按键软件防抖
{
while(i--);
}
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
//ADC配置
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE + REF2_5V + REFON + SREF0; // 设置采样保持,打开ADC10,打开ADC中断,设置2.5V的参考电压
ADC10CTL1 = INCH_4 ; // 单通道输入 通道4
ADC10AE0 |= BIT5; // P1.5 输入
P1DIR |= BIT0+BIT6; // 设置P1.0为LED1输出,设置P1.6为LED2输出
ADC10CTL0 |= ENC + ADC10SC; // 开始转换
//定时器配置
TACCTL0 = CCIE; //使Timer_A能触发中断
TACCR0 = 0; //配置Timer_A倒计时初始值
TACTL = TASSEL_2 + MC_2; //选择时钟源为子系统时钟,模式控制设置为计时从0到TACCR0
//按键设置
P1DIR &= ~BIT3; //P1.3设置为输入
P1OUT |= BIT3; //P1.3处于高电位
P1REN |= BIT3; //使P1.3能上拉下拉电阻
P1IES |= BIT3; //P1.3高电位到低电位触发中断
P1IE |= BIT3; //使P1.3能申请中断
P1IFG = 0; //中断标记复位
//UART配置
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
P1SEL = BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 104; // 1MHz 9600
UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
_EINT(); //打开总中断
while(1)
{
}
}
// ADC中断函数
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
while(!(P1IN&BIT3))
_EINT();
adc_value = ADC10MEM; //将转换值存入adc_value中
voltage_value = adc_value/1024.0*2.5;
ADC10CTL0 |= ENC + ADC10SC; //开始下一次转换
}
//定时器中断函数
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
if(flag==0)
{
P1OUT &= ~BIT6;
P1OUT ^= BIT0;
}
else
{
P1OUT &=~BIT0;
P1OUT ^=BIT6;
}
CCR0 += (int)((2.5-voltage_value)/2.5*65535);
}
//按键中断函数
#pragma vector=PORT1_VECTOR
__interrupt void p1()
{
delay(2000);
if(!(P1IN&BIT3))
flag = !flag;
while(!(P1IN&BIT3));
delay(2000);
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=\'a\'+(t++)%26;
_EINT();
P1IFG = 0;
}
//UART接收中断函数
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
re = UCA0RXBUF; // TX -> RXed character
}[/code]现在出现问题有:
1.在未测量电压时,LED会无规律乱闪,当测量电压时(P1.4接GND或VCC),只能以恒定间隔闪动,不满足要求1,找不出原因;
2.貌似测电压要等一段时间才能测准确,P1.4接GND时会出各种各样的电压值;
3.控制灯频率和UART通信的时钟都是
SMCLK,这个会不会有影响?
真心谢谢帮助的人!
本文来自论坛,点击查看完整帖子内容。
收藏
邀请
举报
评论 (
0
个评论)
涂鸦板
您需要登录后才可以评论
登录
|
注册
评论
peiyangyisheng
加为好友
给我留言
打个招呼
发送消息
热门文章
头条资讯
UXR 实测谍报之一 —— 超低本底噪声
无线电爱好有毒:我在自家院里树了160米天线
谷歌要求立即升级Chrome 88最新版:修复重要安全漏洞
未来,我家沙发就是赛场第一排!
汽车功能电子化变革
虽迟但到的 STM32 全国巡回研讨会12月重启!
新增数据手册
1-480711-6
177-710-2-25GS8K7-24LNN
54111-418-17-1400
6010-K-A29-A-43002
P1206H2401BN
M55342K05B1Z09SSU
热搜器件
10127812-030LF
44EN1-6
IFN5198
CRCW0603182RFKTA
2837278
GDP322S24V
推荐下载
如何用好可控硅
射频微电子学_razavi
电磁线绝缘膜的去除
PCB工程:Power_PCB.rar
《嵌入式系统导论:CPS方法》是业界第一本关于CPS的专著
已知环境下基于蚂蚁算法移动机器人路径规划
推荐关注
挑战6万月薪【三】Purple Pi OH开发板带你7天入门OpenHarmony!
两个不同频率晶振靠的近会怎样
《Linux内核深度解析》-- 中断控制器注册逻辑
减速机速比对照表相关内容
ESP-NOW WIFI 收发不稳定问题
Ubuntu20.04取消root账号自动登录的方法,触觉智能RK3568开发板演示