标签: atmega

Arduino:轻量级压缩算法,用于将数据存储在EEPROM中

我想用ATmega168/ATmega328微控制器将大量数据存储到我的Arduino上,但不幸的是,只有256 KB/512 KB的EEPROM存储空间.

我的想法是利用压缩算法去除大小.但是,我对压缩算法的了解非常少,而且我对即用型库的搜索失败了.

那么,是否有一种优化存储大小的好方法?

compression embedded algorithm atmega arduino

17
推荐指数
2
解决办法
2万
查看次数

嵌入式应用的测试代码

背景:

我正在利用Atmel AVR atmega2560开发一个大型项目.该项目包含许多基于硬件的功能(7个SPI设备,2个I2C,2个RS485 MODBUS端口,大量模拟和数字I/O).我为所有这些设备开发了"驱动程序",它们为主应用程序循环提供了访问所需数据的接口.

题:

我正在开发的项目最终必须符合SIL标准.

我希望能够测试代码并提供良好的代码覆盖率.但是,我无法找到任何信息来开始我应该如何设置这样的测试框架.

我的想法是,我可以拥有一套自动化测试,可以测试未来的错误修复和功能添加,以确定它们是否破坏了代码.问题是我不明白如何在芯片上测试代码.

我是否需要硬件来监控设备上的I/O并模拟外部连接的设备?任何可以提供的指针都将受到高度赞赏.

--Steve

c testing embedded atmega

15
推荐指数
1
解决办法
2950
查看次数

C - AVR - 简单的PORTB,DDRB,PINB说明

我正在研究学校项目,需要使用AVR atmega控制器学习C语言的基础知识.

我不明白一切都是如何建立的.例如PORTB,PORTD,DDRB; DDRD,PINB,PIND等等.我不知道if语句,while循环等是如何工作的.

有人可以给我一个简短的解释吗?

我有一些代码行......

DDRB = 0b00000011; // I know that here DDRB is set to input/output
Run Code Online (Sandbox Code Playgroud)

并且if语句:

if (PINB & (1 << PINB0)){
    A = true;
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这个"if语句"是如何工作的吗?为什么PINB & (1<< PINB0))

谢谢

c avr atmega

14
推荐指数
4
解决办法
5万
查看次数

Arduino Uno PWM引脚冲突

我基于L298N芯片制造了这个电机屏蔽,以控制一个水箱的两个电机.它将引脚5和6用于一个电机,而引脚10和11用于另一个电机.

在尝试添加TSOP 4838以便使用IR遥控器控制油箱时,我注意到在10/11引脚上反向移动电机只能在全速运行 - 即引脚11上的HIGH(255)值.低于该值不会在引脚11上输出任何内容(这些引脚上的测量电压为0 V).

对于遥控器,我使用这个库.该IR接收器连接在引脚2(但销并不重要).问题是库代码本身.启用IR监听的行irrecv.enableIRIn();是导致问题的原因.我了解到内部Arduino定时器和屏蔽用于PWM的引脚存在冲突.

这是反向驱动电机的代码:

#include <IRremote.h>

// IR receiver configuration
const int irPin = 2;
IRrecv irrecv(irPin);

// Motors configuration
const int mLeftPin1  = 10;
const int mLeftPin2  = 11;
const int mRightPin1 = 5;
const int mRightPin2 = 6;

