所以,ADXL345内部建有32级先入先出数据存储器,一共可以缓存32次加速度的测量值。如果这三个寄存器中的加速度数据被取走,FIFO存储器中最先测得的加速度值将被自动转移到DATAX、DATAY、DATAZ三个数据寄存器中。ADXL345的FIFO数据存储器有4种工作模式:旁路模式、FIFO模式、流模式和触发模式。从FIFO中读取数据:主机只能通过访问DATAX、DATAY、DATAZ三个数据寄存器而得到加速度数值。......
2023-11-26
在涉及精确计算指令消耗时间等特殊情况时,最好用汇编语言(Assembly Language)来编写代码。单片机C语言编程中也可以嵌入汇编语言,CVAVR嵌入C语言的方式如下:
在一行中使用多条汇编指令可以用“\”分开。
上面程序中“nop”指令是AVR单片机汇编语言的空执行指令,即什么都不做,只是消耗了一个时钟周期的时间。“sei”是AVR单片机汇编语言的打开全局中断开关的指令,即便在C语言编程时,也是用这条指令打开全局中断的。
C语言程序中也可以调用汇编语言编制的函数,下面这段C语言调用汇编语言的代码,对我们理解单片机的工作过程和原理是非常有益的:
这个汇编函数的主要任务是完成两个整型变量及一个无符号字符型变量的求和。在C语言中调用函数时,将函数中要用到的3个参数压入堆栈。在堆栈中,整型变量占用两个字节,字符型变量占用1个字节内存。变量a先压入堆栈,其次压入变量b,最后变量c被压入堆栈。进入汇编函数后,堆栈指针y指向最后压入堆栈的字节,即变量c,y+1指向变量b的低字节,y+2指向b的高字节,y+3指向变量a的低字节,y+4指向a的高字节。汇编程序先把变量a的高字节和低字节分别送给寄存器R31和R30,然后将b的高字节和低字节分别送给寄存器R27和R26。接着将两个整型变量的高低字节分别相加,结果存在寄存器R31和R30中。最后把字符型变量c扩展为整型,并把高低字节分别送给寄存器R27和R26。同样将上次求和结果与c的高低字节分别相加,最终结果仍然存在寄存器R31和R30中。
CVAVR中规定,汇编函数使用寄存器返回计算结果(从LSB到MSB)如下:(www.chuimin.cn)
R30用于返回字符型和无符号字符型数据;
R30、R31用于返回整型和无符号整型数据;
R30、R31、R22、R23用于返回长整型和无符号长整型数据。
所以这个汇编函数将整型计算结果作为函数返回值,存储在寄存器R30、R31中,而在C语言程序中,直接将寄存器R30、R31中的返回值送给了整型变量r。
有关AVR单片机与传感器基础的文章
所以,ADXL345内部建有32级先入先出数据存储器,一共可以缓存32次加速度的测量值。如果这三个寄存器中的加速度数据被取走,FIFO存储器中最先测得的加速度值将被自动转移到DATAX、DATAY、DATAZ三个数据寄存器中。ADXL345的FIFO数据存储器有4种工作模式:旁路模式、FIFO模式、流模式和触发模式。从FIFO中读取数据:主机只能通过访问DATAX、DATAY、DATAZ三个数据寄存器而得到加速度数值。......
2023-11-26
1.提示CVAVR中,为了减小代码体积和加快程序运行速度,最好遵循下述原则:尽可能使用无符号变量;使用最小的数据类型,例如位型和无符号字符型;通过“Project”→“Configure”→“C Compiler”→“Compilation”→“Bit Variables Size”命令分配的位变量空间要尽可能的小,以便空出寄存器用以分配给其他全局变量;尽可能使用TINY模式;使用flash关键字把常量放在Flash中;程序调试结束后要关闭“Stack End Markers”选项,把程序再编译一次;与时间有关的部分用汇编语言来写。......
2023-11-26
比如:在网上搜索ATmega8A pdf,即可得到其使用手册。在每份技术资料前面,都会有这款芯片的技术特性,ATmega8A单片机的技术特性如下:高性能、低功耗的 8 位AVR微处理器。高持久、非易失性存储区段。■ 23个可编程的I/O口;■ 28引脚PDIP封装,32引脚TQFP与MLF封装。■ 2.7~5.5 V/4.5~5.5 V;■ 2.7~5.5 V。4 MHz时功耗,3 V,25 ℃。■ 工作模式:3.6 mA;■ 空闲模式:1.0 mA;■ 掉电模式:0.5 μA。......
2023-11-26
单片机通过单总线访问DS18B20要遵循以下协议和步骤:① 初始化;② ROM指令;③ DS18B20功能指令。以上3个指令都是单片机访问DS18B20时在单总线上要发出的,并且每次访问必须要按照上述先后顺序进行,不能缺少任一环节,否则DS18B20不会准确响应。DS18B20共有5个ROM指令,每个指令都是8位,主机依次将这8位二进制数在总线上发出,即为ROM指令。和某一从机建立了联系后,才能再发送DS18B20的功能指令。主机通过这条指令可以查询最近一次测温后,是否有DS18B20产生报警。......
2023-11-26
1997年,Atmel公司出于市场需求,推出了全新配置的精简指令集RISC单片机高速8位单片机,简称AVR。AVR单片机废除机器周期,采用RISC,以字为指令长度单位,取指周期短,可预取指令,实现流水作业,可高速执行指令,有高可靠性为后盾。AVR单片机在软/硬件开销、速度、性能和成本多方面取得优化平衡,是高性价比的单片机。......
2023-06-26
由于单片机编程与硬件联系紧密,所以每一种单片机以及同种单片机不同的C语言编译器的语法可能稍有不同。它是HP Info Tech专门为AVR系列单片机设计的C语言编译器。下面是一个最简单的单片机C语言程序,通过这个例子,可以学习和了解单片机编程的特点及与PC机C语言编程的区别。不管是计算机还是单片机,程序代码都是由CPU来执行的。计算机上有操作系统,某一程序运行时只是暂时取得了CPU的控制权,程序结束后要把控制权返还给操作系统。......
2023-11-26
在程序运行过程中,常量的值保持不变,而变量的值可以发生变化。常量和变量有多种形式和大小,也有多种不同的存储形式。const默认常量在内存中,而flash强制常量存储在程序存储器Flash中。非寄存器变量:用volatile关键字定义,强制变量不存储在32个工作寄存器中;EEPROM变量:用eeprom关键字定义,强制变量存储在EEPROM中。......
2023-11-26
TC0单次定时时间与系统时钟频率、预分频比及TCNT0初值密切相关,需要仔细考虑和计算,但向导程序可以很轻松地为我们解决这些问题。向导程序将为我们计算出合适的预分频比及定时器初值,并打开TC0中断,同时还给出了单次定时的误差。计数器溢出后本应自动从0开始计数,但在TC0中断服务程序中计数初值被更改为0x64,而且应该一进入中断服务程序立即被更改。......
2023-11-26
相关推荐