Forum: Mikrocontroller und Digitale Elektronik LED an AVR ATmega16 bleibt dunkel


von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!


Vor Jahren hatte ich mit den AVR-uC einiges gemacht. Für ein kleines 
Projekt versuche ich mich gerade wieder einzufinden und irgendwie klappt 
gar nichts mehr. Zum Einstieg wollte ich eine LED blinken lassen. Am 
Atmega16 mit 16MHz getaktet habe ich an PC3 eine LED gegen GND 
angeschlossen und den ISP-Programmer.

Mit dem avrdude aus der aktuellen Version von WinAVR habe ich aus dem 
Programmer's Notepad heraus folgenden Source Code erfolgreich auf den 
Controller schreiben können:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#define F_CPU 16000000UL
4
5
int main(void)
6
{
7
    DDRC = 0xff;          /* define all pins of port C as output pins */
8
    while(1)              /* loop forever */
9
    {
10
        _delay_ms(1000);  /* wait a second */
11
        PORTC = 0xff;     /* turn all output pins on */
12
        _delay_ms(1000);  /* wait again a second */
13
        PORTC = 0x00;     /* turn all output pins off */
14
    }
15
    return 0;             /* never achieved */
16
}

Der Sourcecode ließ sich fehlerfrei compilieren und übertragen. Auch das 
verifizieren nach dem programmieren des Controllers hat geklappt. Dann 
tut sich aber nichts mehr, die rote LED an PC3 bleibt die ganze Zeit 
aus.

Folgendes habe ich schon überprüft bzw. ausprobiert:
* Rote LED verpolt? Nein, nicht verpolt.
* Vorwiderstand der roten LED defekt? Nein, nicht defekt.
* Vorwiderstand der roten LED zu groß dimensioniert? Nein, Tausch gegen 
820Ohm-Widerstand brachte keine Änderung.
* Pullup-Widerstand am Reset-Eingang defekt? Nein, nicht defekt.
* Pin des Controllers defekt? LED auch an anderen Pins des Ports 
erfolglos getestet.
* Verkabelung richtig? Verkabelung überprüft und keinen Fehler gefunden.

Den Controller habe ich neu gekauft und nur mit dem Programmer's Notepad 
programmiert, also keine Veränderung an Fuse-Bits oder Ähnlichem. Ich 
verstehe nicht, warum sich an der LED nichts tut. Habe ich einen Fehler 
gemacht oder kann ich noch etwas anderes ausprobieren um den Fehler zu 
finden? Hier noch mein Makefile (gekürzte Version!):
1
MCU = atmega16
2
F_CPU = 16000000
3
FORMAT = ihex
4
TARGET = test
5
OBJDIR = .
6
SRC = $(TARGET).c
7
CPPSRC = 
8
ASRC =
9
OPT = s
10
DEBUG = dwarf-2
11
EXTRAINCDIRS = 
12
CSTANDARD = -std=gnu99
13
CDEFS = -DF_CPU=$(F_CPU)UL
14
ADEFS = -DF_CPU=$(F_CPU)
15
CPPDEFS = -DF_CPU=$(F_CPU)UL
16
AVRDUDE_PROGRAMMER = ponyser
17
AVRDUDE_PORT = com3
18
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
19
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
20
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
21
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
22
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
23
program: $(TARGET).hex $(TARGET).eep $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)


Alex

von holger (Gast)


Lesenswert?

JTAG Fuse abschalten.

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Ist vielleicht JTAG aktiviert beim Mega16 ?

von Martin e. C. (eduardo)


Lesenswert?

hast du ein anderes Port probiert? z.B Port A, oder B, in C ist JTAG 
Fuse kann daran liegen.

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Wieso 100 kOhm als Vorwiderstand ? ist das nicht etwas heftig ? bleibt 
dann noch genug Strom für die LED ?

Nimm mal 300 Ohm für knappe 10 mA bei 1,9 Volt LED.

von Martin e. C. (eduardo)


Lesenswert?

Dennis Heynlein schrieb:
> Wieso 100 kOhm als Vorwiderstand ? ist das nicht etwas heftig ? bleibt
> dann noch genug Strom für die LED ?

Alex schrieb:
> Tausch gegen
> 820Ohm-Widerstand brachte keine Änderung.

