标签: atmega32

如何计算 ADC 读数的平均值?

目的是将最新的 10 个 ADC 读数存储在数组中,然后计算它们的平均值以供其他地方使用。每次更新时都会删除最旧的。

关于 LED 时序,如果 ADC 读数在如下所示的范围内,则必须将时序从 1s 切换到 0.25s,如何正确实现?我知道我的方法有效,但可以做得更好。至于 LED,如果按下开关,它们必须改变模式,如您所见,它们确实这样做,但我再次确信可以用另一种更简单的方式来完成!

下面是我的代码,我也确信有很多错误和足够的优化空间,我会很乐意接受这一切!

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>

#include <avr/io.h>
#include <avr/interrupt.h>
unsigned int timecount0;


unsigned int adc_reading;

volatile uint32_t timing = 1;
volatile uint32_t accumulator = 0;
volatile uint16_t average = 0;
volatile uint16_t samples = 0;


#define LED_RED PORTB = ((PORTB & ~0b00001110)|(0b00000010 & 0b00001110))
#define LED_GREEN PORTB = ((PORTB & ~0b00001110)|(0b00001000 & 0b00001110))
#define LED_BLUE PORTB = ((PORTB & ~0b00001110)|(0b00000100 & 0b00001110))
#define …
Run Code Online (Sandbox Code Playgroud)

c avr arduino interrupt atmega32

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

为什么我在 proteus 中收到此错误:“PC=0x002A 处的操作码 0xFFFF 无效”

我用汇编语言为 avr atmega328P 编写了这段代码。它使用按钮打开和关闭 LED,但在 proteus 中我收到此错误:

PC=0x002A 处的无效操作码 0xFFFF

这是我的代码:

.INCLUDE "M328Pdef.inc"


ldi r16,HIGH(RAMEND)
out SPH, R16
ldi r16,LOW(RAMEND)
out SPL, R16

start:
ldi r16,0xFF
out DDRB,r16
ldi r17,0x00
out DDRD,r17
ldi r21,0x00
ldi r23,0x01

Forever:
in r20,PIND
cp r20,r21
BREQ ledon
cp r20,r23
BREQ ledoff
rjmp Forever


ledon:
ldi r22,0x01
out PORTB,r22 
ret

ledoff:
ldi r24,0x00
out PORTB,r24
ret

Run Code Online (Sandbox Code Playgroud)

有人有解决办法吗?

microcontroller assembly avr atmega32

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

标签 统计

atmega32 ×2

avr ×2

arduino ×1

assembly ×1

c ×1

interrupt ×1

microcontroller ×1