我最近当选为社区学院工程俱乐部的编程团队负责人.我们要把太阳能电池板放在屋顶上.编程部分涉及
控制伺服系统以调整面板的方向
将面板收集的电力数据发送到服务器(我们尚未决定是否希望通过有线或无线连接.)
虽然我对一般的编程知之甚少,但我对网络或微控制器几乎一无所知.
你能推荐我能阅读的任何书籍来熟悉这些主题吗?两个域中是否有明显的编程语言和库选择?我应该读的任何linux手册页?我实际上不确定我们放在屋顶上的计算机是运行Linux还是Windows.所以我很欣赏两种操作系统的建议.
Will Beej的网络编程指南
是有用的,还是仅适用于互联网应用而非本地网络?是否存在比我应该使用的套接字更高级别运行的软件?
如果不出意外,请给我一些非常明显的关键字,我可以用它来搜索Google.
我正在使用DSP来控制无传感器无刷直流电机,DSP在一块板上,它有一个并行端口和一个jtag连接(它是一个eZdspTMS320F2812).PC应用程序和DSP运行时最好的通信方式是什么?理想情况下,我想要一个带有启动,停止,加速,减速等按钮的GUI程序......但我以前从未做过类似的事情.哪种端口和方法最容易使用?谢谢
microcontroller pc signal-processing communication interface
我正在PIC18汇编中编写一个非常基本的程序.它要求我写一个子程序来乘以两个16位数.这就是我现在所拥有的:
;***********************************************************************
; mul_16bit: subroutine that multiplies two 16 bit numbers stored in
; addresses mul_16ptr1, mul_16ptr1+1 and mul_16ptr2,mul_16ptr2+1 and
; returns the 32-bit result in addresses mul_16res1 to mul_16res1+3
;***********************************************************************
mul_16bit:
movf mul_16ptr2, W ;multiply the lower bytes
mulwf mul_16ptr1, W
movff PRODH, mul_16res+1
movff PRODL, mul_16res
movf mul_16ptr2+1, W ;multiply upper bytes
mulwf mul_16ptr1+1, W
movff PRODH, mul_16res+3
movff PRODL, mul_16res+2
movf mul_16ptr2, W ;multiply lower byte of num2
mulwf mul_16ptr1+1, W ; and upper byte of num1 …Run Code Online (Sandbox Code Playgroud) 我不明白你何时以及为什么要使用bitshift运算符进行微芯片编程:例如......
SWITCH_DDR &= ~SWITCH_BIT;
SWITCH_PORT |= SWITCH_BIT;
Run Code Online (Sandbox Code Playgroud)
为何使用这些运营商?
要么...
void SerialInit(void)
{
UBRRH = ((XTAL / (8 * 250000)) - 1)>>8; // 250kbps at 16Mhz
UBRRL = (XTAL / (8 * 250000)) - 1;
UCSRA = (1<<U2X);
UCSRB = (1<<TXEN);
UCSRC = (1<<URSEL) + (1<<UCSZ1) + (1<<UCSZ0);
}
Run Code Online (Sandbox Code Playgroud)
这里发生了什么???有人请用0和1来图解说明.或者这是另一个例子:
ulong MesureLC(void)
{
int i;
TCCR1B = 0;
CountHigh = 0;
TCNT1 = 0;
for (i=0;i<25000;i++)
{
TCCR1B = (1<<CS12) + (1<<CS11) + (1<<CS10); // WTF ???
UDR = 0x55;
while(!(UCSRA …Run Code Online (Sandbox Code Playgroud) 有没有人知道放在PCIe卡上的COM,它有一些闪存,一些RAM,JTAG支持(或某种调试支持),一些输入端口如USB,可能支持一些输出,如通过VGA或LVDS,只是像这个板子:http://www.knjn.com/FPGA-PCIe.html但不是用于FPGA开发,而是用于微处理器,最好是x86.
过去做过类似的事情,但链接已经死了,它应该有足够的文档并且对黑客友好(而且便宜,不超过100-150美元).
我将为主机系统(linux)编写驱动程序,用于系统间通信,但PCIe板本身应该是独立的(除了PCIe卡上的"客户操作系统"的操作系统,我也将必须写).
谢谢
我正在努力在8位微控制器(HCS08)上组装FFT算法以获得乐趣.一旦算法完成,我将有一个8位实/虚对的数组,我想找到每个值的大小.也就是说,如果x很复杂,我想找到
|x| = sqrt(Re{x}^2 + Im{x}^2)
Run Code Online (Sandbox Code Playgroud)
现在我有一个16位寄存器和一个8位寄存器.我想到只是对它们进行平方,添加它们,并取结果的平方根,但这会产生一个问题:两个8位数的平方和的最大可能值为~130k,大于16位寄存器可以容纳的最大值(65.5k).
我想出了一个子程序,它计算一个16位数的整数平方根,这似乎运行良好,但显然我不能保证使用适合16位的值.我现在的想法是,有一种算法能够直接逼近我需要的算法,但我似乎找不到任何东西.任何想法将不胜感激.
总结一下:假设我有一个带有两个8位组件的向量,我想找到向量的长度.如何在不实际计算平方和平方根的情况下估算这个?
谢谢!
microcontroller assembly signal-processing numerical-methods
我正在开发项目,我使用带有蓝牙模块的Arduino和带有Android OS的手机Samsung Galaxy S II.该项目的想法是通过蓝牙将一些命令从我的手机发送到Arduino.我想在Arduino中包含一个数据库,以便当我从手机发送登录信息时,Arduino将检查数据库,如果登录信息匹配,它会从数据库中检索一些数据并将其发送到我的手机.
如何在Arduino中存储数据库?我应该购买外部EEPROM还是RAM?我该如何处理该数据库(添加,删除和操作数据)?
我的Ardunio属于UNO,BTW.
我正在研究Arduino Mega 2560项目.在Windows 7 PC上,我使用的是Arduino1.0 IDE.我需要建立一个波特率为115200的串行蓝牙通信.当RX上的数据可用时,我需要接收一个中断.我见过的每一段代码都使用"轮询",这是在Arduino循环中放置Serial.available的条件.如何在Arduino的循环中替换这种方法以获得中断及其服务程序?似乎attachInterrupt()没有提供此目的.我依靠中断从睡眠模式中唤醒Arduino.
我开发了这个简单的代码,它应该打开连接到引脚13的LED.
#include <avr/interrupt.h>
#include <avr/io.h>
void setup()
{
pinMode(13, OUTPUT); //Set pin 13 as output
UBRR0H = 0;//(BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
UBRR0L = 8; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
UCSR0C |= (1 << UCSZ00) | (1 << UCSZ10); // Use 8-bit character sizes
UCSR0B |= (1 …Run Code Online (Sandbox Code Playgroud) microcontroller bluetooth arduino interrupt serial-communication
我想编写一个模板函数,只能使用2个数字(例如3和5),如果你尝试将它与其他数字一起使用,则会给出错误.
我可以这样做:
template<int x>
void f();
template<>
void f<3>()
{
cout << "f<3>()\n";
}
template<>
void f<5>()
{
cout << "f<5>()\n";
}
Run Code Online (Sandbox Code Playgroud)
然后我可以正常方式调用此函数:
f<3>();
f<5>();
Run Code Online (Sandbox Code Playgroud)
它编译得很好,如果我尝试错误地使用我的函数:
f<10>();
Run Code Online (Sandbox Code Playgroud)
编译器给我一个错误.
我有这个方法的2个问题:
1.-这是标准吗?我可以使用整数专门设计模板吗?
2.-我不喜欢你使用这种方法时得到的错误,因为错误并没有告诉用户他做错了什么.我更喜欢这样写:
template<int x>
void f()
{
static_assert(false, "You are trying to use f with the wrong numbers");
}
Run Code Online (Sandbox Code Playgroud)
但这不编译.看来我的编译器(gcc 5.4.0)试图首先实例化主模板,因此它给出了(static_assert的)错误.
谢谢您的帮助.
如果您想知道我为什么要这样做是因为我正在学习如何编程微控制器.在微控制器中,你有一些只做一些事情的引脚.例如,引脚3和5是可以生成方波的引脚.如果在一个应用程序中我想生成一个方波,我想写下这样的东西:
square_wave<3>(frecuency);
Run Code Online (Sandbox Code Playgroud)
但是,如果几个月后我想在另一个使用不同微控制器的应用程序中重用这个代码(或更改它),我希望我的编译器对我说:"呃,在这个微控制器中你不能在引脚3中产生方波而5.使用引脚7和9".我认为这可以为我节省很多麻烦(或许不是,我真的不知道.我只是学习如何编程微控制器).
c++ microcontroller templates static-assert template-specialization
使用ESP-IDF(ESP32 SDK)的ESP32应用程序与同一SPI总线上的两个SPI从站通信(ILI9341 TFT驱动程序,NRF24L01 + RF收发器).总的来说,它很棒.但是,从RF收发器接收的一些数据被截断,即只有前几个字节是正确的,其余的是垃圾.
问题或多或少是可重现的,并且只有在接收截断数据之前立即与其他从设备(TFT驱动器)进行SPI通信时才会出现问题.
有问题的SPI事务是一个全双工事务,它在接收10个字节时发送一个命令字节和10个哑字节.它使用VSPI总线和DMA通道1.如果出现问题,只有前几个字节是正确的,而最后2到6个字节是无效的(0或虚拟字节的值).
我挖掘了SDK代码(spi_master.c),添加了调试代码,并在DMA的lldesc_t结构中观察到了一个令人惊讶的值:
在事务开始时,它用length = 0x0c和初始化size = 0x0c.0x0c是12个字节,即10个字节四舍五入到下一个字.
在交易结束时,值为length = 0x07和size = 0x0c(长度可能略有不同).因此,事务只读取7个字节,然后以某种方式终止.或者更确切地说DMA操作终止.
代码非常简单:
uint8_t* buffer = heap_caps_malloc(32, MALLOC_CAP_DMA);
...
memset(buffer, CMD_NOP, len);
spi_transaction_t trx;
memset(&trx, 0, sizeof(spi_transaction_t));
trx.cmd = 0x61;
trx.tx_buffer = buffer;
trx.length = 8 * 10;
trx.rx_buffer = buffer;
trx.rxlength = 8 * 10;
esp_err_t ret = spi_device_transmit(spi_device, &trx);
Run Code Online (Sandbox Code Playgroud)