void setup()
{
  // Start IR
  irrecv.enableIRIn();

  // Setup motors
  pinMode(mLeftPin1, OUTPUT);
  pinMode(mLeftPin2, OUTPUT);
  pinMode(mRightPin1, OUTPUT);
  pinMode(mRightPin2, OUTPUT);

  // Move left motor in reverse, slower speed …
Run Code Online (Sandbox Code Playgroud)

avr atmega timer arduino pwm

13
推荐指数
1
解决办法
3万
查看次数

AVR Studio上的脉冲宽度调制(PWM)

我正在尝试将PWM用于ATmega8上的LED,端口B的任何引脚.设置定时器一直很烦人,我不知道如何处理我的OCR1A.这是我的代码,我喜欢一些反馈.

我只想弄清楚如何使用PWM.我知道这个概念,OCR1A应该是我希望脉冲开启的整个计数器时间的一小部分.

#define F_CPU 1000000  // 1 MHz

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>

int main(void){

    TCCR1A |= (1 << CS10) | (1 << CS12) | (1 << CS11);
    OCR1A = 0x0000;
    TCCR1A |= ( 0 << WGM11 ) | ( 1 << WGM10 ) | (WGM12 << 1) | (WGM13 << 0);
    TCCR1A |= ( 1 << COM1A0 ) | ( 0 << COM1A1 );
    TIMSK |= (1 << TOIE1); // Enable timer interrupt
    DDRB = 0xFF;
    sei(); // …
Run Code Online (Sandbox Code Playgroud)

avr atmega width pulse

9
推荐指数
2
解决办法
3万
查看次数

当断点设置时,薛定谔虫就会消失

我的代码中有一个奇怪的错误,当我尝试调试时会消失.

在我的计时器中断(总是运行系统自动收报机)我有这样的事情:

 if (a && lot && of && conditions)
 {
     some_global_flag = 1;                   // breakpoint 2
 }
Run Code Online (Sandbox Code Playgroud)

在我的主循环中我有

 if (some_global_flag)
 {
     some_global_flag = 0;
     do_something_very_important();   // breakpoint 1
 }
Run Code Online (Sandbox Code Playgroud)

当计时器中的条件(我认为)满足时,主循环中的这种情况永远不会被调用.条件是外部的(portpins,ADC结果等).首先,我在位置1处放置一个断点,它永远不会被触发.

为了检查它,我把断点nr.2在线some_global_flag = 1;,在这种情况下代码工作:当条件为真时触发两个断点.

更新1:

要研究是否有一些时间条件负责,并且if如果在没有调试的情况下运行,则永远不会输入计时器,我在计时器中添加了以下内容:

 if (a && lot && of && conditions)
 {
     some_global_flag = 1;                   // breakpoint 2
 }


 if (some_global_flag)
 {
     #asm("NOP");    // breakpoint 3
 }
Run Code Online (Sandbox Code Playgroud)

该标志不会在代码中的任何其他位置使用.它在RAM中,RAM在开始时清零.

现在,当所有断点都被禁用时(或者只启用了main中的断点1),代码无法正常工作,则不执行该功能.但是,如果我只在NOP上启用断点3,则代码可以正常工作!断点被触发,继续后,执行该功能.(它有可见和可听的输出,所以它很明显,如果它运行)

更新2:

定时器中断通过其开头的"SEI"是可中断的.我删除了该行,但行为没有以任何明显的方式改变.

更新3:

我没有使用任何外部存储器.因为我非常接近flash中的限制,所以我在编译器中进行了最大化优化.

编译器(CodeVision)可以负责,还是我做错了什么?

c embedded atmega jtag

8
推荐指数
3
解决办法
1001
查看次数

对于三种情况的排列,最快的算法是什么?

有人可以帮我解决最短步骤评估三个条件的最快方法吗?我有三个条件,如果两个中的任何一个都是真的,那么整个表达式就变成了true另一个false.

我尝试了两种方法:

if ((condition1 && condition2) || 
    (condition1 && condition3) || 
    (condition2 && condition3))
Run Code Online (Sandbox Code Playgroud)

另一种方法是引入变量i

i = 0;
if (condition1) i++;
if (condition2) i++;
if (condition3) i++;
if (i >= 2)
    //do something
Run Code Online (Sandbox Code Playgroud)

我想要比上面两个更好的任何其他有效方法.

我在内存受限的环境中工作(Atmeta8具有8 KB的闪存)并且需要一个在C中工作的解决方案.

c optimization boolean atmega

7
推荐指数
2
解决办法
415
查看次数

如果在AVR编程中将所有变量定义为volatile,那会不好?

我读过在某些情况下(全局变量,或while(变量)等),如果未定义变量volatile,可能会导致问题.

如果我将所有变量定义为volatile,会导致问题吗?

c avr atmega volatile

7
推荐指数
1
解决办法
5211
查看次数

Arduino/AVR ATmega微控制器,随机复位,跳转或变量/数据损坏

我认为许多Arduino/AVR MCU的程序员可以分享一些知识.

我的具体问题是:
在Atmel Atmega128 AVR的情况下.
基于ADC数据,我正在运行一个循环,它正在对串行控制台进行一些计算,它也驱动了一个中断.

发生的事情是,当我使用一定数量的串行输出时,程序突然变得非常不稳定.
代码中的随机跳转,随机未知中断,随机变量损坏,无MCU寄存器位设置的随机复位.
在特定点添加缓冲区解决了不稳定性.
更改gcc的优化参数也改变了行为,没有优化,代码非常稳定.

检查我的答案可能的原因和真正的原因.

debugging microcontroller avr atmega arduino

7
推荐指数
1
解决办法
6427
查看次数

ATMega328P"AVRDude:找不到USBTiny设备(0x1781/0xc9f)"

下午好,

我最近组装了一个基于ATMega328P的微控制器PCB,这是我自己设计的.我对电路本身感觉很好,因为我设法通过Sparkfun AVR Pocket Programmer 上传Arduino Blink草图.

上传此草图后,我注意到ATMega正在使用其内部振荡器.我尝试通过Arduino IDE再次安装Arduino引导加载程序时,我感觉不舒服.

此时抛出了许多错误,但是电路板开始使用它的外部时钟并正确运行Blink程序.

我不能再向芯片上传任何代码,因为我无法让AVRDude在我的Mac上运行,我在Windows 8.1 PC上安装了AVRDude 5.1.

然后我连接了设备并发送:

avrdude -c usbtiny -p atmega328p
Run Code Online (Sandbox Code Playgroud)

这简单地返回:

avrdude: Error: Could not find USBtiny device ( 0x1781/0xc9f)
Run Code Online (Sandbox Code Playgroud)

我是否无意中歪斜了芯片的熔丝位?我怎么能保存这个芯片?

更新:我设法安装AVRDude 6.0.1现在错误如下:

avrdude: initialization failed, rc=-1
Run Code Online (Sandbox Code Playgroud)

完整结果如下:

终点归来

atmega arduino avrdude

7
推荐指数
1
解决办法
2万
查看次数