Hallo, Schaut euch mal das Video hier an: http://www.modellbau-buers.de/Ebay/drehleiter.wmv Wie man sieht blinken die LEDs auf dem dach komplett unabhängig voneinander. Hat jemand ne Ahnung wie ich sowas in Bascom hinbekomme? Ein Doppelblitz bekomme ich mit WaitMS hin, aber sobald ich zwei unabhängige LEDs habe funktionierts nicht mehr. Hat jemand eine Idee? Dank im Voraus, Alex
So wie ich das sehe, sind die LEDs aber nicht unabhänig voneinander. Die beiden oberen haben den gleichen Takt und die unteren auch. Mit waitms kommst du da aber nicht sehr weit, weil das warten den AVR blockiert. Du solltest dazu einen Timer verwenden.
>Hat jemand eine Idee?
Ja. Vergiß "WaitMS". Lerne, was Timer sind und wie man sie einsetzt
und was für wunderbare Sachen man damit anstellen kann (nämlich
Multitasking).
Konfigurier einen Timer so, dass er (ungefähr) alle 20 ms einen
Interrupt auslöst. Richte zwei Variablen "a" und "b" ein. Schreib in
den Interrupthandler diesen Beispielcode (Anpassung auf Basic ist Deine
Aufgabe):
1 | TimerInterrupt:
|
2 | |
3 | Inc(a); |
4 | IF (a==20) a = 0; |
5 | |
6 | IF ((a>0) AND (a<3)) OR ((a>6) AND (a<9)) |
7 | {
|
8 | [LED 1 einschalten] |
9 | }
|
10 | ELSE
|
11 | {
|
12 | [LED 1 ausschalten] |
13 | };
|
14 | |
15 | |
16 | Inc(b); |
17 | IF (b==23) b = 0; |
18 | |
19 | IF ((b>0) AND (b<3)) OR ((b>6) AND (b<9)) |
20 | {
|
21 | [LED 2 einschalten] |
22 | }
|
23 | ELSE
|
24 | {
|
25 | [LED 2 ausschalten] |
26 | }
|
27 | |
28 | reti
|
Herauszufinden, wie und warum das zwei tolle unabhängig voneinander blitzende Lichter ergibt, überlass ich Dir :-).
Hallo, Mit den Timern habe ich mich beschäftigt. Was bdeutet das: IF (b==23) b = 0; ? Wie werden die Variablen Hochgezählt? Die LEDs sollen Zweimal ganz kurz Blinken und dann etwas länger ausgehen (2x 20ms an und dann ca. 150ms aus) Gruss Alex
B=23 würde bedeuten die Variable B nimmt den Wert 23 an. B==23 ist ein Vergleich: ist der Inhalt der Variable B 23?
Hallo, Wenn B = 0 soll er B auf 20 setzen? Was ergibt daa für einen Sinn? Gruss Bernd
>Mit den Timern habe ich mich beschäftigt. :-) >IF (b==23) b = 0; ? Das bedeutet "Prüfe, ob die Variable b den Wert 23 hat; wenn das zutrifft, setze b auf den Wert 0". >Wie werden die Variablen Hochgezählt? Durch die Zeilen Inc(a) und Inc(b). "Inc" = "inkrementiere" = zähle um Eins hoch. Wenn Du Inc nicht magst, kannst Du es genausogut mit "a = a + 1" resp. "b = b + 1" erledigenn. >Die LEDs sollen Zweimal ganz kurz Blinken und dann etwas länger ausgehen >(2x 20ms an und dann ca. 150ms aus) Das Anpassen der Werte (20, 23, 3, 6, 9 etc.) an Deine Wünsche solltest Du alleine hinkriegen können.
Kaum zu glauben, Das funktioniert tatsächlich! Vielen vielen Dank! Jetzt muss ich nur noch diese größer kleiner Sache umgehen, da das für einen Tiny zu viel Speicherplatz frisst. Das ist ja das Problem bei Hochsprachen, eine Zeile in Bascom (Oder auch C) ist oft 100 Zeilen in Assembler. Gruss Ale
>Kaum zu glauben, >Das funktioniert tatsächlich! lach Das freut mich. Aber ich möchte Dir ans Herz legen, auch versuchen zu verstehen, warum das so funktioniert, d. h. den Sinn des Timers und der Zählvariablen a und b, und inwiefern hier zwei Tasks parallel ablaufen (je einer für jede LED nämlich). Setz Dich ruhig einmal damit auseinander. >Jetzt muss ich nur noch diese größer kleiner Sache umgehen, da das für >einen Tiny zu viel Speicherplatz frisst. Oh - dann wechsel doch zu Assembler. Soooooo wahnsinnig schwierig ist das nun auch wieder nicht. Außerdem kannst Du ja hier um Rat fragen, wenn was nicht klappt. Gruss zurück
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.