Forum: Mikrocontroller und Digitale Elektronik Gleichzeitiges LED aufleuchten


von Christof L. (Gast)


Lesenswert?

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

von blub (Gast)


Lesenswert?

Controller? Programmiersprache? Schaltplan?

von Stefan Frings (Gast)


Lesenswert?

Normalerweise würde man dazu Timer und Interrupt Routinen verwenden.

von Falk B. (falk)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Werner A. (Gast)


Lesenswert?

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.

von Charlie (Gast)


Lesenswert?

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

von Netiquette (Gast)


Lesenswert?

>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.

von Charlie (Gast)


Lesenswert?

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.

von Netiquette (Gast)


Lesenswert?

>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?

von Charlie (Gast)


Lesenswert?

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?

von Karl (Gast)


Lesenswert?

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

von Karl (Gast)


Lesenswert?

B=0 und B=1 kann man auch weglassen, vielleicht wird es so aber klarer.

von Peter D. (peda)


Lesenswert?

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

von Charlie (Gast)


Lesenswert?

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.

von Netiquette (Gast)


Lesenswert?

>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.

von Falk B. (falk)


Lesenswert?

@  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

von Ingo (Gast)


Lesenswert?

Ä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

von Karl (Gast)


Lesenswert?

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

von Charlie (Gast)


Lesenswert?

Vielen Dank Karl

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
Noch kein Account? Hier anmelden.