我无法让旋转编码器与AVR微控制器一起正常工作.编码器是机械ALPS编码器,我使用的是Atmega168.
澄清
我曾尝试使用外部中断来收听引脚,但看起来它太慢了.当引脚A变为高电平时,中断程序开始,然后检查引脚B是否为高电平.我们的想法是,如果引脚B变高,引脚A变高,那么它就会逆时针旋转.如果引脚B为低电平,则它按顺时针方向旋转.但似乎AVR检查引脚B需要太长时间,所以它总是读得很高.
我还尝试创建一个程序,只需阻塞直到引脚B或引脚A发生变化.但可能是旋转编码器时噪音太大,因为这也不起作用.我的最后一次尝试是有一个计时器,它将最后8个值存储在缓冲区中,并检查它是否从低到高.这也不起作用.
我已经尝试过对编码器进行范围设计,它似乎在第一个Pin的2到4ms之间使用,直到另一个Pin发生变化.
我不明白你何时以及为什么要使用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) 嗨,我想知道是否有人可以举例说明该TickGetDiv256();功能是如何
工作的.它来自Tick.c中的Microchip
我试图计算2个小时,如果满载发动机将停止.
我可以使用" threshold = tick + TICKS_PER_SECOND * 60;"功能.但我不知道它是否将是很好的用于这个的时间:threshold = tick + (TICKS_PER_SECOND * 60 * 60)*2;
亲切的问候
有没有人知道放在PCIe卡上的COM,它有一些闪存,一些RAM,JTAG支持(或某种调试支持),一些输入端口如USB,可能支持一些输出,如通过VGA或LVDS,只是像这个板子:http://www.knjn.com/FPGA-PCIe.html但不是用于FPGA开发,而是用于微处理器,最好是x86.
过去做过类似的事情,但链接已经死了,它应该有足够的文档并且对黑客友好(而且便宜,不超过100-150美元).
我将为主机系统(linux)编写驱动程序,用于系统间通信,但PCIe板本身应该是独立的(除了PCIe卡上的"客户操作系统"的操作系统,我也将必须写).
谢谢
我是iMX31和嵌入式系统的新手,请帮助我理解从SDRAM地址到ARM CPU地址的转换,特别是在SDRAM控制器的"特殊"命令模式下.
这是我有问题的SDRAM初始化代码:
ldr r0, ESDCTL_BASE_W
mov r2, #SDRAM_BASE_ADDR /* 0x80000000 */
ldr r1, =0x92100000 /* Precharge */
str r1, [r0]
ldr r1, =0x0
ldr r12, =0x80000F00
str r1, [r12]
ldr r1, =0xA2100000 /* Auto-refresh */
str r1, [r0]
ldr r1, =0x0
str r1, [r2]
ldr r1, SDRAM_0xB2100000 /* Load Mode Register */
str r1, [r0]
ldr r1, =0x0
strb r1, [r2, #0x33]
ldr r1, =0xFF
ldr r12, =0x81000000
Run Code Online (Sandbox Code Playgroud)
我的RAM是Micron LPDDR MT46H64M32LF,这段代码很好地遵循初始化程序,但在PRECHARGE步骤中,地址0x80000F00来自何处?
从iMX31参考手册中我了解到,在PRECHARGE …
我刚刚在采用ASM的Atmel AVR上完成了一个DDS项目,并得出结论,8位查找表和8位DAC在低频时会产生太多的量化失真; 由于缺乏更好的措辞,我在示波器上得到一个带有梯形效果的正弦波.
显然,如果我用大LPF平滑波形,我在高频时会出现振幅问题.
理论上,从8位升级到12位DAC并采用4个最低有效位的插值应该可以让我将滤波器的截止点提高到足够大的数量,以缓解更高频率下波形振幅的问题.我的问题是,我不知道如何做到这一点,或者是否有一种更简单的方法来删除拉链效果..也许12位查找表?
到目前为止,我已经创建了一个无限循环,每次循环完成一个循环时,就会根据与查找表相关的指针位置向DAC发送一个值.这是我感到困惑的地方.我已经阅读了大量关于此的信息,但仍然没有找到一个有效的例子.如果我有一个无限循环,我应该如何在表查找值之间填充插值?关于我能想到的最好的事情是(a + b)/ 2; 我可以实现这个并获得一个额外的位或相当于512点的查找表,但我想认为有一种更简单的方法可以提供更好的结果.我不知道C或如何使用它,但如果它是谨慎的我会试一试.
目前,我的时钟是1MHZ,如果有必要,我可能会达到16MHZ.
以下是我的代码示例:
; 将sinewave输出设置为默认值
ldi ZH, High(sine*2); setup Z pointer hi
ldi ZL, Low(sine*2) ; setup Z pointer lo
Run Code Online (Sandbox Code Playgroud)
; 清除累加器
clr r29 ; clear accumulator
Run Code Online (Sandbox Code Playgroud)
; 设置加法器寄存器
ldi r24,0x50 ; Fine adder value change register
ldi r25,0x08 ; Middle adder value change register
ldi r26,0x00 ; Coarse adder value change register
Run Code Online (Sandbox Code Playgroud)
LOOP1:
add r28,r24 ; 1 Adder values carry over to higher registers. Higher registers raise freq. in larger …Run Code Online (Sandbox Code Playgroud) 在pic微控制器中,TRIS寄存器确定端口是作为输入还是输出,PORT寄存器将确定内容,应该写入(在输出的情况下)或读取(在输入的情况下).
但是在8051中没有任何这种TRIS寄存器.要将寄存器配置为输入/输出,必须写入同一寄存器并写入/读取必须再次使用相同寄存器的数据.我这是对的吗?如果是,那么请解释一下怎么可能?如果没有,那么请解释正确的理论.
我一直在试图用C在Keil写我的一些测试代码TM4C123G,它使用的ARM微控制器.我不知道ARM assembly,但我已经为AVR microcontroller过去编写了一些汇编代码.
存储变量的值在哪里,如果我们在C中声明一个变量global,而不是声明它main?
关于是否应该声明一个变量global而不是main(在为微控制器编写C时)是否有一般指导原则?
我正在做一个项目,使用带有加速度计的ARM cortex-m0微控制器(Freedom - KL25Z)来检测(分类)人类活动.我打算使用机器学习来预测用户的活动.
问题是,cortex-m0不能处理训练或预测算法,所以我可能不得不收集数据,在我的计算机上训练然后以某种方式嵌入它,我真的不知道该怎么做.
我在互联网上看到一些帖子说你可以生成一个权重矩阵并将其嵌入到微控制器中,因此根据你为这个函数提供的数据预测某些东西是一个简单的函数.这是正确的做法吗?
无论如何我的问题是,如何在微控制器中嵌入分类算法?
我希望你们能帮助我并提供一些指导,我有点迷失在这里.
先感谢您.
使用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)