mikrocontroller.net

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


Autor: Daniel Cagara (cagara)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich fasse es nicht :)
Benutze ich diesen Code hier, so blinkt die LED an Portd.5 mit korrekter 
Helligkeit:
DDRD  |= (1 << 5);

 while (1)
    {
        // LED an
        PORTD |= (1 << 5);

        // 1 Sekunde warten
        _delay_ms(50);

        // LED aus
        PORTD &= ~(1 << 5);;

        // 1 Sekunde warten
        _delay_ms(50);
    }


Benutze ich allerdings diesen code hier, so leutet sie nur seeehr 
seeeehr schwach, und ich kann mir nicht erklären woran es liegt.
//Irgendwo ganz oben im file:
#define SET_LED(x) PORTD=PORTD&(~(1<<x))
#define CLEAR_LED(x) PORTD=PORTD|((1<<x))
#define BLINK   SET_LED(5);_delay_ms(500);CLEAR_LED(5);_delay_ms(500)

//schnipp schnapp ...

DDRD=0xFF; // SET LED AS OUTPUT

  while(1)
  {
BLINK;



  }


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!

Autor: Flo (Gast)
Datum:

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

Autor: Daniel Cagara (cagara)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, auch mit 500 im ersten Code abschnitt blinkt es nur sehr schwach.

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Daniel Cagara (cagara)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Rik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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__...

Schalte mal die Optimierung ab und gib den ganzen Code.

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Am Rande noch Folgendes:
> 
http://www.nongnu.org/avr-libc/user-manual/group__...

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Rik (Gast)
Datum:

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

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

Autor: Michael H* (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Daniel Cagara (cagara)
Datum:

Bewertung
0 lesenswert
nicht 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__...
>
> 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:
#include "avr/io.h"
#include "util/delay.h"

#define SET_LED(x) PORTD=PORTD&(~(1<<x))
#define CLEAR_LED(x) PORTD=PORTD|((1<<x))
#define BLINK   SET_LED(5);_delay_ms(500);CLEAR_LED(5);_delay_ms(500)

int main(){

DDRD=0xFF; // SET LED AS OUTPUT

  while(1)
  {
BLINK;
  }

HELLE LED:
#include "avr/io.h"
#include "util/delay.h"

int main(){

DDRD  |= (1 << 5);

 while (1)
    {
        // LED an
        PORTD |= (1 << 5);
        // 1 Sekunde warten
        _delay_ms(500);
        // LED aus
        PORTD &= ~(1 << 5);;
        // 1 Sekunde warten
        _delay_ms(500);
    }
}


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.

Autor: Daniel Cagara (cagara)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Michael H* (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Rik (Gast)
Datum:

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

Autor: Rik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... oder der entsprechende Port-Pin ist jetzt kaputt

Autor: Daniel Cagara (cagara)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Cagara (cagara)
Datum:

Bewertung
0 lesenswert
nicht 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 ....

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.