Forum: Mikrocontroller und Digitale Elektronik Rechtsshift,C,ATMEGA


von Azubi (Gast)


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;
    }
  }
}

von Peter II (Gast)


Lesenswert?

1
for(l=0; l<=8; l++){
2
   PORTD&=~((l>>1));

was erwartes du wenn du eine 0..8 nach rechts schiebst?

von Azubi (Gast)


Lesenswert?

Also wenn mein l=0 ist dann habe ich doch vorgestellt da stehen

PORTD&=~((1000 0000));
daraus wird durch die Negierung 0111 1111 UND mit 1111 1111= daraus 
folgt

0111 1111 ???

von Fabian O. (xfr)


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.

von Peter II (Gast)


Lesenswert?

Azubi schrieb:
> Also wenn mein l=0 ist dann habe ich doch vorgestellt da stehen
> PORTD&=~((1000 0000));
> daraus wird durch die Negierung 0111 1111 UND mit 1111 1111= daraus
> folgt 0111 1111 ???

(0>>1) ist aber 0

von Fabian O. (xfr)


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.

von Azubi (Gast)


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

von Peter II (Gast)


Lesenswert?

Azubi schrieb:
> PORTD&=~((1<<l));

du musst halt etwas mehr drehen

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

von Azubi (Gast)


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

von Thomas E. (thomase)


Lesenswert?

Azubi schrieb:
> wenn man diese Anweisung   PORTD&=~((l>>1)); durch diese ersetzt
>  PORTD&=~((1<<l));
Schön. Und was ist das jetzt?
Eins shift ieh oder ieh shift eins?
Mach das mal ordentlich. Das musst dir doch selber auffallen, daß das 
Mist ist.

mfg.

von Azubi (Gast)


Lesenswert?

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

klappt und haut mich um :O

kannst du es mir erklären :O?

von (prx) A. K. (prx)


Lesenswert?

Wer eine Variable l nennt, der hat jedes Ergebnis verdient.

von Fabian O. (xfr)


Lesenswert?

Azubi schrieb:
> kannst du es mir erklären :O?

Weil 128 binär kodiert 0b10000000 ist. Statt
1
PORTD&=~((128>>l));
kannst Du genauso schreiben
1
PORTD&=~((0b10000000>>l));

von Azubi (Gast)


Lesenswert?

l stand ursprünglich für LINKS ^^

von Thomas E. (thomase)


Lesenswert?

Azubi schrieb:
> l stand ursprünglich für LINKS ^^
Ach das ist gar kein ieh sondern ein ELL.

A. K. schrieb:
> Wer eine Variable l nennt, der hat jedes Ergebnis verdient.
Mindestens.

mfg.

von Ein (Gast)


Lesenswert?

A. K. schrieb:
> Wer eine Variable l nennt, der hat jedes Ergebnis verdient.

Das kommt davon, wenn man Code nicht mit [_code]..[_/code] tagged. Ohne 
Syntax-high-lightning vertut man sich da schnell ;-)

von (prx) A. K. (prx)


Lesenswert?

Du meinst also, das sieht besser aus?
1
l <> 1

Dann schon lieber so:

von Duda (Gast)


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.

von Rolf M. (rmagnus)


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.

von Svenska (Gast)


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.

von Rolf M. (rmagnus)


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.

von Bronco (Gast)


Lesenswert?

Was hab ich mal Fehler gesucht, weil die 0 (Null) und das O (Otto) im 
Font das gleiche Zeichen hatten...

von Duda (Gast)


Angehängte Dateien:

Lesenswert?

Rolf Magnus schrieb:
> Wenn du die brauchst, um bei einem vernünftigen Font I, l und 1 zu
> unterschieden, hast du die Schriftgröße zu klein eingestellt.

Sorry, 1 und l ist schlecht zu unterscheiden. Zumindest hier im Forum 
(siehe Foto).
Ich stelle mir dafür auch keine Riesenbuchstaben ein.

von (prx) A. K. (prx)


Angehängte Dateien:

Lesenswert?

Also bitte - heute gibts ordentliche Bildschirmauflösungen, da muss das 
nicht so unscharf sein.

von Rolf M. (rmagnus)


Angehängte Dateien:

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.

von Duda (Gast)


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.

von Duda (Gast)


Lesenswert?

So, hab mal auf "Source Code Pro" umgestellt - jetzt gibt es keine 
Unterscheidungsprobleme mehr.

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.