我无法让旋转编码器与AVR微控制器一起正常工作.编码器是机械ALPS编码器,我使用的是Atmega168.
澄清
我曾尝试使用外部中断来收听引脚,但看起来它太慢了.当引脚A变为高电平时,中断程序开始,然后检查引脚B是否为高电平.我们的想法是,如果引脚B变高,引脚A变高,那么它就会逆时针旋转.如果引脚B为低电平,则它按顺时针方向旋转.但似乎AVR检查引脚B需要太长时间,所以它总是读得很高.
我还尝试创建一个程序,只需阻塞直到引脚B或引脚A发生变化.但可能是旋转编码器时噪音太大,因为这也不起作用.我的最后一次尝试是有一个计时器,它将最后8个值存储在缓冲区中,并检查它是否从低到高.这也不起作用.
我已经尝试过对编码器进行范围设计,它似乎在第一个Pin的2到4ms之间使用,直到另一个Pin发生变化.
这是我正在研究的C项目的反汇编AVR代码片段.我注意到这个好奇的代码正在生成,我无法理解它是如何工作的.我假设这是一种荒谬的优化......
解释是什么?
92: ticks++; // unsigned char ticks;
+0000009F: 91900104 LDS R25,0x0104 Load direct from data space
+000000A1: 5F9F SUBI R25,0xFF Subtract immediate
+000000A2: 93900104 STS 0x0104,R25 Store direct to data space
95: if (ticks == 0) {
+000000A4: 2399 TST R25 Test for Zero or Minus
+000000A5: F009 BREQ PC+0x02 Branch if equal
+000000A6: C067 RJMP PC+0x0068 Relative jump
Run Code Online (Sandbox Code Playgroud)
具体来说,为什么第二条指令从R25中减去0xFF而不仅仅是INC R25?
我是第一年开始学习微控制器开发的计算机科学专业的学生.我想使用8051,因为它常见于污垢,并且在现实世界中经常使用.
在我大三或大四的时候,我将采用基于PIC微控制器的嵌入式设计课程,所以我现在不想做PIC; 否则,在那个课程中我会觉得很无聊.
我看到的大多数商业套件都是AVR或PIC系列微处理器.我只是在寻找具有良好开发工具,文档和足够附件的东西,以保持我的新手在夏天自我占用.
有关8051系列套件的任何建议吗?谢谢!
AVR/Arduino上是否实现了AMQP消息发送方?
我刚刚在采用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) 前言
我正在使用avr-g ++来编程AVR微控制器,因此我总是需要获得非常高效的代码.
如果GCC的参数是编译时常量,GCC通常可以优化函数,例如,我有函数pin_write(uint8_t pin, bool val)确定AVR的寄存器pin(使用我从整数pin到一对端口/引脚的特殊映射)并写入这些寄存器的对应值.由于其通用性,这个功能不是太小.但是,如果我把这个函数编译时间常数pin和val,GCC可以在编译时所有的计算和消除这一呼吁的一对夫妇的AVR指令,例如
sbi PORTB,1
sbi DDRB,1
Run Code Online (Sandbox Code Playgroud)
缓行
我们写一个这样的代码:
class A {
int x;
public:
A(int x_): x(x_) {}
void foo() { pin_write(x, 1); }
};
A a(8);
int main() {
a.foo();
}
Run Code Online (Sandbox Code Playgroud)
我们只有一个A类对象,并用常量(8)初始化.因此,可以在编译时进行所有计算:
foo() -> pin_write(x,1) -> pin_write(8,1) -> a couple of asm instructions
Run Code Online (Sandbox Code Playgroud)
但海湾合作委员会没有这样做.
令人惊讶的是,如果我删除全局A a(8)并且只是写
A(8).foo()
Run Code Online (Sandbox Code Playgroud)
我得到了我想要的东西:
00000022 <main>:
22: c0 9a sbi 0x18, 0 ; 24
24: b8 9a sbi …Run Code Online (Sandbox Code Playgroud) 我想交叉编译Clang以在ARM设备上运行,并为ARM mcu(Cortex M3)或ATmega AVR mcus进行编译。Clang能够做到吗?
更新:我已经找到了LLVM 3.5的llvm-avr后端:https : //github.com/sushihangover/llvm-avr
除了我以外,还有其他人感兴趣吗?
我正在使用Eclipse kepler进行AVR开发.我拥有的代码是C(开源),我已经调整它以便它完美运行.我的目标是ATmega2560,采用arduino mega2560的形式.使用arduino板严格用于硬件方便; 我们正在开发硬件作为定制板,其中包含大多数核心arduino mega2560组件.
我需要在这个项目中使用几个库,它们只能用作arduino库,即电子纸屏幕库(来自seeedstudio)和Nordic的BLE nRF8001.
如果我在eclipse中使用插件创建一个新的arduino项目,我可以完美地构建和运行arduino库的测试.
当我尝试将两个代码库合并在一起时,我似乎无法调用添加的arduino库中的函数 - 如果我调用它们,编译器会抛出链接错误.
Building target: Virgin2ManualArdInsert.elf
Invoking: AVR C Linker
avr-gcc -Wl,-Map,Virgin2ManualArdInsert.map -mmcu=atmega2560 -o "Virgin2ManualArdInsert.elf" ./avr/adc.o ./avr/eeprom.o ./avr/lcd_and_input.o ./avr/main.o ./avr/strings.o ./avr/unimplemented.o ./avr/usart.o ./aes.o ./baseconv.o ./bignum256.o ./ecdsa.o ./endian.o ./fft.o ./fix16.o ./hash.o ./hmac_sha512.o ./messages.pb.o ./p2sh_addr_gen.o ./pb_decode.o ./pb_encode.o ./pbkdf2.o ./prandom.o ./ripemd160.o ./sha256.o ./statistics.o ./stream_comm.o ./test_helpers.o ./transaction.o ./wallet.o ./xex.o
./avr/main.o: In function `main':
main.c:(.text.startup.main+0xc): undefined reference to `writeEink'
collect2: error: ld returned 1 exit status
makefile:53: recipe for target 'Virgin2ManualArdInsert.elf' failed
make: *** [Virgin2ManualArdInsert.elf] Error 1 …Run Code Online (Sandbox Code Playgroud) 在编译和链接--gc-sections时,使用avr-gcc并尝试使用-ffunction-sections和-fdata-sections来减小二进制文件的大小..lds文件不包含任何内容:
部分{}
将许多.o部分链接到.a时会发生此错误,稍后将使用它来完成构建.
我已经阅读了其他一些讨论这些选项的帖子,但没有任何内容可以澄清ENTRY()问题.在尝试减少代码大小之前,它们在部分阶段似乎不需要它(预先存在的链接器脚本显然不使用它).
文档说明: - gc-sectionts
"在执行部分链接时可以设置此选项(使用选项'-r'启用).在这种情况下,必须通过'--entry'或`--undefined'选项或通过链接描述文件中的ENTRY命令."
这就是我失去的地方.非常感谢有关如何在链接描述文件中使用--undefined,--entry或ENTRY cmd来解决此问题的更多解释.
我正在使用Yosemite OS X在Mac上工作,我正在尝试用C编译一个程序,然后我可以上传到我的Arduino.我正在学习一个教程.
我试过并重新安装avr-gcc,但我得到了相同的输出.我尝试crtatmega328p.o在我的系统上搜索该文件,但它无处可寻,目录也是如此.
$ avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o Program.o Program.c
$ avr-gcc -mmcu=atmega328p Program.o -o Program
/usr/local/lib/gcc/avr/5.2.0/../../../../avr/bin/ld: cannot find crtatmega328p.o: No such file or directory
/usr/local/lib/gcc/avr/5.2.0/../../../../avr/bin/ld: cannot find -latmega328p
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)