标签: avr

make:***没有规则来制作目标`main.o'

这是Eclipse中控制台的输出:

 **** Build of configuration Debug for project FatFstest ****

make all 
make: *** No rule to make target `main.o', needed by `FatFstest.elf'.  Stop.
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用Eclipse的AVR插件构建一个项目来测试FatFs库.我首先导入了FatFs代码,然后创建了main.c文件来实现它.在我第一次尝试构建它之后,我将项目的src文件夹添加到Properties> AVR Compiler> Directories中的目录列表中,我仍然得到构建错误.有帮助吗?

这是我的makefile:

################################################################################
# Automatically-generated file. Do not edit!
################################################################################

-include ../makefile.init

RM := rm -rf

# All of the sources participating in the build are defined here
-include sources.mk
-include subdir.mk
-include src/subdir.mk
-include objects.mk

ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
ifneq ($(strip $(ASM_DEPS)),)
-include $(ASM_DEPS)
endif
ifneq …
Run Code Online (Sandbox Code Playgroud)

eclipse avr makefile

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

如何反转一个字节

我目前正在研究一个项目,碰巧我必须颠倒一个字节的顺序.我目前正在使用AVR Studio Mega32微控制器.

例如:

0000 0001 becomes 1000 0000
0001 0110 becomes 0110 1000
1101 1001 becomes 1001 1011
Run Code Online (Sandbox Code Playgroud)

首先,我有这个:

ldi r20,0b00010110
Run Code Online (Sandbox Code Playgroud)

反转字节的最简单方法是什么,使r20变为01101000?

assembly reverse byte avr atmega

6
推荐指数
1
解决办法
5572
查看次数

如何使用C/gcc从外设IO寄存器读取?

我在AVR32上有一个中断服务路由.我需要从中断状态寄存器中读取以取消中断.但是我没有使用读取的结果.我宁愿不使用asm指令,但我担心gcc会将读取优化为虚拟变量.什么是正确的方法?

目前我有:

uint32_t tmp = *(volatile uint32_t *)INTERRUPT_STATUS_REG_ADDRESS;
Run Code Online (Sandbox Code Playgroud)

tmp也应该波动吗?我担心如果没有使用tmp,gcc会跳过读取.

gcc avr volatile isr

6
推荐指数
1
解决办法
841
查看次数

将UNUSED元素添加到C/C++结构可加快并减慢代码执行速度

我编写了以下结构,用于我正在制作的Arduino软件PWM库,一次PWM(在Uno上)或70个引脚(在Mega上).

如上所述,处理此结构数组的代码的ISR部分(eRCaGuy_SoftwarePWMupdate())需要133us才能运行.但是,非常奇怪的是,如果我取消注释"byte flags1"这一行 (在结构中)虽然flags1尚未在任何地方使用,但ISR现在需要158us才能运行.然后,如果我取消注释"byte flags2;" 为了使BOTH标志现在不被注释,运行时会回落到之前的状态(133us).

为什么会这样?!?我该如何解决?(即:我想确保一致的快速代码,对于这个特定的功能,而不是令人费解的变幻无常的代码).添加一个字节会大大减慢代码速度,但添加两个字节根本不会发生任何变化.

我正在尝试优化代码(我还需要添加另一个功能,需要单个字节用于标志),但我不明白为什么添加一个未使用的字节会使代码减慢25us,但添加两个未使用的字节并不会t根本改变运行时间.

我需要了解这一点,以确保我的优化始终如一.

