Forum: Mikrocontroller und Digitale Elektronik LED an AtMega 128


von wolf4124 (Gast)


Lesenswert?

Hallo

Eine ganz spezielle Frage.
Hat jemand mit einem ATMega128-16AI schon eine Led (1,5V 20mA) an einem
Pin (z.B. am Port F) zum leuchten gebracht.
Geschaltet wird der Widerstand gegen den Pin und gegen VCC.
Bei meinen Schaltungen (2 Stück und mit 2X 128er) habe ich entweder
5Volt (5Volt gegen 5Volt am Pin => leuchtet nicht) oder 4,1Volt (am Pin
=> leuchtet auch nicht) am Pin.

Können die 128 vielleicht nicht so viel schalten wie die anderen oder
habe ich womöglich 2 defekte????

Gruß

Wolf4124

von Florian D. (Gast)


Lesenswert?

"Geschaltet wird der Widerstand gegen den Pin und gegen VCC."
Wo hast Du dann die LED hingebaut?

von wolf4124 (Gast)


Lesenswert?

Upps.

Sie wird doch nicht.... Nein. Sie ist noch nicht unter den Tisch
gefallen.

Den Widerstand mit der Led in Reihe und dann auf VCC und das andere
Ende an den Pin.
(;-)

von Florian D. (Gast)


Lesenswert?

Sind die Pull-Ups ausgeschaltet?

von wolf4124 (Gast)


Lesenswert?

Sollten sie sein.
Habe mit 0xff geladen.

  DDRF = 0xff;

von M. M. (miszou)


Lesenswert?

Hi

JTAG und Atmega103 Modus bei in den Fuses ausgeschaltet?

Gruß MISZOU

von Simon K. (simon) Benutzerseite


Lesenswert?

AVCC angeschlossen oder wie das hieß?

von wolf4124 (Gast)


Lesenswert?

Hi

JTAG habe ich gerade ausgeschaltet (keine Änderung)
103 war schon ausgeschaltet.

Gruß

von wolf4124 (Gast)


Lesenswert?

Hi

AVCC liegt auf 5 Volt.

Gruß

von M. M. (miszou)


Lesenswert?

Hi

LED richtig gepolt?
Zeig mal dein Programm, mit dem du die Pins ansteuerst.


Gruß MISZOU

von wolf4124 (Gast)


Lesenswert?

Hallo

Hier die Daten.


// CPU ist eine ATMega 128

#include <avr\io.h>          //Einfügen der Headerdatei für die Namen 
der
AVR Register usw.
#include <stdint.h>          //Weis noch nicht wo für

//Deklaration der verwendeteten Funktionen im Programm
int main(void);          //Main
int init_avr(void);        //INIT vom AVR

int main(void)
{
  int init_avr(void);

  PORTF = 0xff;      //oder auch mit 0xff; probiert
}

int init_avr(void)
{

//Initalisierung des AVR
DDRF = 0xff;        //Port F als Ausgang setzen
}

von Rolf Magnus (Gast)


Lesenswert?

>   PORTF = 0xff;      //oder auch mit 0xff; probiert

Wie "oder auch"? Wenn du den Port auf 0xff setzt, siehst du natürlich
bei nach Vcc geschalteten LEDs nichts.

Aber dein Problem liegt vermutlich darin, daß du init_avr() in main()
nochmal deklarierst, statt es aufzurufen. Daher wird dein DDRF nie
gesetzt.

von wolf4124 (Gast)


Lesenswert?

Danke für eure Hilfe.
Es lag doch am Program.

DDRF = 0xff;        Falsch
DDRF = 0xFF;        Richtig

Aber da muß man erst drauf kommen.

Gruß

Wolf4124

von tex (Gast)


Lesenswert?

??
Das soll stimmen?
Also bei mir geht 0xff auch ma mega 128 aber ich kann mir nicht
vorstellen, dass eine LED zwischen VCC und PinF0 oder PinF1 leuchtet,
wenn Port F 11111111 ist, wiel die LED dann zwischen VCC und VCC* liegt
was nicht wirklich einen hinreichenden Potentialunterschied bewirkt
0x00 hingegen würde die Portpins auf GND legen, was bei richtiger
polung zu leuchtenden LEDs führen würde ...

von Karl heinz B. (heinzi)


Lesenswert?

@Wolf4124

> Aber da muß man erst drauf kommen.

Das war hoechstens Zufall

Hier:

int main(void)
{
  int init_avr(void);

Das hier, ist kein Funktionsaufruf. Das hier deklariert,
dass es irgendwo eine Funktion namens init_avr gibt, die
nichts annimmt und einen int zurueckgibt. Nicht mehr und nicht
weniger. Es ist insbesondere kein Funktionsaufruf!


int main()
{
  init_avr();

Das hingegen ist ein Funktionsaufruf.

Da Deine init_avr nicht aufgerufen wurde, wurde natuerlich auch
DDRF = 0xff;
nicht ausgefuehrt und damit sind deine Ports nicht richtig
programmiert.

Ob du 0xff oder 0xFF schreibst, ist in C voellig egal (es sei
denn der Compiler hat einen schweren (!) Fehler. Der waere
aber sicher auch den Programmieren des Compilers aufgefallen.
Ein Compiler kriegt normalerweise immer eine umfangreiche Sammlungen
an Testcode zu schlucken, es wird das resultierende Programm
Byte fuer Byte mit einer Musterloesung verglichen und jeder
Abweichung nachgegangen).

von wolf4124 (Gast)


Lesenswert?

Hallo

Natürlich war Zufall. (;-)
Ich habe aber auch die Funktion auf "init_avr();" geändert gehabt.
Und es ist auch nicht gegangen.

Ich habe auch noch in der Zeile von
"PORTF = 0xff;      //oder auch mit 0xff; probiert"
auf
"PORTF = 0x00;
geändert. Am sieht es ja auch noch an dem Komentar, das ich da etwas
probiert habe.
Aber erst nach der Änderung von ff auf FF ging es.
Das mit dem Funktionsaufruf wird sicher auch ein Fehler gewesen sein.
Ich arbeite mit AVR-GCC.

Aber nochmal danke für eure Hilfe.

Gruß

Wolf4124

von mirki (Gast)


Lesenswert?

Irgendwie ist mir Deine Vorgehensweise schleierhaft.

Wenn Du ne LED in Serie mit einem Widerstand zwischen I/O Pin und VCC
schaltest ( über die Polung brauchen wir ja nicht reden, oder ? ), dann
machst Du das oberflächlich gesehen so:

PINA1 als Ausgang setzten
PINA1 auf High Pegel bringen
und zum leuchten musst du einfach :
PINA1 auf LOW bringen

Das ist eigentlich alles !

Also bei High kein Licht bei Low Licht !!!

mirki

von wolf4124 (Gast)


Lesenswert?

Sowie ich es sehe habe ich zwei Fehler bei der Funktion

PINA1 als Ausgang setzten   (bei mir PortF)

gehabt.

Gruß

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.