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; } } }
1 | for(l=0; l<=8; l++){ |
2 | PORTD&=~((l>>1)); |
was erwartes du wenn du eine 0..8 nach rechts schiebst?
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 ???
> 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.
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
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.
>(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
> 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
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.
> PORTD&=~((128>>l));
klappt und haut mich um :O
kannst du es mir erklären :O?
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)); |
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.
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 ;-)
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.
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.
> 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.
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.
Was hab ich mal Fehler gesucht, weil die 0 (Null) und das O (Otto) im Font das gleiche Zeichen hatten...
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.
Also bitte - heute gibts ordentliche Bildschirmauflösungen, da muss das nicht so unscharf sein.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.