Forum: Mikrocontroller und Digitale Elektronik ATMEGA 8 PORTS Ausgang LED leuchtet nicht


von Werner (Gast)


Lesenswert?

Hallo

benutze eigendlich immer 128iger Atmels nun habe ich mal den 8 zur Hand

Will zwei LEDS ein und Auschalten


folgendes habe ich definiert

#define led1_port()  DDRD|=(1<<2);
#define led2_port()  DDRD|=(1<<3);

#define led1_high()    PORTD|=(1<<2); //LED gegen plus aus
#define led1_low()    PORTD&=~(1<<2); //LED gegen Masse ein

#define led2_high()    PORTD|=(1<<3); //LED gegen plus aus
#define led2_low()    PORTD&=~(1<<3); //LED gegen masse ein



in der Main

vois main(void
{
led1_port();
led2_port();

led1_low();
led2_low();

}


auch mit led1_high(); leuchtet nichts.


Die leds funktionieren

Die schlatung ist wie im TUTorial


von 5V über 1K R dann LED dann Port

Was mache ich falsch


Danke

von Sowieso (Gast)


Lesenswert?

ohne delay wird das nichts

von Werner (Gast)


Lesenswert?

Wie delay????

von Werner (Gast)


Lesenswert?

Ich habe mich warscheinlich undeutlich ausgedrückt


Es soll nur die Leds eingeschaltet werden.

nur das machen sie nicht

von Sowieso (Gast)


Lesenswert?

du hast oben die I/O.h vergessen.

von Matthias H. (Gast)


Lesenswert?

die Schreibfehler "vois main(void" sind nicht in deinem Code?

von Werner (Gast)


Lesenswert?

nein


void main(void)

#include <avr/io.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdint.h>
#include <avr/interrupt.h>
#define F_CPU 1000000UL
#include <util/delay.h>
#define led1_port()  DDRD|=(1<<2);
#define led2_port()  DDRD|=(1<<3);

#define led1_high()    PORTD|=(1<<2); //LED gegen plus aus
#define led1_low()    PORTD&=~(1<<2); //LED gegen Masse ein

#define led2_high()    PORTD|=(1<<3); //LED gegen plus aus
#define led2_low()    PORTD&=~(1<<3); //LED gegen masse ein





void main(void)
{
led1_port();
led2_port();

led1_low();
led2_low();

}

oder

void main(void)
{
led1_port();
led2_port();

led1_high();
led2_high();

}

geht aber nicht

von Thilo M. (Gast)


Lesenswert?

Füge mal eine Endlosschleife ein:

void main(void)
{
led1_port();
led2_port();

led1_high();
led2_high();

for (;;)
 {
 }

}

Sonst läuft der µC immer wieder neu an.

von Werner (Gast)


Lesenswert?

bringt nichts

von Thilo M. (Gast)


Lesenswert?

Wie hast du denn die LEDs angeschlossen? Sind die etwa Low-aktiv?

von Werner (Gast)


Lesenswert?

So wie im TUTORIAL I/O Grundlagen.

von Werner (Gast)


Lesenswert?

Noch eins

Die Reset Schaltung


als r habe ich 1k und als 47n 100n

hat das was zu sagen


die fuse kann ich auslesen

auch beim beschreiben keine fehler

von Thilo M. (Gast)


Lesenswert?

Dann sind siw Low-Aktiv.
1
#include <avr/io.h>
2
#include <inttypes.h>
3
#include <stdio.h>
4
#include <stdint.h>
5
#include <avr/interrupt.h>
6
#define F_CPU 1000000UL
7
#include <util/delay.h>
8
#define led1_port()  DDRD|=(1<<2);
9
#define led2_port()  DDRD|=(1<<3);
10
11
#define led1_high()    PORTD|=(1<<2); //LED gegen plus aus
12
#define led1_low()    PORTD&=~(1<<2); //LED gegen Masse ein
13
14
#define led2_high()    PORTD|=(1<<3); //LED gegen plus aus
15
#define led2_low()    PORTD&=~(1<<3); //LED gegen masse ein
16
17
18
19
20
21
void main(void)
22
{
23
led1_port();
24
led2_port();
25
26
led1_low();
27
led2_low();
28
29
for (;;)
30
 {
31
 }
32
33
}

Ist zwar nicht schön so, sollte aber funktionieren

von Werner (Gast)


Lesenswert?

geht auch nicht

ist der mega kapput??

von Thilo M. (Gast)


Lesenswert?

Nee, ich hab' den Code grade mal im Debugger, da läuft's auch nicht. 
Hab' irgendwie grade 'n Brett vorm Kopf ;).

