mikrocontroller.net

Forum: Compiler & IDEs erweiterte Frage zu Led lauflicht


Autor: Stefan F. (feissy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo, bin auch so langsam in das thema mikrocontroller eingestien. bin 
auch schon fleißig am programmieren üben und hab da mal folgende frage. 
habe bereits ein led lauflichtprogramm in c geschrieben für einen 
atmega32
jedoch leuchten bei diesem alle leds nur 1 geht dann jeweils aus was das 
lauflicht dann auch ausmacht ;-) aber jetzt möchte ich das immer nur 1 
led anist und hin und herläuft kann mir da jm helfen????
hier der jetzige code


#include <avr/io.h>
#include <util/delay.h>

void wait(void)
{
   unsigned int i;
   _delay_ms(50);
}

void main(void)
{
   DDRB=0xFF;

   PORTB = 1;

   while(1)
   {
     PORTB = (PORTB<<1)|(PORTB>>7);
     wait();
   }
}

schon mal im voruas danke

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stichworte Invertierung und low aktive LEDs.

Siehe auch Bitmanipulation

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mal Hand aufs Herz.
Hast du wirklich verstanden, wie das hier

>     PORTB = (PORTB<<1)|(PORTB>>7);

tatsächlich funktioniert?
(Wenn ja, dann Hut ab. Ich hab 3 mal hinschauen müssen um zu sehen was 
da abgeht. Und ich programmiere seit 20 Jahren)

Ansonsten: Schmeiss das raus und mach dein Lauflicht konventionell:
Du hast im Programm eine Variable, die du nach Herzenslust manipulieren 
kannst. Und erst dann, wenn der neue Inhalt deiner uint8_t Variablen 
feststeht, gibst du das auf den Port raus. Dabei kannst du dann mittels 
~ ganz einfach alle Bits bei der Ausgabe umdrehen, da bei dir eine LED 
anscheinend dann leuchtet, wenn das entsprechende Bit eine 0 aufweist.
#include <avr/io.h>
#include <util/delay.h>

void wait(void)
{
   unsigned int i;
   _delay_ms(50);
}

void main(void)
{
   uint8_t Licht;

   DDRB=0xFF;

   Licht = 1;

   while(1)
   {
     PORTB = ~Licht;      // Bei der Ausgabe alle Bits umdrehen

     Licht = Licht << 1;  // um 1 Stelle nach links verschieben
     if( Licht == 0 )     // wenn alle Bits durch, wieder von vorne anfangen
       Licht = 1;

     wait();
   }
}

Autor: Stefan F. (feissy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
;-) also das mit dem    PORTB = (PORTB<<1)|(PORTB>>7);
hab ich aus meinem Buch, wo einführung in c beschrieben wird ;-) also 
deswegen ich hab das mal einfach so übernommen und es funzt auch also 
was will man mehr trotzdem danke ich werd sofort ausprobieren danke

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>     PORTB = (PORTB<<1)|(PORTB>>7);

Das ist ziemlich clever ;-)

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.