Forums

将输出引脚2.5设置为方波。

开始于 伦克鲁帕 2 years ago4回复最新回复2年前74浏览
嗨,我是这里的新手,一直在学习C编码。我目前正在尝试设置一个温度传感器来读取房间的温度,如果温度超过或低于该温度,则将其打开。我还希望蜂鸣器在温度达到特定点时响起。目前,我正在使用名为terminal.exe的程序来显示温度。目前,我正在显示温度,并且能够打开蓝灯。但是,我想将计时器配置为MSP430引脚上的输出,以将蜂鸣器连接起来。我只需要改变电压即可使蜂鸣器响起。因此,我需要一个方波作为输出。但是我不知道如何将计时器设置为引脚2.5的输出,如果您有任何想法请告诉我。这是我目前的代码。


#包括<msp430.h>
#include“ serial_msp.h”
#包括<msp430.h>
#包括<stdint.h>
#包括<stdbool.h>
#include“ HAL_board.h”
#include“ HAL_LCD.h”
诠释
int upndown,count,increment;
无效打印(字符*文本)
{
unsigned int i=0;
while(text [i]!='\ 0')
{
while(!(IFG2&UCA0TXIFG));
UCA0TXBUF = text [i]; // TX收到Char + 1
i ++;
}
}

int main(无效)
{
P2DIR | = 0xa0; // 0x20是蓝灯0xa0是P5和7



WDTCTL = WDTPW + WDTHOLD; //停止WDT

DCOCTL = 0; //选择最低的DCOx和MODx设置
BCSCTL1 = CALBC1_1MHZ; //设定范围
DCOCTL = CALDCO_1MHZ; //设置DCO步进+调制
P1DIR | = BIT4;
P1输出&= ~BIT4;

P1SEL = BIT1 + BIT2; //选择UART作为引脚功能
P1SEL2 = BIT1 + BIT2;

UCA0CTL1 | = UCSWRST; //禁用UART模块进行配置

UCA0CTL0 = 0x00; //无奇偶校验,LSB在先,8位数据,1个停止位,UART,异步
UCA0CTL1 = UCSSEL_2 + UCSWRST; // SMCLK源,保持复位状态
UCA0BR0 = 104; // 9600波特率-假设1 MHz时钟
UCA0BR1 = 0; // 9600波特率-假设1 MHz时钟
UCA0MCTL = 0x02; //第二级调制= 1,过采样关闭
UCA0CTL1 &=〜UCSWRST; //启用UART模块


// ADC配置,V + ref = 3V,V-ref = 0V,Channel = A0
ADC10CTL0 = ADC10SHT_0 + ADC10ON + ADC10IE; // Vref Vr + = 3v,Vr- = VSS,
// S&Htime = 4 X ADCCLK,ADC10开启,ADC中断使能
ADC10CTL1 = ADC10DIV_0 + ADC10SSEL_0 + CONSEQ_0; // INCH = 0000->A0,ADCCLK src = ADC10CLK,
// ADCCLK / 8,单通道单转换
ADC10AE0 = INCH_0; //频道A0

ADC10CTL0 | = ENC + ADC10SC; //开始转换

_BIS_SR(LPM0_bits + GIE); //转到LPM0,启用中断


而(1)
{ADC10CTL0 | = ENC + ADC10SC;
unsigned int adcValue = ADC10MEM;
无符号长电压值;
无符号长F;
无签长发;
voltageValue =(adcValue / 10);
F =((电压值* 9)/ 5);
Fa =(F + 32);
serial_string(“电压为:”);
serial_number(adcValue);
serial_string(“ mV”);
print(“ \ r \ n”);
serial_string(“温度为:”);
serial_number(voltageValue);
serial_string(“摄氏温度”);
print(“ \ r \ n”);
serial_number(Fa);
serial_string(“华氏度”);
print(“ \ r \ n”);
如果(ADC10MEM< 900)
{P1OUT&= ~BIT0;
}
别的
{P1OUT|= BIT0;}

如果(FA>= 69){P2OUT = 0x20; } // * /
否则<69){P2OUT=~0x20;}

}
}




#pragma vector = ADC10_VECTOR
__interrupt void adc10_interrupt(void)

{
__bic_SR_register_on_exit(CPUOFF);

}
[-]
回覆者 mr_bandit2019年4月23日

一种标准方法是将计时器设置为在计时器达到计数时调用ISR函数。 (提示:您可以将计时器设置为递减计数器,因此当count == 0时将调用ISR。通常,您还可以设置最大计数&& upcount &&ISR达到高计数时将被调用。)

知道您的ISR正在运行的一种常见方法是在您进入时将引脚设置为高电平&&在ISR退出之前将其设置为低。这(1)证明已输入ISR,并且(2)在ISR中的时间。 (通常,您应该在ISR中越短越好)。

将计时器计数设置为方波频率所需的值。

(我假设您可以使用显微镜。)

所以:设置一个定时器ISR。在ISR中,拨动您想要的引脚以创建方波。确保只有ISR知道该标志:

timer_ISR

{

静态int标志= 0;

if(标志){set_pin_low;标志= 0; }

否则{set_pin_high;标志= 1; }

}

这有意义吗?希望这可以帮助。

[-]
回覆者 伦克鲁帕2019年4月23日
感谢您的答复,但是目前我的代码知识是非常基础的。我实际上不知道您对ISR的意思。另外,我目前无法使用Oscope。 
[-]
回覆者 mr_bandit2019年4月24日

您已经定义了一个ISR:

#pragma vector = ADC10_VECTOR
__interrupt void adc10_interrupt(void)

{
__bic_SR_register_on_exit(CPUOFF);

}

范围:看rygol DS1054Z  在$ 400 50MHz以下(但我不会告诉您有关可以在网上找到的免费工具,可以将EEPROM的一个字节更改为100MHz的范围。)许多makerspace都有这些电子实验室。牢固,易于使用。

这个范围至少是我10年前以2400美元购买的HP范围的90%(或更多)。我正在考虑将其中之一作为我的“打手范围”。 (然后将$ 50..60的港口运费或任何用于携带硬质泡沫塑料外壳作为手提箱的硬壳包装放在任何地方。使随身携带非常容易。)

//www.rigolna.com/products/digital-oscilloscopes/1000z/

如果您打算将来使用嵌入式系统,则确实需要一个示波器。否则,您将失明。并获得一个包含4个输入的输入-相信我...(我是一名工程师:^)实际上,对于任何复杂的设计,您都希望拥有比示波器提供的更多的输入。

[-]
回覆者 king2019年4月23日

ISR是中断服务程序。

您可以将计时器设置为递减计数,当计时器计数为零时,可以运行一段代码(ISR)以再次设置计数器并切换输出引脚。同时-您的代码可以在等待ISR时做任何您想做的事情。 

您正在阅读此书的计算机具有许多中断例程,这些例程在您每次敲击按键或移动鼠标一点点时都会运行。 


您是否在ER网站上看过此教程?

//www.sunsetgrillect.com/showarticle/182.ph...


或者,您可以在这里加入TI的母公司:

//training.ti.com/getting-started-msp430-5xx...