schneller werdendes Lauflicht, Problem

Hallöchen

Ich möchte ein Lauflicht per Portmanipulation laufen lassen. Ich habe 8 Pins verwendet, 3 sollen fix leuchten, bei den restlichen 5 soll ein "inverses" Lauflicht (es läuft eigentlich die abgeschaltete LED) langsam beginnen, schneller werden und dann beim Erreichen des schnellen delays so schnell bleiben. Wenn ich es so programmiere, wie folgt, bleibt es nach ein paar Durchläufen stehen, die erste der 5 LEDs ist dunkel und die anderen leuchten. Wo ist hier mein Denkfehler?

Weiters: was muss ich machen, damit die LED an Pin B0 nicht mit der TX-LED mitblinkt, sondern durchgehend leuchtet? Ich verwende hier den Micro.

int del;              // delay between LED movements

void setup()
{
  DDRB = B11111111; // B0~B7 outputs
  del = 200;                // Startdelay
}

void loop()
{
   
  PORTB = B11110111; 
  delay(del);
  PORTB = B11101111; 
  delay(del);
  PORTB = B11011111; 
  delay(del);
  PORTB = B10111111; 
  delay(del);
  PORTB = B01111111; 
  delay(del);
  PORTB = B11111111;
  delay(del);

    if (del >> 50);
    {
      del = del - 33;
    }
    }

hi,

wieso das doppelte >> ? damit schiebst Du ja bits.

gruß stefan

nach dem zweiten Durchlauf dürfte der Wert von del negativ sein und delay() hat damit wahrscheinlich ein Problem.

Ich denke, hier müsste man doch eher "unsigned int" nehmen, welches ja dann von 65535...0 herunter zählt - und den 0-Wert dann abfangen. So im Sinne von:

unsigned int del = 1000;
.
.
.
if( del > 0 )
  del -= 33;

Oder?

hi,

ob int oder unsigned ist in diesem fall jacke wie hose. er bewegt sich im bereich von 35 bis 200. und er will ja nicht bei 0 aufhören, die geschwindigkeit zu erhöhen, sondern eben bei 35. einfach ein pfeilchen weg...

gruß stefan

Ich hatte es auch mit nur einem "ist größer" Zeichen versucht, aber das Ergebnis war das gleiche. Warum wird del negativ? es muss doch im positiven Zahlenbereich stehenbleiben, da ich mit den 33 ja kleiner als 50 bin und der Counter bei 35 stehen bleiben muss (200 -33 -33 -33 -33 -33). 35 ist dann nicht mehr größer als 50, if wird (sollte) nicht mehr ausgeführt werden und void Loop läuft ohne if weiter, oder?

Hallo,

a) du mußt schon > verwenden b) [u]ohne[/u] das Semikolon nach der Klammer klappt das auch

if (del > 50)
    {
      del = del - 33;
    }

Edit: es auch für später von Vorteil, wenn du die Variable "del" mit 200 gleich am Anfang auch so deklarierst und nicht erst da die nackte Variable und irgendwo später weist du ihr einen Startwert zu. Irgendwann verlierst du den Überblick. Also gleich int del = 200; // Delay-Startwert

Vielen Danke für die Hilfe und den Tipp! Jetzt passt es.

Kann mir bitte noch wer bei der zweiten Frage helfen?

Weiters: was muss ich machen, damit die LED an Pin B0 nicht mit der TX-LED mitblinkt, sondern durchgehend leuchtet? Ich verwende hier den Micro.

Ich verwende hier den Micro

Nicht den Micro verwenden oder einen anderen Pin anstelle des PB0. Kannst dir auch irgendwelche Pins aussuchen und immer 2 von 5 einzeln setzen+löschen. LED die dauernd leuchten sollen kannst du auch woanders anschliessen Die direkte PortManipulation kannst du ja jetzt. Kannst sie ja dann wieder wegschmeissen ;)

Hallo,

hier hat der nette User pighixxx für sämtliche Arduino Boards Pinouts erstellt. http://www.pighixxx.com/test/pinoutspg/boards/ Damit erkennst du die Unterschiede und siehst auch welche Register Pins zusammenhängend oder auch nicht wo liegen. Das ist wichtig wenn man direkte Portmanipulation macht wie du gerade. Sicherer wäre die Arduino Pinnummer zunehmen und in einer for Schleife der Reihe nach abzuarbeiten. Dann können die auch Querbeet verteilt sein. So als Bsp. Hat alles Vor- und Nachteile, kommt wie immer auf den Fall drauf an.

michael_x: ...LED die dauernd leuchten sollen kannst du auch woanders anschliessen ...

Ja, klar, hat sich nur gerade so ergeben, da diese 3 vorerst im Lauflicht dabei waren, es mir dann aber später anders besser gefallen hat.

Doc_Arduino: Hallo,

hier hat der nette User pighixxx für sämtliche Arduino Boards Pinouts erstellt. http://www.pighixxx.com/test/pinoutspg/boards/ Damit erkennst du die Unterschiede und siehst auch welche Register Pins zusammenhängend oder auch nicht wo liegen......

