2016-05-15 23 views
0

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 

Antwort

1

Es scheint, dass ich nur die Frage stellen müssen, bevor ich endlich die Antwort auf meinem eigenen nach Tagen des Suchens finden. Wie es oft der Fall ist, war die Antwort im Datenblatt. Das Problem waren die Sicherungseinsätze. Standardmäßig ist die JTAG-Schnittstelle aktiviert, die Teil von PORTC ist. Deshalb funktionierte PORTC nicht richtig. Ich habe die HFUSE-Bits von 0x89 auf 0xC9 aktualisiert. Dadurch wurde die JTAG-Schnittstelle deaktiviert und PORTC funktionierte wie normale IO-Ports.