背景:
我正在利用Atmel AVR atmega2560开发一个大型项目.该项目包含许多基于硬件的功能(7个SPI设备,2个I2C,2个RS485 MODBUS端口,大量模拟和数字I/O).我为所有这些设备开发了"驱动程序",它们为主应用程序循环提供了访问所需数据的接口.
题:
我正在开发的项目最终必须符合SIL标准.
我希望能够测试代码并提供良好的代码覆盖率.但是,我无法找到任何信息来开始我应该如何设置这样的测试框架.
我的想法是,我可以拥有一套自动化测试,可以测试未来的错误修复和功能添加,以确定它们是否破坏了代码.问题是我不明白如何在芯片上测试代码.
我是否需要硬件来监控设备上的I/O并模拟外部连接的设备?任何可以提供的指针都将受到高度赞赏.
--Steve
我正在研究学校项目,需要使用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))?
谢谢
我基于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) 我正在尝试将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) 我的代码中有一个奇怪的错误,当我尝试调试时会消失.
在我的计时器中断(总是运行系统自动收报机)我有这样的事情:
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)可以负责,还是我做错了什么?
有人可以帮我解决最短步骤评估三个条件的最快方法吗?我有三个条件,如果两个中的任何一个都是真的,那么整个表达式就变成了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中工作的解决方案.
我读过在某些情况下(全局变量,或while(变量)等),如果未定义变量volatile,可能会导致问题.
如果我将所有变量定义为volatile,会导致问题吗?
我认为许多Arduino/AVR MCU的程序员可以分享一些知识.
我的具体问题是:
在Atmel Atmega128 AVR的情况下.
基于ADC数据,我正在运行一个循环,它正在对串行控制台进行一些计算,它也驱动了一个中断.
发生的事情是,当我使用一定数量的串行输出时,程序突然变得非常不稳定.
代码中的随机跳转,随机未知中断,随机变量损坏,无MCU寄存器位设置的随机复位.
在特定点添加缓冲区解决了不稳定性.
更改gcc的优化参数也改变了行为,没有优化,代码非常稳定.
检查我的答案可能的原因和真正的原因.
下午好,
我最近组装了一个基于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)
完整结果如下:
