AVR ATMEGA32A-PU 低输出电压

AVR ATMEGA32A-PU Low Output voltage

我刚开始尝试直接使用 AVR 而不是使用像 Arduino Uno 这样的开发板。我看到的问题是当我尝试在输出引脚上驱动一堆 LED 时,其中许多读取的电压非常低,远低于预期的 5V。

我运行码掉了一个14MHzcrystal。我已将 AVR 上的保险丝设置为: 保险丝:0xFF 保险丝:0x89 crystal 连接到引脚 XTAL1 和 XTAL2。 crystal 的每根引线还通过一个 22pF 陶瓷电容器连接到 GND。

我在 VCC 和 GND 之间连接了一个 .1uF 电解电容,在 AVCC 和 GND 之间连接了另一个电解电容,阴极 (-) 连接到 GND 端子。我的源端子上还有一个 10uF 电解电容。

与ATMEGA32A的连接如下: PB0-7:打开 复位:10K 电阻到 VCC 电源电压:5V 接地:接地 XTAL1:Crystal XTAL2:Crystal PD0-7:510 欧姆电阻到 LED 到 GND PC0-7:510 欧姆电阻到 LED 到 GND AVCC : 5V 接地:接地 AREF:5V(也试过这个 OPEN。没有改变) PA0-7:打开

PORTD 似乎工作得很好。我在每个引脚上都得到了从 AVR 到地的完整 4.6V 压降。但是,PORTC 无法正常工作。当我从 C0 向上移动时,每个引脚的电压降随着我向上移动 PORTC 而减小。 PC0 提供几乎完整的 4.6V。当我到达测量 2.2V 的 C7 时,它逐渐减小。

发生这种情况有什么特别的原因吗?我是否缺少 AVR 需要的某种连接类型?下面是我非常简单的代码和 makefile。

主要

#include <avr/io.h>
void setup();
void setup()
{
  DDRD=0XFF;
  PORTD = 0xff;
  DDRC |= 0XfF;
  PORTC = 0xff;
}
int main()
{
  setup();
  while(1)
  {
  }
  return 0;
}

生成文件

MCU = atmega32
# Target file name (without extension).
TARGET = main
AVRDUDE_PROGRAMMER = avrisp
AVRDUDE_PORT = COM3
OPT = s
FORMAT = ihex
SRC = $(TARGET).c
#SRC += TimerOne.cpp
EXTRAINCDIRS = 
CLOCK = 14745600
CPU = F_CPU=$(CLOCK)


# Optional compiler flags.
#  -g:        generate debugging information (for GDB, or for COFF conversion)
#  -O*:       optimization level
#  -f...:     tuning, see gcc manual and avr-libc documentation
#  -Wall...:  warning level
#  -Wa,...:   tell GCC to pass this to the assembler.
#    -ahlms:  create assembler listing
CFLAGS = -g -O$(OPT) \
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall \
$(patsubst %,-I%,$(EXTRAINCDIRS))

# -lm = math library
LDFLAGS = -lm
AVRDUDE = avrdude
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -b 19200
AVRDUDE_FLAGS += -v
# ---------------------------------------------------------------------------

# Define directories, if needed.
DIRAVR = c:/winavr
DIRAVRBIN = $(DIRAVR)/bin
DIRAVRUTILS = $(DIRAVR)/utils/bin
DIRINC = .
DIRLIB = $(DIRAVR)/avr/lib

# Define programs and commands.
CC = avr-g++ -D$(CPU) -D$(MCU)
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
REMOVE = rm -f
COPY = cp
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
ELFSIZE = $(SIZE) -AC --mcu=$(MCU) $(TARGET).elf

# Define all object files.
OBJ = $(patsubst src%,obj$(VERSION)%,$(patsubst %.c,%.o,$(SRC)))
# Define all listing files.
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)

# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)

# Default target: make program!
all: main.hex

main.hex: main.elf
    $(OBJCOPY) -O $(FORMAT) -R .eeprom main.elf main.hex

main.elf:  main.o
    $(CC) $(ALL_CFLAGS) main.o --output main.elf $(LDFLAGS)

main.o: 
    @echo
    @echo $(MSG_COMPILING) $<
    $(CC) -c $(ALL_CFLAGS) main.c -o $@

# Program the device.  
program: $(TARGET).hex
    $(AVRDUDE) $(AVRDUDE_FLAGS) -U flash:w:$(TARGET).hex

# Flash the device
flash:
    $(AVRDUDE) $(AVRDUDE_FLAGS) -U lfuse:w:0xFF:m -U hfuse:w:0x89:m

# Target: clean project.
clean: begin clean_list finished end

clean_list :
    @echo
    @echo $(MSG_CLEANING)
    $(REMOVE) $(TARGET).hex
    $(REMOVE) $(TARGET).eep
    $(REMOVE) $(TARGET).obj
    $(REMOVE) $(TARGET).cof
    $(REMOVE) $(TARGET).elf
    $(REMOVE) $(TARGET).map
    $(REMOVE) $(TARGET).obj
    $(REMOVE) $(TARGET).a90
    $(REMOVE) $(TARGET).sym
    $(REMOVE) $(TARGET).lnk
    $(REMOVE) $(TARGET).lss
    $(REMOVE) $(TARGET).o

# Listing of phony targets.
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \
    clean clean_list program

看来我只需要提出问题,经过几天的搜索,我终于自己找到了答案。通常情况下,答案就在数据表中。问题是保险丝位。默认情况下,启用 JTAG 接口,它是 PORTC 的一部分。这就是 PORTC 无法正常工作的原因。我将 HFUSE 位从 0x89 更新为 0xC9。这禁用了 JTAG 接口和 PORTC 就像普通的 IO 端口一样。