标签: avr

AVR从定时器中断内运行长代码

我有一些代码需要每2分钟运行一次,看起来很简单.问题似乎是从计时器中触发一个长时间运行的进程导致计时器摇摆不定?有什么建议.

我的C知识不是很好,所以请帮我解决一些基本想法.MCU是Atmel Mega128L

长时间运行的过程是通过Telit GSM设备(通过UART1)的http呼叫,这本身很好用,但需要在主循环中运行,因为它需要监视其他进程.

avr atmega timer avr-gcc

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

eclipse无法解决所有包含问题

我正在使用eclipse中的avr项目并包含编译器提供的文件.Eclipse识别代码中的包含(即#include没有问号),但它不解析包含文件中的定义,即PINA不被识别为内存地址.

我试图将include目录添加为Paths和Symbols中的库路径.我试图将它添加为构建设置的库路径.两个人都没有工作.

我正在使用Eclipse Indigo和ImageCraft编译器.此外,在项目中,我已将imagecraft的include目录作为链接(以启用搜索).

有任何想法吗?

eclipse avr

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

AVR Studio 5无法连接到任何程序员

我正在尝试使用AVR Studio 5使用基本的hello world代码对Atxmega64a1进行编程.我使用64位win7.我将芯片插入STK600以尝试编程.当我进入工具> AVR编程并选择工具时,我看到两个选项:模拟器和STK600(后面有一个长序列号).我将工具设置为STK600并选择正确的设备,将接口切换到JTAG,然后点击"应用"

AVR Studio冻结了片刻并说:

"无法连接到工具STK600(6&33ECC3F5&0&4)",具有以下详细信息:时间戳:2012-01-19 20:04:38.771严重性:错误ComponentId:20000 StatusCode:0

无法连接到工具上下文:'Atmel.VsIde.AvrStudio.Services.TargetService.TCF.Internal.Services.Remote.ToolProxy + ToolContext'.

我点击接近,再过几秒钟后得到第二个错误:

"无法获得JTAG菊花链设置." 具有以下详细信息:时间戳:2012-01-19 20:07:59.057严重性:错误ComponentId:20000 StatusCode:0

无法连接到工具上下文:'Atmel.VsIde.AvrStudio.Services.TargetService.TCF.Internal.Services.Remote.ToolProxy + ToolContext'.

这不是这个板子,因为它可以在朋友的电脑上运行,而且在使用JTAGICE MKII甚至Dragon时也会遇到同样的错误.知道它可能是什么?我已经尝试卸载并重新安装绝对一切.

avr

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

使用Arduino作为常规AVR

我打算用ATmega做一个项目(由于我大学的限制,我不能直接使用Arduino).但我真的想使用Arduino的IDE,串行监视器,使用Processing绘制图形以进行调试.我可以将常规的ATmega代码转储到Arduino中并使用串行监视器进行调试吗?

我可以像任何其他正常的AVR开发板一样使用Arduino Uno板,这样我就可以充分利用这两个世界.我用Google搜索了,但我得不到我需要的答案.

avr arduino

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

附加到C ++中的字节数组

我在C ++中有两个数组,我想在另一个数组的末尾附加一个:

char byte1[] = {0x00};
char byte2[] = {0x01};
Run Code Online (Sandbox Code Playgroud)

附加这两个应产生{0x00,0x01}。我该怎么做?使用System.arraycopy()在Java中足够简单,但是当我为微控制器编码时,我不确定哪个库可以帮助我在C ++ / C中完成此任务。

c++ avr

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

错误:尝试使用中毒的“ SIG_OUTPUT_COMPARE0A”

我正在为atmega168a编写C代码。我attempt to use poisoned "SIG_OUTPUT_COMPARE0Aattempt to use poisoned "SIG_OUTPUT_COMPARE0B我编译下面的代码错误。但是我ISRhttp://www.protostack.com/blog/2010/09/timer-interrupts-on-an-atmega168/上看到了类似的功能用法,如果有人可以告诉我我做错了什么,我将不胜感激。我正在使用atmel studio 6.0及其gcc在Windows 7 pc上编译代码。

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


volatile int new_msg;
volatile int new_msg_available = 0;
volatile int message = 0xFFFF;
int main(void)
{
    DDRB = 0xFF;
    TIMSK0 = _BV(OCIE0A) | _BV(OCIE0B);  // Enable Interrupt TimerCounter0 Compare Match A & B   // #define OCIE0A  1... (1<<1);
    TCCR0A = _BV(WGM01);  // Mode = CTC ... #define WGM01   1 ... mode 2
    TCCR0B …
Run Code Online (Sandbox Code Playgroud)

c gcc avr atmega atmel

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

如何在更少的内存中执行大代码?

我怀疑,在所有微控制器中,闪存更多是ram(例如:atmega16它是16k,但RAM只有1 Kb)..

那么,如何执行代码,CPU是否直接从Flash本身执行,如果是,那么是否使用了给出的那个小RAM.

ram microcontroller avr atmel atmega16

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

多个定义 - GCC伪造错误

我有一个头文件lcd.h(缩短):

#pragma once
// ...
const uint8_t LCD_ROW_ADDR[] = {0x00, 0x40, 0x14, 0x54};
// ... other prototypes and macros...
Run Code Online (Sandbox Code Playgroud)

以及使用lcd.c此变量的文件:

#include <stdbool.h>
#include <stdint.h>
// ...

#include "lcd.h"

// ...

/** Set cursor position */
void lcd_xy(const uint8_t x, const uint8_t y)
{
    lcd_set_addr(LCD_ROW_ADDR[y] + (x));
}
Run Code Online (Sandbox Code Playgroud)

包括我 lcd.hmain.c,并lcd.c分别在使用makefile编译.

我收到这个错误:"LCD_ROW_ADDR'的多重定义"

avr-gcc -std=gnu99 -mmcu=atmega328p -DF_CPU=16000000UL -I. -Ilib/ -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wno-main -Wno-strict-prototypes -Wno-comment -g2 -Wextra -Wfatal-errors -ffunction-sections -fdata-sections -Wl,--gc-sections -Wl,--relax …
Run Code Online (Sandbox Code Playgroud)

c gcc avr avr-gcc

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

在ISR结束时使用reti()

我有这个代码不起作用的问题.. ISR正在工作..我在其他代码中测试了它的闪烁..

但是要将x ++放在ISR中并在main()函数中读取X,它永远不会闪烁...

我不熟悉asm我认为这是编译器optomization所以我把变量挥发,但它没有工作..

#define F_CPU 16000000UL

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

volatile static uint8_t x = 1;

ISR( TIMER0_OVF_vect )
{
    x++;
    reti();
}

int main(void)
{

    /* Replace with your application code */
    DDRB = DDRB | 0B00100000 ; // pinMode(13,OUTPUT);
    TCCR0A = 0;
    TCCR0B = (1 << CS00 ) | (1 << CS02 ); //1024 prescaler
    TIMSK0 |= 1 << TOIE0 ;
    sei();

    while (1) 
    {

        if (x  >= 61) //never happens ? 
        {
            PORTB …
Run Code Online (Sandbox Code Playgroud)

c microcontroller avr isr atmelstudio

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

在函数中使用指针的临时值

我从微芯片上看过AES的例子.他们编写以下代码段:

bool AES_encrypt(uint8_t * plaintext, uint8_t * ciphertext, uint8_t * key)
{
    bool encrypt_ok;

    uint8_t * temp_key = key;
    for(uint8_t i = 0; i < AES_BLOCK_LENGTH; i++){
        AES.KEY =  *(temp_key++);
}
Run Code Online (Sandbox Code Playgroud)

为什么他们将指针复制到临时变量中?我用Atmel工作室和反汇编程序以及这两种情况进行了验证

bool AES_encrypt(uint8_t * plaintext, uint8_t * ciphertext, uint8_t * key)
{
    bool encrypt_ok;

    /* Load key into AES key memory. */
    uint8_t * temp_key = key;
    for(uint8_t i = 0; i < AES_BLOCK_LENGTH; i++){
        AES.KEY =  *(temp_key++);
}   

bool AES_encrypt(uint8_t * plaintext, uint8_t * ciphertext, uint8_t * key) …
Run Code Online (Sandbox Code Playgroud)

c assembly avr

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

标签 统计

avr ×10

c ×4

atmega ×2

atmel ×2

avr-gcc ×2

gcc ×2

microcontroller ×2

arduino ×1

assembly ×1

atmega16 ×1

atmelstudio ×1

c++ ×1

eclipse ×1

isr ×1

ram ×1

timer ×1