Wenn da der Fehler wäre dann sollte mit 820 Ohm brennen

von Alex (Gast)


Lesenswert?

Hallo!


Bin wie gesagt total aus der Übung, darum vielen Dank für die schnelle 
Hilfe! Habe mir hier (http://www.mikrocontroller.net/articles/AVR_Fuses) 
das mit den Fuse-Bits noch mal angeschaut und mit dem online Burn-O-Mat 
(http://avr8-burn-o-mat.aaabbb.de/avr8_burn_o_mat_avrdude_gui_online.html) 
und Engbedded AVR Fuse (http://www.engbedded.com/fusecalc/) 
herausgefunden das ich dem avrdude folgende Option mitgeben muss:
1
-U hfuse:w:0xD9:m
Stimmt das so?


Alex

von Tim (Gast)


Lesenswert?

bei 0,03mA kann da nichts leuchten...

von Martin e. C. (eduardo)


Angehängte Dateien:

Lesenswert?

Einfach nur der JTAG Fuse abschalten, also Hacken weg. Hast du mi andere 
Port probiert??

von Karl H. (kbuchegg)


Lesenswert?

Alex schrieb:
> Hallo!
>
>
> Bin wie gesagt total aus der Übung, darum vielen Dank für die schnelle
> Hilfe! Habe mir hier (http://www.mikrocontroller.net/articles/AVR_Fuses)
> das mit den Fuse-Bits noch mal angeschaut und mit dem online Burn-O-Mat
> (http://avr8-burn-o-mat.aaabbb.de/avr8_burn_o_mat_avrdude_gui_online.html)
> und Engbedded AVR Fuse (http://www.engbedded.com/fusecalc/)
> herausgefunden das ich dem avrdude folgende Option mitgeben muss:
>
1
> -U hfuse:w:0xD9:m
2
>
> Stimmt das so?

LIes die momentanen Fuse BIts vom Prozessor aus, gib das in einen 
Fuse-Calculator ein. Dort drehst du dann die JTAGEN Fuse um und lässt 
dir vom Fuse-Calculator das neue Steuerbyte geben.

Aber solange du ausser Übung bist, lies um Himmels willen die Fuse vom 
Prozessor aus!

Wenn irgendwie geht, nimm ein Tool, bei dem du nicht selber die Bytes 
angeben musst, sondern eines das dir das alles abnimmt. Du setzt nur 
noch die Häkchen. Aber auch dort: vorher auslesen!

von ... (Gast)


Lesenswert?

AVCC sollte man aber auch noch beschalten. AGND fehlt im Schaltplan 
ebenfalls, ist aber zumindest auf dem Hackbrett angeschlossen.

von Martin e. C. (eduardo)


Angehängte Dateien:

Lesenswert?

hast du dein Schaltung kontrolliert?? AVCC und AGND sollte man auch 
anschliessen.

von josef (Gast)


Lesenswert?

Du sollst nich die LED gegen Masse betreiben, da in diesem Fall der 
Strom vom hochohmigen pull-up begrenzt wird.

Anode der LED an +5V. An Kathode den Widerstand anschließen und den R 
ans PORT legen. Dann fließt der Strom in den AVR hinein.

von Karl H. (kbuchegg)


Lesenswert?

josef schrieb:
> Du sollst nich die LED gegen Masse betreiben, da in diesem Fall der
> Strom vom hochohmigen pull-up begrenzt wird.

Das war mal.
Beim Mega16 ist das Wurscht.
Aus historischen Gründen, macht man das auch heute noch so, auch wenns 
nicht mehr notwendig ist. Brauchtum eben.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Alex schrieb:

> #define F_CPU 16000000UL

Da Du bisher keine Fuses umgestellt hast, läuft der ATmega mit dem 
internen Oszillator. Ich bezweifle, dass dieser mit 16MHz rennt, da 
können Deine Sekunden im Programm ganz schön laaaaaaaang werden... ;-)

Gruß,

Frank

von Martin (Gast)


Lesenswert?

Das stimmt, portC läuft über aVCC, den solltest du beschalten

von Klaus W. (mfgkw)


Lesenswert?

Martin schrieb:
> Das stimmt, portC läuft über aVCC, den solltest du beschalten

Nicht zufällig Port A? Da sind doch die AD-Wandler dran, oder nicht?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.