Forum: Mikrocontroller und Digitale Elektronik Dubios: Zwei Codes für LED Toggle Bei beiden Leuchtet LED unterschiedlich hell.


von Daniel C. (cagara)


Lesenswert?

Ich fasse es nicht :)
Benutze ich diesen Code hier, so blinkt die LED an Portd.5 mit korrekter 
Helligkeit:
1
DDRD  |= (1 << 5);
2
3
 while (1)
4
    {
5
        // LED an
6
        PORTD |= (1 << 5);
7
8
        // 1 Sekunde warten
9
        _delay_ms(50);
10
11
        // LED aus
12
        PORTD &= ~(1 << 5);;
13
14
        // 1 Sekunde warten
15
        _delay_ms(50);
16
    }


Benutze ich allerdings diesen code hier, so leutet sie nur seeehr 
seeeehr schwach, und ich kann mir nicht erklären woran es liegt.
1
//Irgendwo ganz oben im file:
2
#define SET_LED(x) PORTD=PORTD&(~(1<<x))
3
#define CLEAR_LED(x) PORTD=PORTD|((1<<x))
4
#define BLINK   SET_LED(5);_delay_ms(500);CLEAR_LED(5);_delay_ms(500)
5
6
//schnipp schnapp ...
7
8
DDRD=0xFF; // SET LED AS OUTPUT
9
10
  while(1)
11
  {
12
BLINK;
13
14
15
16
  }


ich kann mir das Phänomen echt nicht erklären! Ihr vielleicht? Ich 
dachte schon meine LED wäre kaputt bis es beim anderen Code besser 
leuchtete!

von Flo (Gast)


Lesenswert?

evtl. liegts an der zusätzlichen 0 in _delay_ms()

von Daniel C. (cagara)


Lesenswert?

Nein, auch mit 500 im ersten Code abschnitt blinkt es nur sehr schwach.

von Flo (Gast)


Lesenswert?

Also du schaltest deine LED ein, wartest 500 bzw. 50 ms und schaltest 
sie aus und wartest wieder 500 bzw. 50 ms.

Also ein Tastverhältnis von 1:1 wie das dein Auge interpretiert ist ne 
andere Frage...

von Daniel C. (cagara)


Lesenswert?

Nein nein nein :)

Wenn ich beide lösungen auf 500ms einstelle, blinkt die erste Lösung 2 
mal die Sekunde Hell ...
Die Zweite blinkt auch 2 mal die Sekunde, aber nur sehr sehr schwach!

von Rik (Gast)


Lesenswert?

Hallo!
cpp macht aus Deinen Makros das hier:

while(1) {
    PORTD=PORTD&(~(1<<5));_delay_ms(500);PORTD=PORTD|((1<<5));_delay_ms(500) 
;
}

Sieht also genauso aus, wie der Rest von Deinem Code.. komisch. Mit 
wieviel Hz läuft denn der Controller?

Am Rande noch Folgendes:
http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html#gd22e7a36b80e2f917324dc43a425e9d3

Schalte mal die Optimierung ab und gib den ganzen Code.

von Uwe .. (uwegw)


Lesenswert?

> Am Rande noch Folgendes:
> 
http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html#gd22e7a36b80e2f917324dc43a425e9d3

Interessant ist vor allem:
> The maximal possible delay is 262.14 ms / F_CPU in MHz.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Wenn bei 2. die Zeile DDRD=0xFF; // SET LED AS OUTPUT nicht drin wäre, 
wäre mir das Verhalten erklärbar: Der Port arbeitet dann ab Reset als 
Input und die LED bekommt ihren Saft, wenn der interne Pullup aktiviert 
ist. Poste vielleicht mal die komplette Source nicht den Codefetzen. 
Vielleicht steht die DDRD Zuweisung an der falschen Stelle.

Nicht wichtig aber ärgerlich: Die Makronamen passen nicht zu der 
ausgefüjrten Funktion. Bei dir löscht SET die LED und CLEAR schaltet die 
LED an... das kann in grösseren Programmen andere ziemlich verwirren und 
ziemliche Zweifel an der Kompetenz des Autors auslösen ;-)

von Rik (Gast)


Lesenswert?

> DDRD  |= (1 << 5); // oben
> DDRD=0xFF; // unten

Biste sicher, dass die LED am richtigen Pin angeschlossen ist?

von Michael H* (Gast)


Lesenswert?

Daniel Cagara wrote:
> DDRD  |= (1 << 5);
vs.
> DDRD=0xFF; // SET LED AS OUTPUT

kann es sein, dass du noch was andres an port D hast, das du mit 0xff 
kurzschließt?

von Daniel C. (cagara)


Lesenswert?

