Aus meiner main-Loop bzw. anderen gosubs werden die drei Arrays für 7
rote, grüne und blaue LEDs befüllt mit Werten zwischen 0 und 100. Je
nach Zahlenwert sollen die LEDs unterschiedlich hell leuchten.
Ich möchte dabei das dargestellte "Bild" alle 10 ms refreshen um
Flackern zu vermeiden, sprich das Array wird mit gooz (go Oberzyklus)
neu geladen. Zwischen jedem Oberzyklus sollen 100 Unterzyklen
stattfinden und je nach Helligkeitswert sollen die LED unterschiedlich
lange leuchten (PWM). Dazu zählt eine for-Schleife das Array runter und
danach prüft eine if-Abfrage ob der Wert der jeweiligen LED 0 ist und
schaltet die LED ggf. ab.
Ich muss das leider mit toggle machen, denn die LEDs sind zum Teil
common-cathode und common-anode.
Fällt jemandem was ein wie ich den Code im Interrupt gouz und dem davon
kontrollierten gooz eindampfen könnte bei selber Funktion?
Nochmal die Anforderungen: Ein Array mit Werten zwischen 0 und 100 wird
ausgelesen und dementsprechend sollen die LEDs gedimmt werden. Dazu soll
ein ADC-Wert die Gesamthelligkeit steuern (wird nicht laufend
ausgelesen), indem er vom Array jeweils bis maximal 100 abzieht.
Unterzyklus (gouz) ist interruptgesteuert und wird alle 100 µs
ausgelöst, Oberzyklus (gooz) alle 100 Unterzyklen ausgeführt, also alle
10 ms.
Oder schafft das ein ATmega8 @ 16 Hz auch so?
Gruß
Kürzer wirst Du sicher, wenn Du in dem Fall auf Aliase verzichtest,
sondern direkt auf den Ports arbeitest - dann kannst Du mit
Bitmaskenoperationen mehrere resp. alle Bits auf einmal schalten oder
negieren.
PortB = &B01000100 ist kürzer als
PortB.0=0
PortB.1=0
PortB.2=1
usw.
if-else-cases sind schonmal gut, die habe ich ggleich eingebaut, frisst
der Compiler ohne zu meckern.
@Rainer Unsinn: Sehe ich ein, das kann ich aber nicht bei Port C machen,
da ich dort zwei Pins habe - beim Googeln habe ich keine Möglichkeit
gefunden zwei Pins auszuschließen aus einer Bitmaskenoperation.
Doch das geht prinzipiell so:
Variable = PortC
zum setzen auf 1:
Variable = Variable OR Bitmaske, zu setzende Bits=1, unveränderliche=0
zum setzen auf 0:
Variable = Variable UND Bitmaske, zu löschende Bits=0, unveränderliche=1
PortC = Variable
Ich hoffe, ich hab mich nicht vertan.. :-)
Dass du jetzt aber eine generelle Funktionsänderung hast ist gewollt?
Vorher:
If Rot(1) = 0 Then
Toggle 1r
End If
If Rot(2) = 0 Then
Toggle 2r
End If
Also egal welchen Wert Rot(1) hatte, der zweite Vergleich wird trotzdem
ausgeführt.
Jetzt:
If Rot(1) = 0 Then
Toggle 1r
Elseif Rot(2) = 0 Then
Toggle 2r
Also werden die weiteren Vergleiche nur ausgeführt wenn Rot(1)<>0 ist,
ansonsten wird alles hinter elseif ignoriert. Gilt dann natürlich analog
für Rot(2)<>0 usw.
Die erste Version kannst du auch kompakter und damit übersichtlicher
schreiben:
If Rot(1) = 0 Then Toggle 1r
If Rot(2) = 0 Then Toggle 2r
If Rot(3) = 0 Then Toggle 3r
Wenn du Elseif statt If verwendest, wird nur die erste erfüllte
Bedingung ausgeführt und dann der Rest der If-Else-Reihe übersprungen.
Ich denke nicht, dass das in deinem Sinne ist...
Rotkopie hat laut "Dim Rotkopie(7) As Byte" Byteelemente. Die Inhalte
können also nicht kleiner 0 werden, oder. Geht das? Wird
"Rotkopie(uzvar) = 0" (und gleich aufgebaute Codestücke) irgendwann
ausgeführt?
tested? schrieb:> Warum mit var und nicht gleich>> PORTC = PORTC and &b11110111 ' clear bit 3>> etc
Damit erst das Endergebnis von allen Operationen auf dem Port sichbar
ist und nicht alle Zwischenschritte. Das wäre in diesem Fall
wahrscheinlich nicht so relevant, aber tut auch nicht weh :-)
Edit: Man könnte natürlich auch alles in einem Schritt machen. Etwa so:
Danke @paul pahl und simpel.
@paul pahl
Brauche ich da kein end if?
@port auf einmal:
Geht das tatsächlich schneller?
Port B und D habe ich jetzt als Register zum Auf-Einmal-setzen, C noch
manuell.
Kann ich eigentlich auch direkt das Ergebnis einer logischen Aussage wie
(rot(1)>0) bzw. NOT (rot(4)>0) auf einen Port geben?
Also so:
Portxyz = (rot(1)>0)?
Würde sehr viele if-Abfragen und Codezeilen sparen. Außerdem fällt die
Toggelei weg und ich schreibe den Wert sauber direkt auf die LEDs statt
sie zwischendurch kurz anzuschalten.
Ich will ja nicht trollen, aber wenn ich mir diesen Code anschaue, dann
verstehe ich die ab und zu auftauchenden Kommentare nach dem Schema
"nimm BASCOM, das ist nicht so kryptisch wie C" immer weniger.
greg schrieb:> Ich will ja nicht trollen, aber wenn ich mir diesen Code anschaue, dann> verstehe ich die ab und zu auftauchenden Kommentare nach dem Schema> "nimm BASCOM, das ist nicht so kryptisch wie C" immer weniger.
Das könnte ein C Anfänger genau so Zeile für Zeile geschrieben haben.
Dabei wäre dann C auch nicht besser.
Nein - ich programmiere nicht mit BASCOM.
> Brauche ich da kein end if?
Nicht wenn alles in einer Zeile steht, erst wenn ein ganzer
Anweisungsblock folgt muss dieser mit endif abgeschlossen werden.
> verstehe ich die ab und zu auftauchenden Kommentare nach dem Schema> "nimm BASCOM, das ist nicht so kryptisch wie C" immer weniger.
Sehr witzig. Obigen Code versteht sogar mein Kater, bei C würde er nur
einen Buckel machen und fauchen...