Hallo an alle, ich sitze jetzt seit mehreren Stunden dran 2 LED`s gleichzeitig zum Laufen zu kriegen. Eine LED(LED1) soll 2 mal aufblinken die andere LED(LED2) soll 5 mal aufblinken. Dies soll jedoch nicht im Wechselpassieren. Das heißt das beiden sollen zur gleichen zeit anfangen und dann blinken. Bis jetzt habe ich es jedoch immer nur hinbekommen das die LED1 aufblinkt dann LED2 aufblinkt und dann wieder LED1 usw. Kann mir da jemand helfen? Gruß Christof
Normalerweise würde man dazu Timer und Interrupt Routinen verwenden.
Zeichne ein Zeitdiagramm deiner beiden LEDs auf Kästchenpapier und denk mal drüber nach, was wann passiert, sprich wann dein Mikrocontroller welche LED wie schalten muss.
Christof L. schrieb: > Hallo an alle, > > ich sitze jetzt seit mehreren Stunden dran 2 LED`s gleichzeitig zum > Laufen zu kriegen. Eine LED(LED1) soll 2 mal aufblinken die andere > LED(LED2) soll 5 mal aufblinken. > Dies soll jedoch nicht im Wechselpassieren. Das heißt das beiden sollen > zur gleichen zeit anfangen und dann blinken. Bis jetzt habe ich es > jedoch immer nur hinbekommen das die LED1 aufblinkt dann LED2 aufblinkt > und dann wieder LED1 usw. > Kann mir da jemand helfen? Jep. Kleinste gemeinsame Basis deiner Zeiten ist 1 Sekunde. Wenn du also nach 2 Stück 1 Sekundenintervallen die eine LED umschaltest und die andere nach 5 Stück 1 Sekunden Intervallen, dann machen deine LED genau das was du willst. Da ich davon ausgehe, dass du mit Timern und ISR noch nicht umgehen kannst (so würde man das dann letzten Endes korrekt machen): LedCount1 = 0; LedCount2 = 0; while( 1 ) { LedCount1++; if( LedCount1 == 2 ) { LedCount1 = 0; Led 1 umschalten } LedCount2++; if( LedCount2 == 5 ) { LedCount2 = 0; Led 2 umschalten } _delay_ms( 1000 ); } Edit: Ooops. merke gerade: du hast ja gar nichts über Zeiten gesagt. Eine LED soll 2 mal aufblinken, IN WELCHEM ZEITRAUM? Egal: Das Grundrezept bleibt erst mal dasselbe, nur ein paar Zahlenwerte ändern sich.
Wenn du ganz auf Steuerlogik für die LEDs verzichten möchtest, legst du in einem festen Zeittakt ein Bitmuster auf deinen Ausgabeport, dass zyklisch aus einer Tabelle gelesen wird. In der Tabelle ist für jeden Zeitschritt festgelegt welche LED wann aktiviert ist.
Moin, ich habe ca. das selbe problem werde aber aus den Antworten nicht viel schlauer da ich neuling bin. Ich hab mal das gepostet was ich mir so gedacht hatte jedoch so nicht funktioniert. Bei demm Programm soll die LED1 sowie die LED2 Leuchten. Bitte um Hilfe möglichst für Dummis wie mich :) Danke im Vorraus ______________________________________________ $regfile = "m8def.dat" 'Prozessorauswahl $crystal = 3686400 'LED_Rot an PD.2 Led1 Alias Portd.2 Config Led1 = Output 'LED_Gelb an PD.3 Led2 Alias Portd.3 Config Led2 = Output Dim A As Byte A = 0 Dim B As Byte B = 0 Do If A = 0 Then Gosub Lampe1 Elseif B = 0 Then Gosub Lampe2 End If Loop End Lampe1: Led1 = 1 Wait 2 Led1 = 0 Wait 1 Return Lampe2: Led2 = 1 Wait 1.5 Led2 = 0 Wait 1 Return
>Bitte um Hilfe möglichst für Dummis wie mich Aber gerne. Zunächst lies mal die http://www.mikrocontroller.net/articles/Netiquette#Klare_Beschreibung_des_Problems Wir wissen weder was Du genau erreichen willst, noch in welcher Weise das Dein Programm tun soll, noch was Du nun im Gegensatz zu dem, was Du möchtest, tatsächliche beobachtest. Diese Informationen solltest Du noch ergänzen, bitte.
Achso okay, also ich habe mir vor eine Seekarte zu kaufen und sitze seit mehreren Tagen dran Led's gleichzeitig laufen zu lassen. Jedoch laufen diese immer nur im Wechsel oder garnicht. Die Led's sollen später die Leuchttonnen/Leuchttürme etc darstellen. Dazu hatte ich schon einmal 2 Kennungen hinbekommen jedoch jede einzeln. Nun wollte ich sie zusammenfügen sodass beide LED's mit Verschiedenen Kennungen leuchten. Dann hatte ich mir gedacht das ich das erstmal vereinfacht hinschreibe und daran rumprobiere weil das ja etwas übersichtlicher ist als das andere. Nun wisst ihr was ich damit vorhabe, also das es auch einen Sinn hat. Würd mich freuen wenn jemand auf einfacher weise helfen kann.
>Nun wisst ihr was ich damit vorhabe, also das es auch einen Sinn hat.
Obwohl das durchaus nicht uninteressant ist, ist danach garnicht gefragt
worden. Und das wonach gefragt worden ist, wurde nicht beantwortet.
Du hast es anscheinend immerhin versucht deswegen noch ein Versuch:
Was genau, im Detail, soll das Programm tun?
Auf welche Weise soll welcher Teil des Programmes welches Detail
erfüllen?
Was genau, im Detail, geschieht tatsächlich?
Das Programm soll LED1 und LED2 jeweils mit deren Eigenen Kennung abarbeiten. Dies soll gleichzeitig passieren und nicht erst die eine Kennung von LED1 und danach die von der LED2. Im moment so wie das Programm oben steht läuft nur die Kennung von LED1 also die LED ist 2 Sekunden an und 1 aus. Danach wiederholt sich das und LED2 bleibt durchgehend aus. Hoffe das dies deine Frage beantwortet hat?
So richtig weiß ich auch nicht, was Charlie machen will. Der Code macht folgendes:
1 | LED1=AN |
2 | Warte 2s |
3 | LED1=AUS |
4 | Warte 1s |
und das Ganze wieder von vorn. Falls auch mal LED2 und LED1 + LED2 im Wechsel leuchten sollen, sollte dort stehen:
1 | Lampe1: |
2 | Led1 = 1 |
3 | Wait 2 |
4 | Led1 = 0 |
5 | Wait 1 |
6 | A=1 'hier A=1 eingefügt |
7 | B=0 'hier B=0 eingefügt |
8 | Return |
9 | |
10 | Lampe1: |
11 | Led1 = 1 |
12 | Wait 2 |
13 | Led1 = 0 |
14 | Wait 1 |
15 | A=0 'hier A=0 eingefügt |
16 | B=1 'hier B=1 eingefügt |
17 | Return |
B=0 und B=1 kann man auch weglassen, vielleicht wird es so aber klarer.
Nimm eine Statemaschine je LED:
1 | void kennung0() |
2 | {
|
3 | static uint16_t ms = 0; |
4 | switch( ms ){ |
5 | case 1000: |
6 | ms = 0; |
7 | case 500: |
8 | LED0 = 0; break; |
9 | case 750: |
10 | case 250: |
11 | LED0 = 1; break; |
12 | }
|
13 | ms++; |
14 | }
|
15 | |
16 | void kennung1() |
17 | {
|
18 | static uint16_t ms = 0; |
19 | switch( ms ){ |
20 | case 800: |
21 | ms = 0; |
22 | case 400: |
23 | LED1 = 0; break; |
24 | case 600: |
25 | case 200: |
26 | LED1 = 1; break; |
27 | }
|
28 | ms++; |
29 | }
|
30 | |
31 | int main() |
32 | {
|
33 | init(); |
34 | for(;;){ |
35 | kennung0(); |
36 | kennung1(); |
37 | _delay_ms( 1 ); |
38 | }
|
Die Zeiten und States kannst Du beliebig wählen und auch noch mehr LEDs einfügen. Peter
Ja das ist es ja die sollen nicht im wechsel laufen sondern beide mit verschiedenen Kennungen zb. Anfang Programm / \ / \ / \ LED1 An LED2 An Warte 1s Warte 1s\ Led1 aus Warte 1s - (Warte 3s) Warte 1s Warte 1s/ Led1 An Led2 aus Warte 1s Warte 1s\ Led1 aus Warte 1s - (warte 3s) Warte 1s Warte 1s/ LED1 An LED2 An Warte 1s Warte 1s\ Led1 aus Warte 1s - (Warte 3s) Warte 1s Warte 1s/ Led1 An Led2 aus Warte 1s Warte 1s\ Led1 aus Warte 1s - (warte 3s) Warte 1s Warte 1s/ \ / \ / Ende Programm so soll das quasi ablaufen das beide Kennungen an und aus gehen und das nicht nacheinander/abwechselnd.
>so soll das quasi ablaufen das beide Kennungen an und aus gehen und das >nicht nacheinander/abwechselnd. Mach' es, wie Peter es beschrieben hat. Das wird für uns alle das einfachste sein.
@ Charlie (Gast) >gedacht hatte jedoch so nicht funktioniert. Bei demm Programm soll die >LED1 sowie die LED2 Leuchten. >Bitte um Hilfe möglichst für Dummis wie mich :) Wie wäre es, wenn du mal die Hinweise beachten würdest und mal AKTIV was tust? Deine kleinste Zeiteinheit scheint 0,5s zu sein. In dem Raster musst du nun deine LEDs ein und aus schalten. Mit etwas Grips kein Thema.
1 | $regfile = "m8def.dat" |
2 | 'Prozessorauswahl |
3 | $crystal = 3686400 |
4 | |
5 | 'LED_Rot an PD.2 |
6 | Led1 Alias Portd.2 |
7 | Config Led1 = Output |
8 | |
9 | 'LED_Gelb an PD.3 |
10 | Led2 Alias Portd.3 |
11 | Config Led2 = Output |
12 | dim zeit1 as byte |
13 | dim zeit2 as byte |
14 | |
15 | Do |
16 | Gosub Lampe1 |
17 | Gosub Lampe2 |
18 | wait 0.5 |
19 | Loop |
20 | End |
21 | |
22 | Lampe1: |
23 | if zeit1=0 then Led1 =1 |
24 | if zeit1=4 then Led1 =0 |
25 | zeit1 = zeit1+1 |
26 | if zeit1=6 then zeit1=0 |
27 | Return |
28 | |
29 | Lampe2: |
30 | if zeit2=0 then Led2 = 1 |
31 | if zeit2=3 then Led2=0 |
32 | zeit2 = zeit2+1 |
33 | if zeit2=5 then zeit2=0 |
34 | Return |
Äh, wo ist denn jetzt noch das Problem, hier wurden doch mehrere Lösungen vorgestellt. Mit nem Timer sicherlich eleganter, aber für dich wahrscheinlich unlösbar. Ingo
Bin immer noch nicht sicher, ob ich die Kennung richtig umgesetzt habe, aber so könnte es mit Timer aussehen:
1 | $regfile = "m8def.dat" |
2 | $crystal = 3686400 |
3 | |
4 | Config Timer1 = Timer , Prescale = 64 |
5 | On Timer1 Timer1_isr |
6 | Enable Interrupts |
7 | Enable Timer1 |
8 | |
9 | Dim Sekunden As Byte |
10 | |
11 | Led1 Alias Portd.2 |
12 | Config Led1 = Output |
13 | |
14 | Led2 Alias Portd.3 |
15 | Config Led2 = Output |
16 | |
17 | Do |
18 | |
19 | Select Case Sekunden |
20 | |
21 | Case 1: |
22 | |
23 | Led1 = 1 |
24 | Led2 = 1 |
25 | |
26 | Case 2: |
27 | |
28 | Led1 = 0 |
29 | Led2 = 1 |
30 | |
31 | Case 3: |
32 | |
33 | Led1 = 1 |
34 | Led2 = 1 |
35 | |
36 | Case 4: |
37 | |
38 | Led1 = 0 |
39 | Led2 = 1 |
40 | |
41 | Case 5: |
42 | |
43 | Led1 = 1 |
44 | Led2 = 0 |
45 | |
46 | Case 6: |
47 | |
48 | Led1 = 0 |
49 | Led2 = 1 |
50 | |
51 | Case 7: |
52 | |
53 | Led1 = 1 |
54 | Led2 = 1 |
55 | |
56 | Case 8: |
57 | |
58 | Led1 = 0 |
59 | Led2 = 1 |
60 | |
61 | End Select |
62 | |
63 | Loop |
64 | |
65 | |
66 | Timer1_isr: |
67 | Incr Sekunden |
68 | Timer1 = 7936 |
69 | If Sekunden > 8 Then Sekunden = 0 |
70 | Return |
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.