我使用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) 在我的项目中,我希望通过串行端口与由AVR微控制器控制的设备进行通信.在AVR上运行一个定时器,每10ms执行一次循环.循环执行大约2ms,最后它向串口发送消息以请求下一个命令.在我的计算机上运行一个C#windows窗体应用程序,该应用程序应在剩余的8ms内响应此请求,以便AVR具有下一个循环的新命令.我有一个第一个原型运行,可以在大约2-3ms内响应大部分时间,因此应该可以达到所需的性能.问题是,有时(每秒约两次)响应需要更长时间(最多20毫秒)才会导致设备出现故障.
有人知道这个问题的解决方案吗?
波特率为115200kbps,请求为1个字节,响应命令为6个字节.计算机是一个带有i7处理器(4个芯片/ 8个线程)的移动工作站,它或多或少处于空闲状态.
临时解决方案:我将采样时间从10ms更改为50ms.我将不得不进行一些测试,看看性能是否足够好.
我正在某个项目中处理uc ATxmega128A1,但是作为ucontroller的初学者,我想知道关于ucs的此通道事件系统是什么。我引用了一个链接http://www.atmel.com/Images/doc8071.pdf,但没有得到它。
我正在查看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后没有完成?
也许保证在(重新)启用中断后,在下一条指令完成之前不会将中断记入账户?
我使用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
任何人都可以找出我出错的地方.
我试图在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)();**
第二个问题是,它是否退出微控制器中代码的执行.
AVR微控制器中的Beatwean X,Y和Z寄存器有什么区别。它们每个适合C编译器?编译器在哪里存储堆指针,堆栈指针,帧指针?该寄存器是否具有相同的功能或在不同的空间(例如EEPROM,RAM)中提供寻址。
我正在研究一个项目,它有两个按钮,每个按钮通过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) 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) 有以下结构:
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结构的布局是相同的。我想确保这在任何情况下都不会中断,并且内存布局是相同的,而不取决于部分。