微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > AVR ATmega16访问16 位寄存器

AVR ATmega16访问16 位寄存器

时间:11-13 来源:互联网 点击:
TCNT1、OCR1A/B与ICR1是AVR CPU 通过8位数据总线可以访问的16位寄存器。读写16位寄存器需要两次操作。

每个16位计时器都有一个8位临时寄存器用来存放其高8位数据。每个16 位定时器所属的16 位寄存器共用相同的临时寄存器。访问低字节会触发16位读或写操作。当CPU 写入数据到16 位寄存器的低字节时,写入的8 位数据与存放在临时寄存器中的高8 位数据组成一个16 位数据,同步写入到16 位寄存器中。当CPU 读取16 位寄存器的低字节时,高字节内容在读低字节操作的同时被放置于临时辅助寄存器中。
并非所有的16 位访问都涉及临时寄存器。

对OCR1A/B 寄存器的读操作就不涉及临时寄存器。

写16 位寄存器时,应先写入该寄存器的高位字节。而读16 位寄存器时应先读取该寄存器的低位字节。

下面的例程说明了如何访问16 位定时器寄存器。前提是假设不会发生更新临时寄存器内
容的中断。同样的原则也适用于对OCR1A/B 与ICR1 寄存器的访问。使用“C” 语言时,
编译器会自动处理16 位操作。
Note: 1. 本代码假定已经包含了合适的头文件。
汇编代码例程中TCNT1 的返回值在r17:r16 寄存器对中。
注意到16 位寄存器的访问是一个基本操作是非常重要的。在对16 位寄存器操作时,最
好首先屏蔽中断响应,防止在主程序读写16 位寄存器的两条指令之间发生这样的中断:
它也访问同样的寄存器或其他的16 位寄存器,从而更改了临时寄存器。如果这种情况发
生,那么中断返回后临时寄存器中的内容已经改变,造成主程序对16 位寄存器的读写错
误。
汇编代码例程(1)
...
; 设置TCNT1 为0x01FF
ldi r17,0x01
ldi r16,0xFF
out TCNT1H,r17
out TCNT1L,r16
; 将 TCNT1 读入r17:r16
in r16,TCNT1L
in r17,TCNT1H
...
C 代码例程

unsigned int i;
...
/* 设置TCNT1 为0x01FF */
TCNT1 = 0x1FF;
/* 将TCNT1 读入i */
i = TCNT1;

汇编代码例程中TCNT1 的返回值在r17:r16 寄存器对中。
注意到16 位寄存器的访问是一个基本操作是非常重要的。在对16 位寄存器操作时,最
好首先屏蔽中断响应,防止在主程序读写16 位寄存器的两条指令之间发生这样的中断:
它也访问同样的寄存器或其他的16 位寄存器,从而更改了临时寄存器。如果这种情况发
生,那么中断返回后临时寄存器中的内容已经改变,造成主程序对16 位寄存器的读写错
误。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top