在.h文件中(我的原始结构,使用C风格的typedef'ed结构):

typedef struct softPWMpin //global struct
{
  //VOLATILE VARIBLES (WILL BE ACCESSED IN AND OUTSIDE OF ISRs)
  //for pin write access:
  volatile byte pinBitMask;
  volatile byte* volatile p_PORT_out; //pointer to port output register; NB: the 1st "volatile" says the port itself (1 byte) is volatile, the 2nd "volatile" says the *pointer* itself (2 bytes, pointing to the port) is volatile.
  //for PWM output:
  volatile unsigned …
Run Code Online (Sandbox Code Playgroud)

c++ optimization avr arduino

6
推荐指数
1
解决办法
854
查看次数

snprintf与avr-gcc无法正常工作

在调试会话期间,我发现snprintf在使用avr-gcc编译代码时无法按预期工作.示例代码应该简单地将浮点值3999.9f转换为其字符表示形式.

这是一个最小的测试用例:

    int TestSnprintf(void)
    {
       const float inputValue = 3999.9f;
       /* Print with a fixed width of 6 characters (5 numbers and 1 dot).
       The buffer must have a length of 7, because snprintf appends a '\0' at the end. */
       char buf[7U] = {0, 0, 0, 0, 0, 0, 0};
       const uint8_t bufferSize = 7U;
       if(6 != snprintf(buf, bufferSize, "%06.1f", inputValue))
       {
          return -1;
       }
       if( buf[0] != '3'
            || buf[1] != '9'
            || buf[2] …
Run Code Online (Sandbox Code Playgroud)

c avr avr-gcc atmel atmelstudio

6
推荐指数
1
解决办法
499
查看次数

我想继续进行μC编程,但我完全不知道从哪里开始

我一直在考虑"继续"进行MCU编程,但问题是我从未使用过任何微控制器或类似产品.据我所知,AVR和PIC是业余爱好者中最常见的微控制器,显然大多数人建议AVR为像我这样的新手,因为它的"C友好架构"(无论这意味着什么),它的C编译器及其大型业余爱好者社区.AVR或PIC或其他任何东西,对我来说并不重要,我希望能够在Linux上用一个好的编译器编写C代码,并最终能够在我的MCU上添加一个LCD屏幕(只是为了输出基本的ASCII字符,也许在这里和那里画几个像素,单色,没什么大的).我不需要任何复杂或极快或甚至大量的记忆,因为我喜欢有限(但不是太有限)的事情,你需要一些创造力来实现目标.我在互联网上环顾四周,但我发现的大多数页面已经有几十年的历史了,并且/或者没有提出我可以购买的任何好的'包'(这将支持上面提到的内容).这就是为什么我问你,希望你能帮助我一点.:)

谢谢,霍法.

linux microcontroller avr pic

5
推荐指数
1
解决办法
689
查看次数

针对Arduino/AVR的编程语言

除了默认的C++环境之外,哪些编程语言或环境以Arduino或AVR为目标?
PS:我正在使用Mac OS 10.5.

programming-languages avr arduino target

5
推荐指数
2
解决办法
4755
查看次数

简而言之,当微控制器通电时,如何将数据存储在sram中进行初始化?

首先是一些背景.在微小的数据中,数据可以存储在寄存器,sram,eeprom或程序空间中.寄存器和sram是易失性存储,而eeprom和程序空间则不是.(即:未通电时数据停留.)

在c中编程时(使用avr-gcc库),典型代码可能如下所示:

#define F_CPU 8000000UL
#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>

//This data is put in the eeprom
const uint8_t dat_eeprom EEMEM= 0xab;
//This data is put in the program space
const uint8_t dat_pgm_space PROGMEM= 0xcd;
//This data is stored in the sram
uint8_t dat_sram = 0xef;

int main(){
    while(1){
    ;;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译:

avr-gcc -g -mmcu=attiny44 -o test.elf test.c
Run Code Online (Sandbox Code Playgroud)

并从.elf中提取intel .hex:

avr-objcopy -j .text -j .data -O ihex test.elf test.hex
Run Code Online (Sandbox Code Playgroud)

我们得到以下test.hex:

:1000000011C023C022C021C020C01FC01EC01DC0FF
:100010001CC01BC01AC019C018C017C016C015C01C
:1000200014C0CD0011241FBECFE5D1E0DEBFCDBF8F
:1000300010E0A0E6B0E0EAE5F0E002C005900D9225
:10004000A236B107D9F702D006C0DACFCF93DF933B
:0A005000CDB7DEB7FFCFF894FFCF65 …
Run Code Online (Sandbox Code Playgroud)

assembly avr avr-gcc

5
推荐指数
1
解决办法
1088
查看次数

具有多个命令的Sublime Text Build System

首先,我想说我是崇高文本编辑器的新手,我喜欢它.我没有使用JSON的经验,但它看起来并不困难.

我正在尝试编写一个构建系统,它将调用一个bash脚本,将一个makefile移动到我正在工作的目录中并调用makefile,它将使用avr-gcc编译我的c代码然后使用它将其闪存到连接的微控制器上AVRDUDE.

我意识到sublime text 2只能有一个"cmd"对象,所以我尝试从终端模拟器调用一行中的所有东西,它完全符合我的预期.电话是:

checkAVRmakefile.sh $PWD; make PROJECTNAME+=hello install
Run Code Online (Sandbox Code Playgroud)

我的脚本位于我的$ PATH环境变量的目录中,我将它传递给我正在使用的目录,因此它在那里检查makefile,如果它不存在,则从我保留所有目录的目录中复制它我的makefile.然后我调用make并将其命名为I,并调用该项目并安装闪存avr微控制器.

我用崇高做的是这样的:

{
"shell":true,
"cmd":[ "checkAVRmakefile.sh", "$file_path", ";" ,"make","PROJECTNAME+=$file_base_name","install"],
}
Run Code Online (Sandbox Code Playgroud)

这只运行bash脚本,它将makefile放在目录中但不运行make.

有谁看到我哪里出错了?

任何帮助表示赞赏.我也在崇高的论坛上问过类似的问题,但没有人回答.我也在Ubuntu上使用ST2.

linux avr makefile build-system sublimetext2

5
推荐指数
1
解决办法
4621
查看次数

AVR定时器溢出中断不起作用

你好堆栈溢出的人.我的问题是一个看似永远不会执行的中断服务程序(ISR)!以下是我设置的一些信息:我正在闪烁avr attiny85.到目前为止,我只使用main.c和两个模块设置项目的基础:timer和hardwareInit.在定时器模块中,我有一个timer0_init函数,我用它来设置Timer0以使CTC模式在1 ms内溢出.这是功能:

void timer0_init( void )
{
    cli();
    TCCR0B |= 3;    //clock select is divided by 64.
    TCCR0A |= 2;    //sets mode to CTC
    OCR0A = 0x7C;   //sets TOP to 124 so the timer will overflow every 1 ms.    
    TIMSK |= 2;     //Enable overflow interrupt
    sei();          //enable global interrupts
}
Run Code Online (Sandbox Code Playgroud)

设置定时器后,每次计数器溢出时我都会添加一个ISR来增加滴答,这样我就可以跟踪已经过了多长时间等等.

ISR(TIMER0_OVF_vect)
{
    cli();
    //ticks ++;
    PORTB |= ( 1 << PORTB0 );   
    sei();
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我注释掉了滴滴答用器因为它没有工作,并用PORTB |= ( 1 << PORTB0 );简单的LED打开就取而代之,所以如果中断被执行,我会通过证明LED亮起来知道.
不幸的是,我无法让它打开,看不到我错过的东西.(为了证明我1.将LED设置在右侧引脚上,并且2.正在操作正确寄存器中的正确位,我将此声明PORTB |= ( 1 …

c embedded avr interrupt attiny

5
推荐指数
1
解决办法
1844
查看次数