Das kannte ich, darum hatte ich ja gedacht, dass ich die Pins entsprechend ihrer Nummerierung verwenden kann. Ich dachte, man kann sich jede der Funktionen, die bei einer Anschlussnummer steht, aussuchen. Ich blicke da leider nicht wirklich durch.

Habe ich schon erwähnt, dass ich blutiger Anfänger bin?

LG Friedrich

Hallo,

ja man kann sich eigentlich jede Pin Funktion raussuchen. Praktisch gesehen klappt das nicht immer. Hinzu kommt, dass sich der Micro durch sein Hardware USB mit der seriellen eh anders verhält wie Uno und Mega.

Die LED an Pin SS/PB.0 ist da fest dran. Ich vermute die ist wie die TX LED in der Micro Firmware damit verbunden, damit man sieht ob über die serielle/USB Daten fließen. Sonst wäre man blind. Das heißt auch, wenn du über die serielle Debugging betreibst, flackert diese LED. Zwangsweise. Deswegen würde ich den Pin nicht verwenden.

Beim Micro und Leonardo muß man sich eh entscheiden ob man die serielle ständig benötigt oder nicht. So ein immer verfügbar aber nur nutzen je nach Laune wie bei Uno, Mega ist bei denen mit 32U4 nicht möglich.

Was im Micro Pinout leider eindeutig fehlt sind die Portnummer laut Arduino IDE Nummerrierung. Wo ist zum Bsp. die 13? Was sonst immer für ein schnellen Test mit LED gut ist. Das ist hier mit D13 bezeichnet. Die dunkelgrauen Nummern sind das nämlich nicht. Das sind die Pinummern laut original Atmel Datenblatt.

Ich würde vorschlagen, baue dir dein Pin Array selbst zusammen.

PinZugriff[8]={3,4,5,6,7,8,9,10};

Die Pins in der geschweiften Klammer kannste jederzeit abändern. Zugreifen tust du dann über das Array und dessen Nummer. PinZugriff[0] .... Pin 3 PinZugriff[1] .... Pin 4 PinZugriff[7] .... Pin 10

Damit kann man dann genauso bequem durch hoch- und runterzählen der Indexnummer (0...7) vom Array eine LED vor und zurück ansprechen. Egal wie durcheinander die Pins in Wirklichkeit benutzt werden.

buffalo64: Ich möchte ein Lauflicht per Portmanipulation laufen lassen.

buffalo64: Habe ich schon erwähnt, dass ich blutiger Anfänger bin?

Möchtest Du die Portmanipulation kennenlernen oder ein Lauflicht programmieren? Als Anfänger solltest Du Dir die Portmanipulation nur antun, wenn dies beispielsweise hinsichtlich Geschwindigkeit unbedingt notwendig sein sollte. Sonst ist es besser, so wie in #11 beschrieben zu verfahren.

Möchtest Du die Portmanipulation kennenlernen oder ein Lauflicht programmieren? Als Anfänger solltest Du Dir die Portmanipulation nur antun, wenn dies beispielsweise hinsichtlich Geschwindigkeit unbedingt notwendig sein sollte. Sonst ist es besser, so wie in #11 beschrieben zu verfahren.

So ähnlich war mein Tip damals auch gemeint. Nur nicht beschränkt auf den Fall "Als Anfänger" 8)

michael_x: Die direkte PortManipulation kannst du ja jetzt. Kannst sie ja dann wieder wegschmeissen ;)

Danke für die weiteren Erläuterungen. Ich dachte, dass die Portmanipulation einfacher ist, da ich mich hier nicht mit Bedingungen und Arrays rumschlagen muss (bei denen ich mich auskenne) und ich gleich direkt im Code sehe, was passiert. Ich versuche es nun mit der anderen Methode, da sie ja besser sein soll.

LG Friedrich

Hallo,

ich weis zwar nicht warum dich die LED auf dem Micro stört, dein Lauflicht wird bestimmt weiter weg sein, aber ansonsten gilt immer. Besser oder schlechter gibts nicht. Es kommt auf den Fall an.

Wenn du nun auf dem Micro wegen der TX LED keinen Port komplett frei hast, dann hilft nur ein Array um sich einen selbst zusammen zu bauen. Vorteil, Pins können liegen wo sie wollen. Erst die Zusammensetzung ergibt die Reihenfolge.

Wenn man sich überlegt, dass dieses Array im Grunde auch nur ein Port ist in dem Sinne darstellt, nur das die Bits/Pins einzeln durch Komma getrennt sind, kann man sicherlich eine Funktion basteln, die den Array Zugriff so aussehen läßt als wenn man direkt ein Register manipuliert. Die Funktion das dann "nur" intern übersetzt.

Wenn Du einen Mega nehmen würdest, hättest du mehrere freie Ports zur Auswahl. Auf dem Uno R3 Port.B, aber nur wenn du 2 Pins nachträglich zugänglich machst. PB.6 und PB.7 liegen im 4er Block hinter der USB Buchse. Port.D kann man auch nehmen, wenn man beim flashen immer wie Hölle aufpasst und und Pin 0,1 absteckt.