-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: 230V dimmer softwarefrage

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    06.01.2007
    Beiträge
    52

    230V dimmer softwarefrage

    Anzeige

    Guten Abend zusammen,
    habe einen Dimmer aufgebaut mit Hilfe der schaltpläne von pcdimmer.de
    und ein paar Code schnipseln hier aus dem Forum.
    Jetzt läuft der dimmer einwandfrei. Nur kann ich leider aus nachfolgendem Problem nur eine Lampe dimmen.
    Aktuell wird beim mega8 bei jedem Nulldurchgang der Sinusspannung ein interruptaus gelöst und ein Timer gestartet der in abhängigkeit der Timervorgabe den Triac zündet. Also wird das Dimmen durch die Timervorgabe gesteuert. wenn ich jetzt aber mehrere Lampen dimmen möchte bräuchte ich ja auch mehrere Timervorgaben bzw Dimmer.
    Es müsste aber auch irgendwie möglich sein ohne die Timervorgabe zu regelen.
    Ich hatte irgendwie dran gedacht das man den Timer auf 20 msec (Also eine Halbwelle) einstellt und mit dem Nulldurchgang startet und dann für jeden Port der dann den Triac schaltet eine abfrage macht wie weit der Timer ist und dann den Triac zündet.
    Nur leider kann ich diese Idee nciht so richtig in Code umsetzten.
    Bitte um Hilfe
    Gruß Bastian07

    Anbei noch der aktuelle Code:
    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    $baud = 9600
    
    Config Portc.0 = Output
    Config Pind.4 = Input
    Config Pind.3 = Input
    
    Config Portd.6 = Output                                     'leds für min max
    Config Portd.7 = Output
    
    Triac Alias Portc.0
    
    Portd.4 = 1
    Portd.3 = 1
    
    
    Config Timer1 = Timer , Prescale = 1
    
    Config Int0 = Change
    On Int0 Int0_isr
    
    On Timer1 Timer_irq
    
    Enable Timer1
    Enable Int0
    
    Enable Interrupts
    
    Dim X As Word
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    
    X = 0
    
     Do
     If Pind.4 = 0 Then
       Incr X
       Waitus 10
     End If
    
     If Pind.3 = 0 Then
       Decr X
       Waitus 10
     End If
    
    
    
    If X > 64000 Then
       X = 64001
       Portd.6 = 1
       Portd.7 = 0
       End If
    
    If X < 1 Then
       X = 1
       Portd.6 = 0
       Portd.7 = 1
    End If
    
    Loop
    
    Int0_isr:
      Start Timer1
    Return
    
    
    Timer_irq:
     Set Triac
     Timer1 = X
      Stop Timer1
    
      Waitus 100
      Reset Triac
    Return

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Hallo, hab nur überflogen aber vielleicht so:
    Mit dem Timer nur je eine Variable pro Dimmer hochzählen und wenn die Variable einen bestimmten Wert erreicht hat, wird sie auf 0 zurückgesetzt und dein Dimmercode wird einmal gestartet - nebenbei wird deine Variable ja wieder hochgezählt und startet bald wieder deinen Dimmercode
    ABER teste erstmal so nur einen Dimmer - weiß nicht wieviele Dimmer der µC zeitmäßig schafft nicht das die Zykluszeit zusammenbricht und die Dimmer flimmern oder nuroch blinken...

    gruß, Tobias


    Code:
    Do
    
    if Dimmer1 =>50 then 'statt der Zahl (50) warscheinlich eine Variable?
    Dimmer1 = 0
    'und hier der Code der sonst in der TimerRoutiene wäre
    end if
    
    
    if Dimmer2 =>100 then
    Dimmer2 = 0
    'und hier der Code der sonst in der TimerRoutiene wäre
    end if
    
    if Dimmer3 =>200 then
    Dimmer3 = 0
    'und hier der Code der sonst in der TimerRoutiene wäre
    end if
    '...
    Loop
    
    Timerroutine 'bei Timeraufruf
    incr Dimmer1 'Variable hochzählen
    incr Dimmer2
    incr Dimmer3
    Return
    ...

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    06.01.2007
    Beiträge
    52
    Danke schonmal
    Das Problem ist nur das bei deinem Code nicht der Nulldurchgang berücksichtigt wird und dann wirds zu nem Flackern. Kann ich vielleicht irgendwie den Timer dann starten wenn wenn ein Nulldurchgangsinterrupt ausgelöst wird und dann eventuell einfach das Timerregeister abfragen.
    Mit anderen Worten: Der Timmer zählt 20 msec also eine halbwelle Und der Timer zählt in der Zeit bis 255 und ich zünde den Triac dann nach einem vorgegebenen Wert zwischen 0 (Komplett an) und 255 (Komplett aus).
    Wär das möglich?
    Gruß

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    hhmmm
    du hast ja leider keine Hardware angegebe (was an den Eingängen hängt) was hängt denn an dem INT0 dran - dachte das es der Nulldurchgang ist weil du damit ja den Timer startest oder?

    Int0_isr:
    Start Timer1
    Return

    wenn du da noch die Variablen DimmerX alle auf 0 setzt könnte es doch klappen oder mach ich da nen Denkfehler?

    ich glaub den Timer kann man nicht direkt abfragen sondern nur den Überlauf - bin mir aber nicht sicher....
    ...

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    06.01.2007
    Beiträge
    52
    Hallo,
    sorry das ich mich erst jetzt melde habs früher leider nicht geschafft zu testen.
    Also was ihr gesagt hab klappt. Aber leider nur sehr eingeschränkt.
    Wenn ich das Programm so ablaufen lasse mit einer Lampe wie unten im Code dann geht das so lange wie ich nichts zum Programm hinzufüge wie zum Beispiel einen Printbefehl. Dann fängt die lampe direkt an unrythmisch zu flackern. Ebenso wenn ich versuche über nen Taster den vergleichs Wert "X" zu erhöhen. Irgenwie scheint das mit der zeit nciht hinzuhauen.
    Vielleicht könnt ihr mir ja nochmal helfen. Wär echt klasse.
    Desweiteren habe ich mal Schaltpläne angehangen.
    Der dritte Port an der Nulldurchgangscontrolle hängt dann halt am Interrupt vom Mega8.
    Schönen Gruß S. Kogel

    Code:
    Do
    Debounce Pind.4 , 0 , Taste1
    'Print X
    
    'Waitms 1
    If X => 200 Then
       X = 200
    End If
    
    If Dimmer1 => X Then                                        'statt der Zahl (50) warscheinlich eine Variable?
    Dimmer1 = 0                                                 'und hier der Code der sonst in der TimerRoutiene wäre
     Set Triac
      Waitus 10
      Reset Triac
    End If
    
    
    Loop
    
    Timer_irq:
    Incr Dimmer1
    Return
    
    Int0_isr:
    Start Timer1
    Dimmer1 = 0
    Return
    
    Taste1:
       X = X + 100
    Return
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken nulldurchgang.jpg   triac_last.jpg  

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    hab im Moment keine Zeit...aber:

    in meinem 1. Post hab ich ja schon geschrieben dass das etwas Zeitkrietisch ist und eventuell bei mehreren Lampen flackern könnte!

    ABER ein PRINT Befehl braucht natürlich extrem viel Rechenleistung - da kann es nur noch flackern.

    Mit dem Taster ist blöd... wenn er nicht mal das schafft...
    versuch mal die Taste direkt in die do...loop rein zu nehmen also:
    IF taste1 = 1 then
    X = X + 100
    End if


    Tobias
    ...

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    06.01.2007
    Beiträge
    52
    Is leider auch nciht so ohne weiteres möglich flackert bisschen und ich kann auch keine waits in die if schleife einbauen weil dann natürlich wieder rechenzeit verloren geht. Also der dimmer ist recht schnell auf maximaler Leuchtkraft.
    Ich denke das das auch mit mehrern eng wird.
    Aber Danke
    Gruß

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    tja - da musst du dir wohl etwas Hardwareseitiges einfallen lassen...
    ...

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    kann man da nix mit hardware pwm machen?
    ...

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    sieht wohl schlecht aus mit Bascom und der Zeit...
    http://www.mikrocontroller.net/topic/27615
    ...

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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