von Thilo M. (Gast)


Lesenswert?

Probier mal das:
1
#include <avr/io.h>
2
3
#define LED_PORT_DIR DDRD
4
#define LED_PORT PORTD
5
#define LED_1 4
6
#define LED_2 8
7
8
char i = 0;
9
10
int main (void)
11
{
12
LED_PORT_DIR |= LED_1 | LED_2;
13
14
LED_PORT &= ~LED_1 & ~LED_2;
15
16
i = 8;
17
18
while (1);
19
20
return 0;
21
22
}

warum die letzte Anweisung vor der Endlosschleife nicht ausgeführt wird 
und sich der Debugger 'aufhängt' weiß ich nicht. Vielleicht liegt's am 
AVR-Studio. Teste es doch mal in der Hardware.

von Werner (Gast)


Lesenswert?

nichts passiert led ports habe ich auf 2 und 3 angepasst

von flummi (Gast)


Lesenswert?

Moin,

ihr habt da einen gravierenden fehler gemacht.
Am anfang der main schaltet ihr die LEDs ein und die restliche laufzeit 
verbringt de µC in der endlosschleife und langweilt sich.
Das i=8 wird evtl. vom Compiler rausoptimiert, da es nirgends benutzt 
wird.
Du kannst ja in die Endlosschleife ein Toggeln der LED einfuegen und 
zwischendrin eine Zeitverzögerung
while(i<32000) // Zeitverzögerung
{
    i++;
    asm(_nop); //no Operation
}

von Thilo M. (Gast)


Lesenswert?

Das 'asm(_nop); //no Operation' kannste auch 'rauslassen, oder willst du 
dadurch zusätzliche Laufzeit erreichen?

Irgendwas optimiert der Compiler weg, stimmt wohl.
Er wollte die LEDs ja auch nur einschalten, sprich Datenrichtung der 
Pins auf Ausgang, Pegel auf low.
Im Compiler funktioniert das soweit, das i = 8; habe ich zum Testen 
reingesetzt, im Compiler wird diese Zuweisung nicht mehr ausgeführt, der 
Compiler verabschiedet sich ins Nirvana (nicht in die Endlosschleife).

von Werner (Gast)


Lesenswert?

keine chance geht nicht

von Thilo M. (Gast)


Lesenswert?

Ich habe im Makefile die Optimierungen auf 0 gesetzt, also 'deaktivert, 
nun funktioniert's wie's soll.
Kannste mal probieren, im Makefile 'OPT = 0' anstatt 'OPT = s' 
eintragen, 'Make clean' starten und dann nochmal mit 'Make all' 
compilieren.

von Thilo M. (Gast)


Lesenswert?

OK, wenn du das Makefile lässt wie es ist (OPT = s) kannst du es so 
probieren:
1
#include <avr/io.h>
2
#include <inttypes.h>
3
#include <stdio.h>
4
#include <stdint.h>
5
#include <avr/interrupt.h>
6
#define F_CPU 1000000UL
7
#include <util/delay.h>
8
#define led1_port()  DDRD|=(1<<2);
9
#define led2_port()  DDRD|=(1<<3);
10
11
#define led1_high()    PORTD|=(1<<2); //LED gegen plus aus
12
#define led1_low()    PORTD&=~(1<<2); //LED gegen Masse ein
13
14
#define led2_high()    PORTD|=(1<<3); //LED gegen plus aus
15
#define led2_low()    PORTD&=~(1<<3); //LED gegen masse ein
16
17
18
volatile unsigned char i = 0;
19
20
21
int main(void)
22
{
23
led1_port();
24
led2_port();
25
26
led1_low();
27
led2_low();
28
29
for (;;)
30
 {
31
  i++;
32
  if (i==255)
33
    {
34
      i=0;
35
    }
36
 }
37
 
38
return 0;
39
40
}
Nun hat der Compiler nix mehr zum Wegoptimieren und das Teil läuft.
Die main sollte 'int' als Rückgabewert haben, muss nicht, aber dann 
kriegste keine Warnung mehr beim Compilieren.

Wenn diese Variante nicht funktioniert ist an der Hardware was faul.

von Werner (Gast)


Lesenswert?

hallo

also der mega war hinüber

habe einen anderen 8 ter  eingelötetr und der geht

danke

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.