我面临的问题是,attiny 167和attiny 87,尽管在数据表上说,他们是下降的替代品,实际上不是。程序是用AVR汇编语言编写的。
Attiny 87的向量表使用RJMP,而Attiny 167使用JMP。这意味着我需要在我的程序中有两个独立的向量表示例,我认为这是不可能的。有没有一种方法可以编写代码,使程序可以检查签名字节,以检查哪个硬件设备处于打开状态,然后使用适当的“jmp”指令?- 谢谢你-谢谢
到目前为止,我已经尝试使用任何需要的jmp指令编写程序的两个单独示例,但是我需要一种方法让程序自动完成这一点,而不是必须手动检查。
4条答案
按热度按时间1u4esq0p1#
简单的解决方案是让
reset
将签名字节读入一个变量,以便稍后可以在该变量上进行分支。初始代码可能如下所示:字符串
如果你不喜欢重复的分支,你可以把一个聪明的分派器放在一起,用
RCALL
和返回地址来工作。这可能是矫枉过正,但很有趣,所以在这里:型
bjg7j2ky2#
我很惊讶没有人建议使用汇编宏,假设你的中断向量例程位于地址
0x1200
,而你的中断向量地址位于地址0x0006
:字符串
你也可以使用预处理器做一些更脏但更酷的事情:
型
对于第二种方法,现在基本上可以在代码中的任何地方将
JMP
和RJMP
的每个示例替换为MJMP
,并且它将更全局地解决问题(不仅仅是中断)。nwo49xxi3#
ATtiny 167和ATtiny 87尽管在数据表上说它们是替代品,但实际上不是。
它并不意味着芯片是二进制兼容的,即它们可以使用相同的二进制代码/可执行文件来编程。
iqxoj9l94#
根据目录表,这两种类型都兼容硬件和软件。两者都使用两个字表示向量表。仅当FLASH大小小于4KiBy时,才可以使用一个字(rjmp)。
Atmel® ATtiny 87和ATtiny 167是硬件和软件兼容的。它们仅在内存大小上有所不同,如表1-1所示x1c 0d1x
阅读DS的1.1
因此,您可以将JMP用于两个MCU
在使用几个不兼容类型的情况下,这通过条件转换来解决,例如根据签名或族类型。
**编辑:**我对表1.1中的信息感到困惑。在为ATTiny 87编写时,它使用2个字作为中断向量表。事实上,它只使用一个单词,因为rjmp可以跳转到8 KiBy(+-2KWord)。在这种情况下,可以使用条件翻译。例如,在
AVRASM2
中,如下所示字符串