标签: avr

当闪烁其他人时,无法按住某些LED:ON:ON

我使用AVR作为微控制器,使用ATMEGA8作为处理器(在微控制器内部).具有微控制器的板有4个LED.我能够刻录程序并点亮LED.但我无法达到特定的目的.

L1 L2  L3 L4
Run Code Online (Sandbox Code Playgroud)

这些是4个LED.在第一轮中,每个LED在3秒的间隙后亮起.最后一个LED(L4)在第一轮之后保持点亮.当第三轮开始时,每个LED以3秒的间隙点亮,当L4也是L3时,L3保持点亮照明,它继续......直到L1.

L1 L2 L3 L4
         On
      On On
   On On On
On On On On
Run Code Online (Sandbox Code Playgroud)

但我无法做到这一点.因为我设置一个LED ON其他关闭.我甚至尝试添加一个小的时间间隔为10毫秒.我该怎么做呢 ?这就是我现在所拥有的:

    #include<avr/io.h>
    #include<util/delay.h>
    DDRB = 0xFF; // input
 //PORTB = 0xFF;

    // ob00011110 --> on all --> binary

    int i=0;

    while(i<1) {
      PORTB = 0b00010000; // first led on
      _delay_ms(3000);
      PORTB = 0b00001000; // second led on
      _delay_ms(3000);
      PORTB = 0b00000100; // third on
      _delay_ms(3000);
      PORTB = 0b00000010; // fourth on
      _delay_ms(3000);
      i += …
Run Code Online (Sandbox Code Playgroud)

c microcontroller avr atmega avr-gcc

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

C#:在一定时间内响应串行事件

在我的项目中,我希望通过串行端口与由AVR微控制器控制的设备进行通信.在AVR上运行一个定时器,每10ms执行一次循环.循环执行大约2ms,最后它向串口发送消息以请求下一个命令.在我的计算机上运行一个C#windows窗体应用程序,该应用程序应在剩余的8ms内响应此请求,以便AVR具有下一个循环的新命令.我有一个第一个原型运行,可以在大约2-3ms内响应大部分时间,因此应该可以达到所需的性能.问题是,有时(每秒约两次)响应需要更长时间(最多20毫秒)才会导致设备出现故障.

有人知道这个问题的解决方案吗?

波特率为115200kbps,请求为1个字节,响应命令为6个字节.计算机是一个带有i7处理器(4个芯片/ 8个线程)的移动工作站,它或多或少处于空闲状态.

临时解决方案:我将采样时间从10ms更改为50ms.我将不得不进行一些测试,看看性能是否足够好.

c# avr serial-port

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

什么是频道事件系统?

我正在某个项目中处理uc ATxmega128A1,但是作为ucontroller的初学者,我想知道关于ucs的此通道事件系统是什么。我引用了一个链接http://www.atmel.com/Images/doc8071.pdf,但没有得到它。

microcontroller events avr

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

Avr汇编编程:堆栈上的原子分配

我正在查看avr-gcc小型C程序的程序集生成代码.以下应该在堆栈上分配一个100字节的本地数组.

extern void foo(char [], int);

void bar()
{
  char t[100];
  foo(t,100);
}
Run Code Online (Sandbox Code Playgroud)

当然它通过从堆栈指针中减去100来实现.

据我所知,由于avr是8位机器,更改16位堆栈指针需要2个步骤(更改SPH和SPL).此外,通过禁用中断来提供一些原子性是个好主意.它由序列完成

in r28,__SP_L__
in r29,__SP_H__           ; get SP
subi r28,100              ; new SP in R29:R28 = OLD -100 
sbc r29,__zero_reg__
in __tmp_reg__,__SREG__   ; save status to r0
cli                       ; disable interrupts
out __SP_H__,r29          ; update SPH
out __SREG__,__tmp_reg__  ; restore status   -- why here ?
out __SP_L__,r28          ; update SPL
Run Code Online (Sandbox Code Playgroud)

我还不相信恢复状态指令的位置.

为什么在更新SPL后没有完成?

也许保证在(重新)启用中断后,在下一条指令完成之前不会将中断记入账户?

assembly avr interrupt

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

8位MCU中的32位可变移位

我使用32位变量将4个8位值存储到一个32位值中.

32_bit_buf[0]= cmd[9]<<16 | cmd[10]<<8| cmd[11] <<0;
Run Code Online (Sandbox Code Playgroud)

cmd 是带有数据的unsigned char类型

cmd [9]=AA
cmd[10]=BB
cmd[11]=CC
Run Code Online (Sandbox Code Playgroud)

但是,当打印32位变量时,我得到了0xFFFFBBCC.

架构 - 8位AVR Xmega

语言-C

任何人都可以找出我出错的地方.

c avr

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

((void(*)(void))0)()是退出函数?

我试图在Atmel AVR微控制器上编写自己的启动加载程序.我已经从github引用了一个代码库.我要感谢ZEVERO的代码库

在初级阶段,我理解代码库.但是在第224行,我发现了一行 参考代码

**if (pgm_read_word(0) != 0xFFFF) ((void(*)(void))0)();   //EXIT BOOTLOADER**
Run Code Online (Sandbox Code Playgroud)

我理解if条件部分,但是当我试图理解真正的陈述部分时,即

**((void(*)(void))0)();**

代码编写者给出的解释是 // EXIT BOOTLOADER

我的第一个问题是这个复杂宣言的含义是什么 **((void(*)(void))0)();**

第二个问题是,它是否退出微控制器中代码的执行.

c avr atmel bootloader

0
推荐指数
2
解决办法
569
查看次数

AVR XYZ寄存器

AVR微控制器中的Beatwean X,Y和Z寄存器有什么区别。它们每个适合C编译器?编译器在哪里存储堆指针,堆栈指针,帧指针?该寄存器是否具有相同的功能或在不同的空间(例如EEPROM,RAM)中提供寻址。

compiler-construction ram microcontroller avr

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

按下两个按钮时试图让电机停止

我正在研究一个项目,它有两个按钮,每个按钮通过H桥将电机转向一个方向(时钟/反时钟),但是当我点击两个按钮时,我试图让电机停止按按钮.一切都工作正常,但我不能得到两个按钮部分...

这是我的尝试:

#include "motor.h"
#include <avr/io.h>
#include <util/delay.h>
int flag=0;

int main(void)
{
    DDRD &= ~(1<<PD2);
    DDRD &= ~(1<<PD3);
    DDRB |= (1<<PB0);
    DDRB |= (1<<PB1);
    PORTB &= ~(1<<PB0);
    PORTB &= ~(1<<PB1);

    while(1)
    {
        if (PIND & (1<<PD2))
        {
            flag = 1;
        }           
        else if (PIND & (1<<PD3))
        {
            flag = 2;
        }           
        else if (PIND & (1<<PD3 ) && (1<<PD2))
        {
            flag = 3;
        }

        switch (flag)
        {
            case 1:
                 DC_MOTOR_PORT |= (1<<DC_MOTOR_PIN1);
                 DC_MOTOR_PORT &= ~(1<<DC_MOTOR_PIN2);
                 break;

            case 2:
                 DC_MOTOR_PORT …
Run Code Online (Sandbox Code Playgroud)

c embedded microcontroller avr

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

C macro compiler warnings

I've defined a macro, using input from a previous question I asked here. The macro is intended to either set, clear, or check a GPIO pins state. The macro works as expected however a problem shows up when compiling. I get compiler warnings anywhere it's used:

Warning right-hand operand of comma expression has no effect

when I use the macro like this:

#define ON  1
#define OFF 2
#define ENA 3
#define OUT_3(x) (x==ON) ? (PORTJ.OUTSET=PIN2_bm) : (x==OFF) ? …
Run Code Online (Sandbox Code Playgroud)

c avr avr-gcc

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

在AVR的不同内存部分中进行结构打包

有以下结构:

typedef struct {
    uint8_t val1;
    uint16_t val2;
}some_config_type;

some_config_type EEMEM config = {
    .val1 = 20,
    .val2 = 2000
};
Run Code Online (Sandbox Code Playgroud)

该配置存储在eeprom内存中,我想从中加载它。我不确定avr gcc或C中是否有共同的规则,当我使用eeprom_read_block复制到另一个内存部分ram时,它保证了bot结构的布局是相同的。我想确保这在任何情况下都不会中断,并且内存布局是相同的,而不取决于部分。

c embedded struct avr alignment

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