AVR ATMEGA32A-PU Низкое выходное напряжение
Я только начал пытаться использовать AVR напрямую, а не использовать панель разработки, как Arduino Uno. Проблема, которую я вижу, заключается в том, что, когда я пытаюсь подключить несколько светодиодов к выходным контактам, многие из них читают очень низкие напряжения намного меньше, чем ожидаемое 5В.
Я использую код на кристалле с частотой 14 МГц. Я установил предохранители на AVR: lfuse: 0xFF hfuse: 0x89 Кристалл подключается к контактам XTAL1 и XTAL2. Каждый вывод кристалла также подключается к заземлению через керамический конденсатор 22 пФ.
Я подключил электролитический колпачок.1uF через VCC и GND, а другой через AVCC и GND с катодом (-), подключенным к клемме GND. На клеммах источника также есть электролитическая крышка 10 мкФ.
Соединения с ATMEGA32A следующие: PB0-7: ОТКРЫТЫЙ СБРОС: резистор 10 К к VCC VCC: 5 В GND: GND XTAL1: Кристалл XTAL2: Кристалл PD0-7: резистор 510 Ом к светодиоду к GND PC0-7: резистор 510 Ом LED на GND AVCC: 5 В GND: GND AREF: 5 В (пробовал также ОТКРЫТЬ. Без изменений) PA0-7: ОТКРЫТО
PORTD, кажется, работает просто отлично. Я получаю полное падение напряжения 4,6 В от AVR на землю на каждом из этих контактов. PORTC, однако, не работает должным образом. Когда я перехожу от C0 и выше, падение напряжения на каждом из этих контактов уменьшается, когда я двигаюсь вверх по PORTC. PC0 дает почти полный 4,6 В. Это постепенно уменьшается, когда я добираюсь до C7, который измеряет 2.2V.
Есть ли какая-то особая причина для этого? Я пропускаю какой-либо тип соединения, необходимый для 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;
}
Makefile
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
1 ответ
Похоже, мне нужно только задать вопрос, прежде чем я, наконец, найду ответ самостоятельно после нескольких дней поиска. Как это часто бывает, ответ был в таблице. Проблема была в предохранителях. По умолчанию включен интерфейс JTAG, который является частью PORTC. Вот почему PORTC не работал правильно. Я обновил биты HFUSE с 0x89 до 0xC9. Это отключило интерфейс JTAG, и PORTC действовал как обычные порты ввода-вывода.