ATMEGA 8 PORTS Ausgang LED leuchtet nicht

Gast #616278
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
Gast #616290
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
Gast #616300
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
Gast #616340
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.
Gast #616370
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
}
Gast #616391
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).
Gast #616397
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.
Gast #616415
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren