-         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Anfängerfragen für Schulprojekt

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.01.2009
    Ort
    Dortmund
    Alter
    23
    Beiträge
    114

    Anfängerfragen für Schulprojekt

    Anzeige

    Hi Leute!!

    ich habe im Moment ein Schulprojekt zum Thema Beleuchtungstechnik.. Wir sollen aus Sperrholz ne kleine Bühne bauen (Also ne Modellbühne).. Dann sollen wir auf dieser Bühne verschiedene Beleuchtungseffekte vorstellen..

    Da ich mit meiner Gruppe was besseres machen will, als die andern habe ich mich entschieden die LED's über einen AtMega 8 anzusteuern..

    Da ich in Bascom kein Genie bin und mich erlichgesagt mit dem Programm nur ein ganz kleines bisschen beschäftigt habe, bräuchte ich ein paar Tipps..

    So LED Blinken oder so macht ich einfach per I/O Output und dem waitms signal.. das sollte für das projekt reichen..

    Nun will ich aber auch LED's dimmen.. Also dass die LED vom ausgeschateten Zustand bis zur voll Power langsamm heller werden soll..


    Leider habe ich keine Ahnung, wie das geht.. Ich habe gehört, dass es i-wie mit Timern und PWM gemacht wird.. Aber ich habe das nicht wirklich verstanden..

    Kann mir einer dazu nen Tipp geben??

    Weil einfach nur an/aus über nen schalter ist mir zu langweilig.. Das machen die anderen Gruppen ja auch ^^


    Mfg Yannik

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    25
    Beiträge
    601
    Nun ja, PWM ist im Prinzip auch nichts anderes als sehr schnelles aus- und einschalten.

    Google mal nach "Software-PWM", da dürfte sich schon was finden lassen...

    Viele Grüße

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.01.2009
    Ort
    Dortmund
    Alter
    23
    Beiträge
    114
    Vielen Dank!!

    Also so müsste der Code jetzt richtig sein oder??

    Code:
    $regfile = "m8def.dat"
    $crystal = 4000000
    
    Config Portb.1 = Output
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up  , Prescale = 1
    
    Do
      Pwm1a = 205
    End

    Jetzt habe ich aber noch ein paar Fragen dazu, auf die ich bis jetzt keine Antwort geunden habe..

    1. Wenn ich das jetzt so eingebe, wird die LED ja einmal hell und dann direkt wieder dunkel.. Wie kann ich machen, dass sie nur hell wird und dann hell bleibt??

    2. Wie kann ich die Geschwindigkeit einstellen??

    3. Wie kann ich einen PWM-Wert vorgeben, der gehalten werden soll?? Also ich will nicht, dass es hoch bzw. runter geregelt wird, sondern, dass z.B. die LED nur 50% leuchtet.. Was muss ich dann da machen??


    Mfg Yannik

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    25
    Beiträge
    601
    Hi,

    das was jetzt in deinem Code steht, ist die Hardware-PWM der ATMegas. Die läuft völlig autonom vom eigentlichen Prozessor, der so alle Zeit der Welt hat, andere Dinge zu erledigen. Die Hardware-PWM ist so sehr schnell und sehr genau, allerdings kann das Signal nur an bestimmten Pins ausgegeben werden.

    Wieviele LEDs sollen denn angesteuert werden?

    Vorteil der Software-PWM: es können viele LEDs individuell gesteuert werden (auch an frei wählbaren Pins)

    Das hat aber dann den Nachteil, dass der Controller mit dem Steuern der LEDs beschäftigt ist, und nicht mehr viel Zeit für andere Dinge hat.

    Das Prinzip dieser Methode ist so einfach wie genial: ein Timer wird so eingestellt, dass er bei Überlauf in eine Interrupt-Routine verzweigt. Dort wird eine Variable bei jedem Durchlauf um 1 erhöht. Ist jetzt der Helligkeitswert der LED (die Vorgabe also) größer als diese Zählvariable, wird der Pin, an dem die LED hängt, auf log. 1 gestellt, ansonsten auf log. 0. Erreicht die Zählvariable den maximal möglichen Helligkeitswert, wird sie wieder auf 0 zurückgesetzt.

    Ich hoffe, das war jetzt einigemaßen verständlich

    Die LED leuchtet also immer nur so hell, wie das der Helligkeitswert angibt. Soll die LED dann langsam heller bzw. dunker werden, kannst du das einfach per Änderung der Helligkeitswerte im Hauptprogramm erreichen.

    Viele Grüße

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.01.2009
    Ort
    Dortmund
    Alter
    23
    Beiträge
    114
    Zitat Zitat von ikarus_177
    Das Prinzip dieser Methode ist so einfach wie genial: ein Timer wird so eingestellt, dass er bei Überlauf in eine Interrupt-Routine verzweigt. Dort wird eine Variable bei jedem Durchlauf um 1 erhöht. Ist jetzt der Helligkeitswert der LED (die Vorgabe also) größer als diese Zählvariable, wird der Pin, an dem die LED hängt, auf log. 1 gestellt, ansonsten auf log. 0. Erreicht die Zählvariable den maximal möglichen Helligkeitswert, wird sie wieder auf 0 zurückgesetzt.
    Sorry, aber ich versteh nur Bahnhof 8-
    Zitat Zitat von ikarus_177
    s_177"]Hi,
    Wieviele LEDs sollen denn angesteuert werden?
    Also nicht so viele!! Das soll nur nen ganz eifaches Projekt werden.. Also ich denke, es wird immer nur eine Aktion gleichzeitig sein.. Also erst heller werden, dann binken.. oder sowas in der art..

    Könntest du das mit dem Software-PWM nochmal genauer erklären.. Ich hab das nicht so wirklich verstanden.. Am besten mit BeispielCode..

    Oder nen Link, wos erklärt ist, wär auch gut xD

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    25
    Beiträge
    601
    Hi,

    gut

    Hier ein Beispielcode, den ich mal für thunder87 für sein Lauflichtprojekt geschrieben habe - ich denke, er hat nichts dagegen, wenn ich den Code hier reinstelle, ist ja schließlich nichts geheimes dran.

    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    $hwstack = 64
    $swstack = 64
    $framesize = 128
    '$sim
    
    Config Adc = Single , Prescaler = Auto
    Start Adc
    
    Config Timer0 = Timer , Prescale = 1
    On Timer0 Isr
    Enable Timer0
    
    Enable Interrupts
    
    
    Config Portc = Output
    Dim I As Byte
    Dim J As Byte
    Dim K As Word
    Dim W As Word
    
    Dim T As Byte
    Dim Wert(9) As Byte
    
    
    Start Timer0
    
    
    Portc = 255
    
    
    Do
    
    Wert(1) = Xx
    ...
    Wert(9) = Yy
    
    Loop
    
    Isr:
    
       Incr T
    
       If T >= 31 Then T = 0
    
       If T < Wert(1) Then Portc.0 = 0
       If T >= Wert(1) Then Portc.0 = 1
    
       If T < Wert(2) Then Portc.1 = 0
       If T >= Wert(2) Then Portc.1 = 1
    
       If T < Wert(3) Then Portc.2 = 0
       If T >= Wert(3) Then Portc.2 = 1
    
       If T < Wert(4) Then Portc.3 = 0
       If T >= Wert(4) Then Portc.3 = 1
    
       If T < Wert(5) Then Portc.4 = 0
       If T >= Wert(5) Then Portc.4 = 1
    
       If T < Wert(6) Then Portc.5 = 0
       If T >= Wert(6) Then Portc.5 = 1
    
       If T < Wert(7) Then Portc.6 = 0
       If T >= Wert(7) Then Portc.6 = 1
    
       If T < Wert(8) Then Portc.7 = 0
       If T >= Wert(8) Then Portc.7 = 1
    
       If T < Wert(9) Then Portd.7 = 0
       If T >= Wert(9) Then Portd.7 = 1
    
    Return
    Dieser Code kann also die Helligkeiten von 9LEDs in 256 Stufen regeln (es wären sicherlich auch noch mehr LEDs möglich).

    Viele Grüße

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.01.2009
    Ort
    Dortmund
    Alter
    23
    Beiträge
    114
    Hi,

    wow, vielen Dank!

    Aber gib es da nichts einfacheres??? Ich blick da nämlich nicht durch.. Wie gesagt.. Ich hatte mich nur einmal ganz kurz mit Microcontrollern beschäftigt...

    EDIT : Könntest du den Code so zurechtstutzen, dass nur noch eine LED von 0% auf 100% gedimmt wird?? Dann könnte ich das glaub ich besser verstehen.. Wäre dir auf jeden Fall sehr dankbar!!

  8. #8
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    25
    Beiträge
    601
    Hi,

    eigentlich ist es überhaupt nicht kompliziert

    Ich versuchs einfach nochmal: ein Timer wird so eingestellt, dass er in bestimmten Zeitabständen in ein Unterprogramm reinspringt, wo dann die LEDs angesteuert werden. Die Initialisierung des Timers ist die Geschichte mit
    Code:
    Config Timer0 = Timer , Prescale = 1
    On Timer0 Isr
    Enable Timer0
    Hier sagen wir ihm also, er soll nach einer gewissen Zeit (die hier eher nebensächlich ist, zumindest fürs Verständnis) zu der Stelle springen, die da heißt: Isr
    Das ist eher im unteren Codeabschnitt.

    Sagen wir, der Prozessor springt jetzt Hausnummer 1000Mal pro Sekunde in dieses Unterprogramm, also mit 1kHz. Bei jedem Durchlauf der Routine wird die Variable "T" um 1 erhöht. Da thunder87 256 Stufen zu viel waren, hab ich es hier auf 31 Stufen beschränkt. Erreicht die Variable also den Wert 31, wird sie wieder auf 0 zurückgesetzt und weiter fröhlich erhöht.

    Eine LED kann also maximal 31 "Zeiteinheiten" eingeschaltet sein. In meinem Beispiel geben die Wert(x)-Zahlen an, wie lange die LED AUSgeschaltet ist, man könnte es aber genausogut umgekehrt machen. Angenommen, der Wert, den wir haben wollen, ist 15, also ca. die Hälfte der Zeit. Jetzt kommt der Prozessor in die Unterroutine, die Zählvariable ist 0. Dank
    Code:
    If T < Wert(1) Then Portc.0 = 0
    ist die LED nun so lange ausgeschaltet, bis T den Wert von Wert(1) erreicht hat, in unserem Fall eben 15. Die restliche Zeit, also von 15-31, ist die LED nun eingeschaltet, danach wird die Variable wieder auf 0 gesetzt und das Spiel beginnt von neuem.

    Da diese Routine nun sehr oft in der Sekunde ausgeführt wird, merken wir das ständige Blinken der LED nicht - für das menschliche Auge erscheint die Helligkeit "gedimmt".

    Viele Grüße

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.01.2009
    Ort
    Dortmund
    Alter
    23
    Beiträge
    114
    Ahh.. Okay, ich glaube ich verstehs langsam.. Aber eine Sache ist mir noch unklar..


    Da thunder87 256 Stufen zu viel waren, hab ich es hier auf 31 Stufen beschränkt.
    Wo steht das in dem Code?? Bin ich blind oder was??

    bis T den Wert von Wert(1) erreicht hat, in unserem Fall eben 15.
    Warum entspricht die 1 da jetzt dem Wert 15?? Was wäre dann Wert(2)?? 30??

  10. #10
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    25
    Beiträge
    601
    Hi,

    das steht da:
    Code:
       If T >= 31 Then T = 0
    Wenn T also den Wert 31 erreicht, wird es auf 0 zurückgesetzt.

    Bei Wert(x) handelt es sich um ein Array, im Prinzip 9 zusammenhängende Variablen (da wir ja 9 LEDs haben). Auf die einzelnen Variablen kann durch einen sog. Index zugegriffen werden, der geht bei uns von 1-9. Wert(1) ist also eine eingenständige Variable (genauso wie Wert(8) oder Wert(6)) der einfach der gewünschte Helligkeitswert zugewiesen wird.

    Viele Grüße

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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