PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 230V dimmer softwarefrage



bastian07
27.02.2008, 22:18
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:


$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

TobiasBlome
28.02.2008, 16:13
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




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

bastian07
28.02.2008, 18:17
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ß

TobiasBlome
28.02.2008, 19:44
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....

bastian07
04.03.2008, 17:59
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



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

TobiasBlome
04.03.2008, 18:21
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

bastian07
04.03.2008, 18:29
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ß

TobiasBlome
04.03.2008, 20:02
tja - da musst du dir wohl etwas Hardwareseitiges einfallen lassen...

TobiasBlome
04.03.2008, 20:04
kann man da nix mit hardware pwm machen?

TobiasBlome
04.03.2008, 20:34
sieht wohl schlecht aus mit Bascom und der Zeit...
http://www.mikrocontroller.net/topic/27615

TobiasBlome
04.03.2008, 21:48
vielleicht den Quarz auf 20MHz oder so erhöhen? bringt natürlich nur etwas um eine Lampe zu dimmen - wenn überhaupt...

master_t
05.03.2008, 15:23
vielleicht hilft das hier weiter
http://www.hoelscher-hi.de/hendrik/light/dmxdimmii.htm

-zero crossing detektion

TobiasBlome
05.03.2008, 16:05
tja das Prog ist aber in asc geschrieben... und da sind die Befehle nicht so zeitkrietisch(Befehle kürzer geschrieben). Aber die Hardware sieht schön einfach aus ;-)