Forum: Mikrocontroller und Digitale Elektronik einfache LED Schaltung


von Stefan Meier (Gast)


Lesenswert?

Hallo,

könnt einer mir vielleicht sagen was ich falsch mache? Ich habe 
folgendes sehr einfaches Programm:

int main (void) {



   DDRB  = 0xff;
   PORTB = 0xff;

   DDRC  = 0xff;
   PORTC = 0x00;

   DDRD  = 0x00;
   PORTB = 0x00;

   DDRD = 0x00;
   PORTD = 0xFF;


   double i=0,t=0;

   while(1) {

     LED0 (LED_ON);
  for(i=0;i<500000;i++){};
  LED1 (LED_ON);


   }


   return 0;
}

und ich will eigentlich nur dass erst die LED0 und dann die LED1 
eingeschalten wird, aber er schaltet immer nur die LED0 ein, danach 
beendet er anscheinend das Programm.

Kann mir vielleicht jemand kurz helfen, denke dass ist für euch kein 
Problem??

danke!

von Stefan Meier (Gast)


Lesenswert?

Ok, jezt hab ich selber rausgefunden!!!!! :-))))

von Klaus S. (skibby)


Lesenswert?

Hallo Stefan,

was die Funktion "LED0 (LED_ON)" macht ist hier nicht ersichtlich ...
Daher kann man da keine Aussage treffen ob da ein Fehler ist.

Ausserdem:

definiere i mal als long int statt als double !

von willi (Gast)


Lesenswert?

>>...denke dass ist für euch kein Problem??


selbst für uri geller wär das mit deinen angaben unmöglich.

1. wo und wie sind die LEDs angeschlossen?

2. was soll uns "LED0 (LED_ON);" sagen?

3. außerdem sieht:
    DDRB  = 0xff;
    PORTB = 0xff;

    DDRC  = 0xff;
    PORTC = 0x00;

    DDRD  = 0x00;
    PORTB = 0x00;

    DDRD = 0x00;
    PORTD = 0xFF;
  sehr merkwürdig aus

von Peter (Gast)


Lesenswert?

>for(i=0;i<500000;i++){};

und die schleife geht vermutlich schneller als du denkst - bei 
optimierung werden es 0µs sein

von ano (Gast)


Lesenswert?

wenn i überhaupt richtig defeniert ist

von W. S. (wope)


Lesenswert?

ano wrote:
> wenn i überhaupt richtig defeniert ist

yep, denke auch, dass mit "double" ist wahrscheinlich eher "long" 
gemeint gewesen ist...

Hab gar nicht gewusst, dass i++ mit double geht, glaube werde es auch 
nie brauchen :-)

@Stefan:

Unbedingt auf die richtige Verwendung von Datentypen aufpassen. Für das 
obige Beispiel ist double irgendwie unpassend.

Aber wenn das -O Flag von gcc beim Kompilieren entsprechend gesetzt ist, 
wird der Code tatsächlich wegoptimiert worden sein - nix mehr 
Warteschleife...

Probier mal (gehe mal davon aus, es ist ein AVR Programm und avr-libc, 
usw. ist vorhanden):
#include <util/delay.h>
und statt der Warteschleife
_delay_ms( 500 ); // halbe sec. warten

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.