Rechtsshift,C,ATMEGA

Gast #3006384
Lesenswert?

Hallo

Ich hab ein Lauflicht programmiert welches immer von PD0-PD7 leuchtet
das hat auch geklappt allerding wollte ich danach ein Lauflicht welches
von PD7 nach PD0 leuchtet und dies klappt nicht und ich verstehe 
überhaupt nicht wieso :(

Meine LEDS werden mit einer 0 eingeschaltet und mit 1 ausgeschaltet


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

void warte(){
  _delay_ms(250);
      }


int main (void) {

  DDRD=0xFF;
  PORTD=0xFF;  //Alle LEDS ausschalten


  int l;

  while(1){

    for(l=0; l<=8; l++){

      warte();
      PORTD&=~((l>>1));
      warte();
      PORTD=0xFF;
    }
  }
}
#3006399
Lesenswert?

> PORTD&=~((l>>1));

Das kann auch nicht funktionieren:
PORTD &= ~(         l >> 1); ist das gleiche wie
PORTD &= ~(0b00000001 >> 1); ist das gleiche wie
PORTD &= ~ 0b00000000;       ist das gleiche wie
PORTD &=   0b11111111;       ist das gleiche wie
PORTD = PORTD & 0b11111111;  ist das gleiche wie
PORTD = PORTD;

Die Anweisung bewirkt also überhaupt nichts.
#3006407
Lesenswert?

Ich sehe gerade, das ist ja ein l statt einer 1. Man man, nimm doch 
bitte für einen Schleifenzähler die Variable i, wie jeder andere auch.

Zu Deinem Problem: Du musst mit der Bitmaske 0b01111111 anfangen und sie 
in jedem Schritt eine Stelle nach rechts schieben.
Gast #3006414
Lesenswert?

>(0>>1) ist aber 0


Ist auch gut so dann geht die LED an was mich bloß verwirrt ist

wenn man diese Anweisung   PORTD&=~((l>>1)); durch diese ersetzt

 PORTD&=~((1<<l)); macht der Controller einen schönes linksläufiges 
Lauflicht das macht mir gerade meine Änfängerwelt kaputt
Gast #3006421
Lesenswert?

> Zu Deinem Problem: Du musst mit der Bitmaske 0b01111111 anfangen und sie
in jedem Schritt eine Stelle nach rechts schieben.

Das habe ich mir auch so gedacht:

wenn L=0 ist

dann habe ich ~(1000 0000)

wenn l=1

dann habe ich ~(0100 0000)

wenn l=2

dann habe ich ~(0010 0000)

usw.

meine Anweisung macht was ganz anderes
Gast #3007152
Lesenswert?

Man verwendet keine Zeiche, die zum verwechseln ähnlich sind.
Es kann zwar sein, dass bei Deinem Zeichensatz eine Eins und ein Ell 
eindeutig unterscheidbar sein. Im Forum gibt es aber arge 
Schwierigkeiten.

Variablen müssen auch nicht so kurz wie möglich sein. Längere Variablen 
kosten nur um Quellcode mehr Speicher, sonst aber nicht.

Eine Variable sollte auch die Funktion eindeutig beschreiben.
#3007217
Lesenswert?

Azubi schrieb:
>>(0>>1) ist aber 0
>
>
> Ist auch gut so dann geht die LED an was mich bloß verwirrt ist
>
> wenn man diese Anweisung   PORTD&=~((l>>1)); durch diese ersetzt
>
>  PORTD&=~((1<<l));
> macht der Controller einen schönes linksläufiges
> Lauflicht das macht mir gerade meine Änfängerwelt kaputt

Das läßt vermuten, daß du keine Ahnung hast, was die Operatoren << und 
>> eigentlich machen. Die erste Anweisung verschiebt l um 1 Bit nach 
rechts, die zweite verschiebt eine 1 um l Bits nach links.

Azubi schrieb:
>> Zu Deinem Problem: Du musst mit der Bitmaske 0b01111111 anfangen und sie
> in jedem Schritt eine Stelle nach rechts schieben.
>
> Das habe ich mir auch so gedacht:
>
> wenn L=0 ist
>
> dann habe ich ~(1000 0000)

Nein. Wenn du eine 0 um ein Bit nach links schiebst, kommt wieder 0 
raus.

Duda schrieb:
> Man verwendet keine Zeiche, die zum verwechseln ähnlich sind.

Man verwendet zumindest beim Programmieren auch keinen Font, bei dem man 
die nicht unterscheiden kann. Eigentlich sollte man solche Fonts am 
besten gar nicht verwenden.

> Variablen müssen auch nicht so kurz wie möglich sein. Längere Variablen
> kosten nur um Quellcode mehr Speicher, sonst aber nicht.
>
> Eine Variable sollte auch die Funktion eindeutig beschreiben.

Das hängt aber auch davon ab, wie groß der "scope" ist. Bei 
Zählschleifen ist es gebräuchlich, solche Variablen nur ein Zeichen lang 
zu machen und nicht etwa "laufvariable" oder "zaehler" zu nennen, da das 
in dieser Situation zur Verständlichkeit des Codes nicht wirklich 
beiträgt.
Gast #3007388
Lesenswert?

> Man verwendet zumindest beim Programmieren auch keinen Font, bei dem man
> die nicht unterscheiden kann. Eigentlich sollte man solche Fonts am
> besten gar nicht verwenden.
Nicht jeder kann 150% Sehschärfe anbieten. Dann ist der Font ziemlich 
egal, es bleibt schlecht unterscheidbar.
#3008338
Lesenswert?

Svenska schrieb:
> Nicht jeder kann 150% Sehschärfe anbieten.

Wenn du die brauchst, um bei einem vernünftigen Font I, l und 1 zu 
unterschieden, hast du die Schriftgröße zu klein eingestellt. Ich habe 
bestimmt keine überragende Sehschärfe und trotzdem kein Problem damit.

> Dann ist der Font ziemlich egal, es bleibt schlecht unterscheidbar.

Richtig. Bei falschen Einstellungen ist der Font tatsächlich egal.
#3009746
Lesenswert?

A. K. schrieb:
> Also bitte - heute gibts ordentliche Bildschirmauflösungen, da muss das
> nicht so unscharf sein.

Ich vermute, daß das direkt in Originalgöße aus dem Browser heraus 
kopiert war, damit man erkennt, wie's bei ihm aussieht. Mach ich einfach 
auch mal so. Und bei dem Font hab ich kein Problem, die Zeichen zu 
unterscheiden.
Angehängte Dateien:
Gast #3010643
Lesenswert?

Ja, ist direkt aus dem Browser fotografiert. Angezeigt wird das Bild 
hier aber in etwa zweifacher Höhe. Die Unschärfe ist wohl das 
antialiasing.

A. K. schrieb:
> Also bitte - heute gibts ordentliche Bildschirmauflösungen, da muss das
> nicht so unscharf sein.

Full-HD auf 26". Font ist bei mir wohl Times 16. Schrifthöhe ist bei mir 
3mm. Ja, ich mag es, wenn ich viel auf dem Bildschirm unterbringen kann.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren