- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 23

Thema: 4 Led´s unabhängig per Zufall blinken lassen?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    die überlegung ist schonmal sehr gut! du legst einfach 4 counter fest und jedesmal wenn einer deiner counter abgelaufen ist, setzt du ihn mit einem neuen wert + (rnd() * zu variierendem Wert) ... aber unter der vorraussetzung, dass rnd() einen wert zwischen 0 udn 1 liefert, das weis ich leider grad nicht ^^

    beachte unbedingt, wenn du mit float arbeitest auch immer schön zu casten und die ergebnisvariablen richtig festzulegen, damit du keine kommastellen verlierst!

    achja das wichtigeste vergessen, in den counterüberläufen dekrementierst du deine counter bis sie 0 erreichen, vll. noch 4 variablen die signalisieren ob du für die jeweilige LLED gerade in die on oder off phase gehst! und fasse dich bei deinen bedingungen so kurz wie möglich, der interrupt darf nciht so lange dauern!
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Als Bascom-Laie würde ich es so versuchen:
    Code:
    $regfile = "m48def.dat"
    $crystal = 1000000
    $baud = 9600
    Config Timer0 = Timer, Prescale = 8
    
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    
    Dim I As Integer
    Dim Led1 As Byte
    Dim Led2 As Byte
    
    Const Timervorgabe = 131
    On Timer0 Timer_irq
    Enable Timer0
    Enable Interrupts
    
    Led1 = 51
    Led2 = 86
    
    Do
    
    Loop
    End
    
    Timer_irq:
    Timer0 = Timervorgabe
    
    If Led1 > 0 Then
       Decr Led1
    Else
       Toggle Pinb.1
       If Pinb.1 = 1 Then
          Led1 = 10                                             ' Anzeit
       Else
          Led1 = Rnd(10) + 51                                   ' Auszeit
       End If
    End If
    
    If Led2 > 0 Then
       Decr Led2
    Else
       Toggle Pinb.2
       If Pinb.2 = 1 Then
          Led2 = 10
       Else
          Led2 = Rnd(10) + 86
       End If
    End If
    
    Return
    (Ungetestet)

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Andree-HB
    Registriert seit
    10.12.2004
    Ort
    Bremen
    Alter
    54
    Beiträge
    2.807
    ....ich hatte mir für meine Lichtsteuerung von der letzten Party einfach Zufallszahlen generieren lassen und per if then mit festen Werten verglichen und geschaltet....

    à la
    if x =2 or x=4 or x=7 then Licht1an
    if x =1 or x=4 or x=8 then Licht2an

    ...usw.

    http://www.youtube.com/watch?v=Jk1I7pQMXlU&
    http://www.youtube.com/watch?v=UsCiMEjm3Cw
    [nachtrag]....habe mal wieder nur Alles halb durchgelesen, da sind ja noch ganz andere Anforderungen...
    Geändert von Andree-HB (19.07.2011 um 08:27 Uhr)

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    40
    Beiträge
    647
    Hi,

    danke für eure Antworten. Ich habe jetzt auch mal meinen Ansatz in Bascom umgesetzt.

    Code:
    $regfile = "m48def.dat"
    $crystal = 1000000
    
    Config Timer0 = Timer , Prescale = 8
    
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    
    Mg1 Alias Pinb.1
    Mg2 Alias Pinb.2
    Mg3 Alias Pinb.3
    Mg4 Alias Pinb.4
    
    Dim Mg1flag As Byte
    Dim Mg2flag As Byte
    Dim Mg3flag As Byte
    Dim Mg4flag As Byte
    Dim Mg1time As Integer
    Dim Mg2time As Integer
    Dim Mg3time As Integer
    Dim Mg4time As Integer
    Dim I As Integer
    
    Const Timervorgabe = 131
    On Timer0 Timer_irq
    Enable Timer0
    Enable Interrupts
    
    Mg1flag = 0
    Mg2flag = 0
    Mg3flag = 0
    Mg4flag = 0
    Mg1time = 0
    Mg2time = 0
    Mg3time = 0
    Mg4time = 0
    
    Do
    
    Loop
    End
    
    Timer_irq:
    Timer0 = Timervorgabe
    If Mg1time = 0 Then
       If Mg1flag = 0 Then
             Mg1time = Rnd(10) + 46     '46 weil ich gerne 51 +- 5 ms hätte
             Mg1 = 1
             Mg1flag = 1
       Else
            Mg1time = 10
            Mg1 = 0
            Mg1flag = 0
       End If
    End If
    
    If Mg2time = 0 Then
       If Mg2flag = 0 Then
             Mg2time = Rnd(10) + 46
             Mg2 = 1
             mg2flag = 1
       Else
            mg2time = 10
            mg2 = 0
            mg2flag = 0
       End If
    End If
    
    If Mg3time = 0 Then
       If mg3flag = 0 Then
             mg3time = Rnd(10) + 81
             mg3 = 1
             mg3flag = 1
       Else
            mg3time = 10
            mg3 = 0
            mg3flag = 0
       End If
    End If
    
    If mg4time = 0 Then
       If mg4flag = 0 Then
             mg4time = Rnd(10) + 81
             mg4 = 1
             mg4flag = 1
       Else
            mg4time = 10
            mg4 = 0
            mg4flag = 0
       End If
    End If
    
    Mg1time = Mg1time - 1
    Mg2time = Mg2time - 1
    Mg3time = Mg3time - 1
    Mg4time = Mg4time - 1
    
    Return
    Der ist allerdings auch noch ungetestet. Es geht sicherlich noch einfacher da muss ich nochmal ran und optimieren. Ich gucke nachher mal in Bascom wielange ein IRQ braucht. Dann muss ich evtl auf 2ms "Auflösung" gehen oder ich setz die Fuses auf 8Mhz dann wirds wohl reichen!? Soo Zeitkritisch ist das ganze nicht. Ob ich überhaupt mit den Zeiten so klar komme oder ob ich die Pausen länger ziehen muss weiss ich auch noch nicht. Aber ich denke das gröbste ist geschafft.

    EDIT: Ok ich muss die Fuses für 8Mhz setzen. Mit 1Mhz schafft er die IRQ nicht rechtzeitig zu beenden. Bei 8Mhz schafft er es ganz locker.

    @Mic: Deine Lösung scheint schonmal etwas kürzer zu sein. Das werde ich mir nachher mal genauer ansehen. Durch den Toggle Befehl würde ich ja schonmal die Flags und deren Abfrage sparen.

    Danke
    Gruß Daniel
    Geändert von DanielSan (19.07.2011 um 09:39 Uhr)
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    40
    Beiträge
    647
    So hab jetzt mein Programm ausprobiert.
    Irgendwie spuckt der Befehl:
    rnd(10)
    aber nicht die Gewünschten Zufallszahlen von 0-9 aus sondern von 0-5500 (oderso).

    Ein weiteres Problem ist, das die Zeiten für "an" und "aus" scheinbar gleich lang sind. Wenn ich die "an"Zeit auf 1000 setze, ist die Led genauso lange an wie aus!?

    Gruß Daniel
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Ich programmiere selten mit Bascom und habe das jetzt mal mit dem Simulator überprüft:
    Code:
    ...
    Dim I As Integer
    Dim J As Integer
    Dim Led1 As Byte
    Dim Led2 As Byte
    
    Const Timervorgabe = 131
    On Timer0 Timer_irq
    Enable Timer0
    Enable Interrupts
    
    Led1 = 51
    Led2 = 86
    J = 0
    
    Do
    I = Rnd(10)
    Incr J
    Loop
    End
    ...
    Tatsächlich zeigt der Simulator im Watch-Modus nach immer der selben Anzahl von J-Durchläufen einen I-Wert von über 9! In der ersten Variante ohne J war der I-Wert über 9 aber wiederrum ganz anders. Interessanterweise funktioniert rnd() scheinbar richtig, wenn man den Timer0-Interrupt nicht freigibt oder alle Interrupts gesperrt sind. Vielleicht verwendet rnd() irgendwie den Timer0? Seltsam und wieder typisch Bascom..

    [Edit]
    Weil ich auch was sehen will habe ich das Programm an meinen asuro (8 MHz Mega8) angepasst:
    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    $baud = 2400
    Config Timer0 = Timer , Prescale = 64
    
    Config Pind.2 = Output
    Config Pind.3 = Output
    
    Dim I As Integer
    Dim J As Integer
    Dim Led1 As Integer
    Dim Led2 As Integer
    
    Const Timervorgabe = 131
    On Timer0 Timer_irq
    Enable Timer0
    Enable Interrupts
    
    Led1 = 51
    Led2 = 86
    J = 0
    
    Print "Hallo"
    Print
    Do
    I = Rnd(10)
    Incr J
    If I > 9 Then
       Print "I: " ; I
       Print "J: " ; J
       Print
       J = 0
    End If
    Loop
    End
    
    Timer_irq:
    Timer0 = Timervorgabe
    
    If Led1 > 0 Then
       Decr Led1
    Else
       Toggle Portd.2
       If Pind.2 = 1 Then
          Led1 = 500                                            ' Anzeit
       Else
          Led1 = 500                                            ' Auszeit
       End If
    End If
    
    If Led2 > 0 Then
       Decr Led2
    Else
       Toggle Portd.3
       If Pind.3 = 1 Then
          Led2 = 200
       Else
          Led2 = Rnd(400) + 500
       End If
    End If
    
    Return
    Ausgabe auf dem Bascom-Terminal:
    Code:
    Hallo
    
    I: 4767
    J: 13
    
    I: 61
    J: 1
    
    I: 116
    J: 9
    
    I: 172
    J: 28
    
    I: 59
    J: 5
    
    I: 10
    J: 53
    
    I: 180
    J: 6
    
    I: 176
    J: 38
    
    I: 14
    J: 2
    
    I: 164
    J: 10
    
    I: 157
    J: 14
    
    I: 46
    J: 57
    
    I: 71
    J: 63
    
    I: 113
    J: 16
    Verblüffend

    btw. muss es Toggle PORTx.y lauten...

    [Edit2]
    So scheint es zu funktionieren:
    Code:
    Disable Interrupts
    I = Rnd(10)
    Enable Interrupts
    Geändert von radbruch (19.07.2011 um 20:28 Uhr)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    das finde ich jetzt aber EXTREM interessant, da wir uns beim ausführen des rnd() IN einer ISR befinden dürften die Interrupts doch gar nicht eingeschalten sein oder? ! ? !

    Oder steh ich aufm Schlauch ? !

    Bye the Way, dein Enable Interrupt nach dem Rnd() hätte fatale Auswirkungen innerhalb der ISR!
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Ähnliche Themen

  1. Led blinken lassen mit Timer0
    Von sky2 im Forum PIC Controller
    Antworten: 2
    Letzter Beitrag: 25.12.2009, 18:33
  2. LED blinken lassen während Programm normal weiterläuft
    Von Steffen08 im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 30.03.2009, 21:10
  3. LED im 1 oder 2 sek. Takt per Interrupt blinken lassen
    Von rogerberglen im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 17.04.2007, 19:51
  4. Led's unabhängig voneinander blinken lassen
    Von Thorsten75 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 20.03.2007, 12:41
  5. LED´s per Zufall leuchten lassen
    Von Hoomer im Forum Elektronik
    Antworten: 11
    Letzter Beitrag: 05.02.2006, 14:45

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test