我正在使用IC,DS1620来读取单行上的1位串行数据.我需要使用ARM微控制器(LPC2378)的一个端口读取这些数据.ARM端口为32位.如何将此值转换为1位变量?
编辑:换句话说,我需要直接引用端口引脚.
avr-gcc程序中的main()函数将寄存器状态保存在堆栈中,但是当运行时调用它时,我理解在微控制器上没有任何东西可以返回.这是浪费RAM吗?如何防止这种状态储蓄?
第一个传感器是我的lm335z输出.
int firstSensor = 0;
int secondSensor = 0;
int thirdSensor = 0;
int inByte = 0;
void setup()
{
Serial.begin(9600);
establishContact(); // send a byte to establish contact until receiver responds
}
void loop()
{
if (Serial.available() > 0) {
inByte = Serial.read();
firstSensor = analogRead(0);
delay(10);
secondSensor = analogRead(1);
thirdSensor = analogRead(2);
Serial.print(firstSensor, DEC);
Serial.print(",");
Serial.print(secondSensor, DEC);
Serial.print(",");
Serial.println(thirdSensor, DEC);
}
}
void establishContact() {
}
Run Code Online (Sandbox Code Playgroud) 请列出一些软件和链接,它们可以帮助我构建Atmel 89C2051微控制器的固件.谢谢.
我在C中编写了PIC16F1947的代码.我使用以下代码:
代码的一部分处理来自PC的数据.我从PC发送的特定数据包是325字节.此数据包如下所示:
data: 0, 64, 1, 0, 255, 255, 255, ... (all 255) ..., 255, 1
index: 0 1 2 3 4 5 6 323 324
Run Code Online (Sandbox Code Playgroud)
数据包的内容显示为8位十进制值(8位无符号整数).微商店将其存储在以下阵列中unsigned char:
unsigned char _command_mgr_buff[330];
Run Code Online (Sandbox Code Playgroud)
unsigned char 是PIC16F的8位无符号整数.
分组的最后一个字节,即索引324,是分组的校验和.它是索引1到323的总和,包括1和323.计算此校验和的PC代码(在C#中)如下:
allCertPages[324] = 0;
for (int i = 1; i <= 323; i++)
{
allCertPages[324] += allCertPages[i];
}
Run Code Online (Sandbox Code Playgroud)
allCertPages是一个byte[].
微必须验证校验和确实是从PC传递的值.这是我为PIC16F编写的验证码,包括一些调试信息:
param0 = _command_mgr_buff[324]; // param0 is unsigned int, 16 bit
param1 = _command_mgr_buff[324]; // param1 is …Run Code Online (Sandbox Code Playgroud) 我正在使用Winstar Display LCD(WH2004A-YYK-CP)和STM32处理器,代码用C语言编写.我需要以4位模式运行它.我运行它并写下我想要的东西.
如您所知,4位模式将8位数据发送为2位4位.问题是,当我在2个半字节之间重置时,它会输出奇怪的字符,无论我重置多少,它都无法正常工作.我提出的唯一解决方案是多次重置它.
为了弄清楚发生了什么,我在2个半字节(每个4位)之间增加了2秒延迟,并打印了一个长句.因此每当我重置它,处理器等待发送第二个半字节.
我正在重置它,它打印一些奇怪的东西,在第二次重置后它什么都没打印,在第三次重置后它再次正确打印.第四次重置它再次打印出一些奇怪的东西,第五次打印没有任何东西,第六次再次正确打印......并继续这样下去.因此,我现在确定问题是这些划分的字节.
类似的代码在8位模式下工作得非常好.
我要问的是:我怎么能确定"当我重置STM32处理器时,LCD没有等待在前一个会话中发送第一个半字节的某些数据的第二个半字节." 使用C代码?
更新:
我也在这里发送我的代码:http://pastebin.com/kHQQEqjx
LCD命令也在这里:http://imgur.com/mfDlj
我开发了一个使用MindTree蓝牙SDK的嵌入式应用程序.
我在头文件中有以下内容:
typedef struct {
UCHAR outputDir;
UCHAR reset;
UCHAR nack;
UCHAR startCondition;
UCHAR stopCondition;
UCHAR busy;
} USCI_ConfigurationFlags;
static USCI_ConfigurationFlags usciConfigFlags = { UCTR, UCSWRST, UCNACKIFG, UCTXSTT, UCTXSTP, UCBBUSY };
Run Code Online (Sandbox Code Playgroud)
后来在两个.c文件中我包含了上面的标题,并且有时在一个中断内的不同场合使用usciConfigFlags.
这合法吗?
我试图在SDK中调用BT_bluetooth_on方法之后,理解为什么(以及它是否与问题相关)结构的值在运行时更改.
谢谢,亚当.
我知道printf和sprintf之间的基本功能差异.但是,我想知道它们之间的一些时间/延迟相关的差异.显然,我想在一个自定义构建的RTOS的任务中使用它.你怎么看 ?我想知道它将如何影响系统的性能.(如果有的话).通常,我不使用打印功能,因为大量的延迟,但我必须在这里强制使用它.
仅供参考,使用RS232在终端窗口上显示输出.
谢谢.
在处理微控制器时,有一些本质上是全局的 - 我正在考虑外围设备,如串行端口或其他接口.还有外围设备不仅是全局的,而且只有一个(并且永远不会有更多) - 如外围控制核心时钟或中断控制器.这些外设确实具有某种全局状态(例如 - 核心时钟被设置为某种东西)并且反向计算这些值是低效的.
如果我希望我的程序很好地面向对象,我很难决定如何处理这些对象...全局变量并不好,这很明显,但我只是不知道(不够经验)我是否应该试图"隐藏"这些东西是全局的事实......例如"cin"或"stdout"也是全局的(让我们忽略这样一个事实:在多线程应用程序中这些通常是特定于线程的)并且没有人隐藏着......让我们坚持使用时钟发生器外设 - 只有一个,所以我可以使用单例反模式(;或者让类静态或者让单个对象全局化(这就是我通常所做的) ,因为这个对象存储了当前时钟设置,所以很多其他东西都需要这个值 - 需要设置RTOS使用的系统定时器,需要为其他外设设置时钟(UART波特率,SPI比特率......) ,需要为外部存储器设置正确的时钟或配置存储器等待状态.这就是我认为的原因 在main()中创建一个对象并将其传递到任何地方会有点麻烦......
我可以编写方法,以便所有"全局"信息都来自外设寄存器(例如核心频率可以从当前的PLL设置反向计算),但这似乎也是一个错误的想法,更不用说创建对象了对于时钟发生器外围设备到处都会看起
当前的时钟设置可以存储在类的静态成员中,但是从这里开始,只有一小步朝向完全静态的类(因为"this"指针对于没有状态的类来说是无用的)...
通常在非面向对象程序中找到的解决方案最接近完全静态类 - 只有对全局变量进行操作的函数.
任何人都有一个很好的想法如何很好地处理这种情况或这个问题是否值得花时间?也许我应该只使用一个全局对象并完成它?(;
可能是错误的地方问这个,但我需要帮助弄清楚真正的问题是什么...
基本上,我正在编程一个微控制器来进行USB音频录制(使用USB Audio Class 2.0 /高速USB).看起来我已经非常接近"正确"了,但是当我将唧唧声录入大胆时,我得到了这个[下面是摘录]:
我想我要问的是为什么我会在记录会话中遇到这些奇怪的中断和跳跃?是因为我没有足够快地读取我的编解码器输入缓冲区,或者帧长度未正确设置?
我如何计算我从Apple的USB音频指南中获得的帧长度(使用44.1kHz采样率和16位速率):
#define AUDIO_POLL_INT 4
#define FRAME_BYTES (BIT_RATE_16 / 8)
#define NUM_CHANNELS STEREO
uint16_t frame_len = 44 (44.1kHz/1000 samples) * NUM_CHANNELS * FRAME_BYTES;
if (!(frame_pos % 9)) frame_len += (1 * NUM_CHANNELS * FRAME_BYTES)
frame_len = (frame_len / 8) * (2 << (AUDIO_POLL_INT-1));
// 10 ms frames
frame_pos = (((frame_pos + 1) / 8) * (2 << (AUDIO_POLL_INT-1))) % 10;
Run Code Online (Sandbox Code Playgroud)
这也是读取编解码器输入的过程:
1)读取编解码器输入; 将样本加载到临时缓冲区(从编解码器外设转移到内存外设)
2)存储器在传输完成时发生外设中断(缓冲区已满;已满足frame_len容量),将缓冲区样本发送到USB.然后,再次读取编解码器输入
希望这不是太混乱...让我知道,我可以添加更多信息/清理事情.谢谢!