Rik wrote:
> Hallo!
> cpp macht aus Deinen Makros das hier:
>
> while(1) {
>     PORTD=PORTD&(~(1<<5));_delay_ms(500);PORTD=PORTD|((1<<5));_delay_ms(500) ;
> }
>
> Sieht also genauso aus, wie der Rest von Deinem Code.. komisch. Mit
> wieviel Hz läuft denn der Controller?
>
> Am Rande noch Folgendes:
> 
http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html#gd22e7a36b80e2f917324dc43a425e9d3
>
> Schalte mal die Optimierung ab und gib den ganzen Code.


Optimierung war auch und der Controller läuft auf 16Mhz

Vollständige codes sind:

SCHWACHE LED:
1
#include "avr/io.h"
2
#include "util/delay.h"
3
4
#define SET_LED(x) PORTD=PORTD&(~(1<<x))
5
#define CLEAR_LED(x) PORTD=PORTD|((1<<x))
6
#define BLINK   SET_LED(5);_delay_ms(500);CLEAR_LED(5);_delay_ms(500)
7
8
int main(){
9
10
DDRD=0xFF; // SET LED AS OUTPUT
11
12
  while(1)
13
  {
14
BLINK;
15
  }

HELLE LED:
1
#include "avr/io.h"
2
#include "util/delay.h"
3
4
int main(){
5
6
DDRD  |= (1 << 5);
7
8
 while (1)
9
    {
10
        // LED an
11
        PORTD |= (1 << 5);
12
        // 1 Sekunde warten
13
        _delay_ms(500);
14
        // LED aus
15
        PORTD &= ~(1 << 5);;
16
        // 1 Sekunde warten
17
        _delay_ms(500);
18
    }
19
}

Also der einzige Unterschied der mit auffällt ist, dass beim 
schwachen-Licht alle PORTD Pins auf Output sind ... Aber das sollte doch 
keinen unterschied machen!

Ich teste grad mal was.

von Daniel C. (cagara)


Lesenswert?

Michael H* wrote:
> Daniel Cagara wrote:
>> DDRD  |= (1 << 5);
> vs.
>> DDRD=0xFF; // SET LED AS OUTPUT
>
> kann es sein, dass du noch was andres an port D hast, das du mit 0xff
> kurzschließt?

Also an Port D hängt noch ne RS232 Buchse mit Max232, da ist aber nichts 
angeschlossen!

von Michael H* (Gast)


Lesenswert?

schreib doch bei beiden versionen mal das selbe ins DDRD register.
benutzt du das selbe makefile für beide versionen?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Sag das nit. Wenn eine RS232 Buchse dran hängt, hängt auch noch ein 
MAX232 dran.

Ersetze doch um den Spass mal in der 2. Variante

DDRD=0xFF; // SET LED AS OUTPUT

durch

DDRD  |= (1 << 5);

von Rik (Gast)


Lesenswert?

Wenn der Max232 an Versorgungsspannung angeschlossen ist, dann treibt 
dein DDRD=0xFF gegen dessen TXD. Vielleicht ist der Max jetzt schon 
kaputt :-(

von Rik (Gast)


Lesenswert?

... oder der entsprechende Port-Pin ist jetzt kaputt

von Daniel C. (cagara)


Lesenswert?

Stefan B. wrote:
> Sag das nit. Wenn eine RS232 Buchse dran hängt, hängt auch noch ein
> MAX232 dran.
>
> Ersetze doch um den Spass mal in der 2. Variante
>
> DDRD=0xFF; // SET LED AS OUTPUT
>
> durch
>
> DDRD  |= (1 << 5);


Habe jetzt die Helle-LED variante ausversehen mit

DDRD=0xFF; // SET LED AS OUTPUT
DDRD  |= (1 << 5);


...kompiliert, also quasi das gleiche als würde ich die zweite Zeile 
weglassen...
Led war immernoch hell hat sich aber komisch verhalten. Blinkt nur 10 
mal, dann dauerleuchten.

Seltsame sache, naja ich glaube ich bleibe dabei nur die pins auf output 
zu legen die ich brauche.
Aber ich meine gelesen zu haben, dass es besser wäre vorsichtshalber 
alles auf output zu legen

von Daniel C. (cagara)


Lesenswert?

Rik wrote:
> Wenn der Max232 an Versorgungsspannung angeschlossen ist, dann treibt
> dein DDRD=0xFF gegen dessen TXD. Vielleicht ist der Max jetzt schon
> kaputt :-(

Mist, das ist er in der Tat! Aber er wird auch zur Regelung der 
eingangsspannung genutzt und da klappt alles noch!

jetzt krieg ich bammel ....

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.