avr

Why is reinterpret_cast not constexpr?

北慕城南 提交于 2020-07-20 07:48:10
问题 Consider the following snippet: static constexpr uint8_t a = 0; static constexpr const int8_t *b = reinterpret_cast<const int8_t *>(&a); This fails to compile with error: a reinterpret_cast is not a constant expression , because the C++ standard forbids using reinterpret_cast in constexpr . However compilation succeeds if I want to store the value b in PROGMEM (for AVR microcontrollers): static constexpr uint8_t a = 0; static const int8_t PROGMEM *const b = reinterpret_cast<const int8_t *>(&a

Reversing bits in a byte with AVR

冷暖自知 提交于 2020-04-18 05:47:25
问题 I am currently working on a problem that wants me to build a subroutine that will reverse the bits in R16. 00000011 => 11000000 or 10101000 => 00010101 For the class we are using the AVR subset and the subroutine needs to work in norfair. This is what I have so far, any help would be appreciated! ldi r16,3 ;00000011 回答1: The naive solution is to loop through the bits with the shift operator and check. But be aware that AVR doesn't have a barrel shifter so it can only shift by 1, any other

单片机成长之路(avr基础篇)- 003 AVR单片机的BOOT区

核能气质少年 提交于 2020-03-10 04:23:59
  BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器。对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存储器中所有的数据都是不可读的,这就在运行旧程序和写入新程序之间造成了一个矛盾。   使用BOOT区是解决这个矛盾的方法之一,它将FLASH存储器从物理上分为两个独立的区域,对其中的一个区的数据写入不会影响到另一个区的数据读取操作。我们可以让单片机的程序在其中一个区(通常是BOOT区)运行,而运行着的程序代码写入另外一个区(通常为应用程序区)内。   AVR高档单片机ATmega系列中含有BOOT代码区,即程序引导区,也可称器件自身监控区,有了此BOOT区监控,该器件就可对自己器件的Flash程序存储器及EEPROM数据存储器进行读、写操作,即实现自编程功能,也可称IAP在系统应用中编程,这种自编程程序区我们称其用户管理程序,简称用户程序。   BOOT区大小可根据实际需要用寄存器设定,并可锁定加密,使外界无法读取其监控。如果BOOT区监控设计得好,可把该器件的主要、关键控制对象放在BOOT区监控内(如中断控制),其它工作让用户自己设计,可变成傻瓜式控制器、检测仪,可远程对嵌入式设备进行检测、维护、升级等操作。也可通过有线、无线网络监控设备。实现秀才不出门,也可管世界

手把手教你把5V的Arduino改造成3.3V版本

末鹿安然 提交于 2020-03-06 08:36:35
Arduino Pro Mini是基于ATmega328的微控制板,支持5V/3.3V电压。但是我们比较容易买到的是5V供电的版本,有的时候需要用到3.3V版本(比如我们的软控DAC)。怎样才能让这款板板支持3.3V电压呢。 思路 把5V的Arduino改造成3.3V版本,实际上就是提出了一个问题:5V的Arduino和3.3V版本有什么不同? 实际上AtMega328P可以支持很宽的电压范围。但是在不同工作电压下,可以跑到的最大主频是不同的。 在5V下可以跑到16MHz,而在3.3V下只能跑到8MHz。所以我们首先需要解决时钟问题。 5V的版本配备的外置晶振是16MHz的,为了得到8MHz的主时钟, 我们可以修改熔丝位,使用328内部的8MHz RC振荡器。 另外,328内部还有BOD检测,当电压低于设置值的时候会自动停机。 使用3.3V电源应该把BOD阈值修改为2.7V。 最后,还要 刷入支持8MHz主频的Arduino Bootloader。 这样改造出来的Arduino,支持3.3V电源电压,RAW脚稳压之后仍然得到5V电压,Arduino本身执行不受影响。 但是如果把RAW的稳压输出用于外设供电,就要仍然使用5V的外设。因此最好是外置一个3.3V的稳压电源供Arduino和外设使用。 准备工作 1、 如果你从来没有使用过Arduino,你首先需要下载IDE

Atmel Studio 6使用

隐身守侯 提交于 2020-02-24 05:03:04
https://www.jb51.net/softs/556230.html Atmel Studio6也叫Avr Studio 6 ,是一款由Atmel公司开发的免费、集成化开发环境(IDE),可用来开发和调试基于Atmel ARM Cortex-M和AtmelAVR微控制器(MCU)的应用,Atmel Studio6提供了一个无缝、易用的环境,包含C/C++编译器、汇编器和模拟器,供用户编写、构建和调试采用C/C++或汇编代码编写的应用,还能与系统内的调试器和编程器无缝连接,进一步简化了代码开发,需要此款工具的朋友们可以前来下载使用。 Atmel Studio 6.2现已推出,新版增加了先进的调试功能(例如数据和中断跟踪),提高了RTOS集成,能够更好地调试已优化的代码,通过引入Atmel Gallery和Atmel Spaces两个模块,进一步简化了内嵌式MCU设计,减少了开发时间和成本。 Atmel Studio6使用教程 这里以GCC编译C语言编译一个8位的AVR为例,AVR Studio 6已经集成了AVR Toolchain,是最新版本3.4.0,不需要再安装WinAVR,也不需要再安装AVR toolchain。编译一个AVR时,需要做以下几件事,以AT90CAN128为例: 假设在新建项目时已经选择好了芯片AT90CAN128和工具,例如:JTEGMKII 1

how to trim unknown first characters of string in code vision

青春壹個敷衍的年華 提交于 2020-02-23 06:56:05
问题 I set a mega16 (16bit AVR microcontroller) to receive data from the serial port which is connected to Bluetooth module HC-05 for attaining an acceptable number sent by my android app and an android application sends a number in the form of a string array whose maximum length is equal to 10 digits. The problem arrives while receiving data such that one or two unknown characters(?) exist at the beginning of the received string. I have to remove these unknown characters from the beginning of the

STM32 HAL rx interrupt can't get bytes correctly

江枫思渺然 提交于 2020-02-05 06:15:08
问题 Hi guys I am trying to make serial rx interrupt using stm32 HAL library and I got error what I dont know. It is really simple program. PC gives bytes to stm32 board and stm32 will take those bytes using rx interrupt routine. Problem is when i send over 4 bytes ,such as "12345", stm32 board only got 4 bytes and last one byte(5) is gone somewhere. Here is picture for better understanding. Here is my code in HAL_UART_RxCpltCallback routine: HAL_UART_Transmit(&huart4, &receive1, 1, 1000); HAL

STM32 HAL rx interrupt can't get bytes correctly

不羁的心 提交于 2020-02-05 06:15:05
问题 Hi guys I am trying to make serial rx interrupt using stm32 HAL library and I got error what I dont know. It is really simple program. PC gives bytes to stm32 board and stm32 will take those bytes using rx interrupt routine. Problem is when i send over 4 bytes ,such as "12345", stm32 board only got 4 bytes and last one byte(5) is gone somewhere. Here is picture for better understanding. Here is my code in HAL_UART_RxCpltCallback routine: HAL_UART_Transmit(&huart4, &receive1, 1, 1000); HAL

Add Two 32 bit Floating Point Numbers with AVR-Assembler

那年仲夏 提交于 2020-01-17 13:42:09
问题 Im trying to use AVR Studio to add two 32bit floating point numbers together. I know that I will need to store the 32bit number in 4 separate 8bit registers. I'll then need to add the registers together using the carry flag. This is what I have so far. Im adding 5.124323 and 2.2134523. ;5.124323 (01000000101000111111101001110100) ;Store hex value (40A3FA74) ldi r21,$40 ldi r22,$A3 ldi r23,$FA ldi r24,$74 ;2.2134523 (01000000000011011010100100110100) ;Store hex value (400DA934) ldi r25,$40 ldi