Ich habe gerade angefangen zu versuchen, AVRs direkt zu verwenden, anstatt ein Dev-Board wie ein Arduino Uno zu verwenden. Das Problem, das ich sehe, ist, wenn ich versuche, eine Reihe von LEDs an den Ausgangspins zu betreiben, von denen viele sehr niedrige Spannungen viel weniger als die erwarteten 5V lesen.AVR ATMEGA32A-PU Niedrige Ausgangsspannung
Ich führe den Code von einem 14MHz-Kristall. Ich habe die Sicherungen am AVR auf eingestellt. Lfuse: 0xFF hfuse: 0x89 Der Kristall verbindet sich mit Pins XTAL1 & XTAL2. Jede Leitung des Kristalls ist auch über einen 22pF-Keramikkondensator mit GND verbunden.
Ich habe eine .1uF Elektrolytkappe über VCC und GND und eine andere über AVCC und GND mit der Kathode (-) verbunden, die mit dem GND Anschluss verbunden ist. Es gibt auch eine 10uF Elektrolytkappe über meinen Source-Terminals.
Die Verbindungen zu dem ATMEGA32A sind wie folgt: PB0-7: OPEN RESET: 10K-Widerstand mit VCC VCC: 5V GND: GND XTAL1: Kristall XTAL2: Kristall PD0-7: 510-Ohm-Widerstand PC0-7 zu auf GND LED: 510 Ohm Widerstand zu LED GND AVCC: 5V GND: GND AREF: 5V (Versuchte dieses OPEN auch Nein geändert.) PA0-7: OPEN
PORTD scheint um gut zu funktionieren. Ich bekomme den vollen 4,6V-Drop vom AVR auf jeden dieser Pins. PORTC funktioniert jedoch nicht richtig. Wenn ich von C0 und höher gehe, nimmt der Spannungsabfall von jedem dieser Pins ab, wenn ich nach PORTC gehe. PC0 liefert fast die volle 4,6V. Es nimmt allmählich ab, wenn ich zu C7 komme, das 2,2 V misst.
Gibt es einen besonderen Grund dafür? Fehle ich irgendeine Art von Verbindung, die der AVR benötigt? Mein sehr einfacher Code und Makefile sind unten.
Haupt
#include <avr/io.h>
void setup();
void setup()
{
DDRD=0XFF;
PORTD = 0xff;
DDRC |= 0XfF;
PORTC = 0xff;
}
int main()
{
setup();
while(1)
{
}
return 0;
}
Make-Datei
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 [email protected]
# 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