Forum: Compiler & IDEs erweiterte Frage zu Led lauflicht


von Stefan F. (feissy)


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

von Falk B. (falk)


Lesenswert?

Stichworte Invertierung und low aktive LEDs.

Siehe auch Bitmanipulation

von Karl H. (kbuchegg)


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.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
void wait(void)
5
{
6
   unsigned int i;
7
   _delay_ms(50);
8
}
9
10
void main(void)
11
{
12
   uint8_t Licht;
13
14
   DDRB=0xFF;
15
16
   Licht = 1;
17
18
   while(1)
19
   {
20
     PORTB = ~Licht;      // Bei der Ausgabe alle Bits umdrehen
21
22
     Licht = Licht << 1;  // um 1 Stelle nach links verschieben
23
     if( Licht == 0 )     // wenn alle Bits durch, wieder von vorne anfangen
24
       Licht = 1;
25
26
     wait();
27
   }
28
}

von Stefan F. (feissy)


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

von Matthias L. (Gast)


Lesenswert?

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

Das ist ziemlich clever ;-)

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.