Ich denke mal die 0-10ms sind der dimmbare Bereich.
Wenn du bei einer Phasenanschnittssteuerung (oder wie immer das genau heisst) schon genau im Nulldurchgang abschalten willst, kannst du deine Lampe auch gleich am Schalter ausmachen.Also mit dem Int ist sehr gut. Nur der INT kommt nicht genau zum Zeitpunkt des Nulldurchgangs. Bei Int0 faling kommt er kurz danach, bei rising kurz davor.
Wenn der Interrupt erst ein "bischen" später auslöst, sollte das nicht ganz so schlimm sein, denn ein "bischen" Spannung braucht eine Lampe auch bevor sie sichtbar leuchtet.
Kommt natürlich drauf an, wieviel ein bischen ist, bzw. wann genau "kurz danach" ist.
Ich denke mal die 0-10ms sind der dimmbare Bereich.
ja genau. die 0-10ms sind der dimmbare Bereich
@Getaco,
könntest du mir deinen Code zur Verfügung stellen ?
@blaueled
kann ich, der steht auch schon irgendwo im forum(forum_dimmer***.bas), nur nicht gleich heute, muss noch arbeitenaber so in groben zuegen ->
--------------------
config timer1
enable int0
enable compare1a
variabeln, etc...
---Hauptschleife---
do
Taster abfragen und auswerten
Wenn Taster kuerzer als x ms dann Lampe toggeln
Wenn Taster laenger als x ms dann Lampe dimmen
loop
---Interrupt---
timer1_code:
decr zuendzeitpunkt
wenn zuendzeitpunkt = lampen Helligkeit dann triac zuenden (set pinx.n)
compare1a = naechster zuendzeitpunkt bei
Return
---Nulldurchgang---
int0_code:
timer1 = 0
compare1a = erster zuendzeitpunkt
zuendzeitpunkt = 256
Return
end
--- 255 Zuendzeiten ---
data xxx,xxx,xxx
Grobe erklaerung :
Zu INT0:
Bei einem Nulldurchgang wird Int0 ausgeloest und setz den zuendzeitpunktszaehler (wow was fuer ein wort) auf Null bzw auf 256, der timer wird auf null gesetz und compare1a auf den ersten (im wert niedrigsten aber in der helligkeit hoechste) wert gesetzt. Bei 10 MHz quartz und timer prescale 8 ist das so um die 400 oder 500.
Diese erste wert entspricht etwa dem "kurz nach" dem Nulldurchgang der sinus kurve d.h. wenn du deinen Triac dann Zuendest hast du die volle welle.
Zu Timer1 interrupt (eigentlich das compare1a interrupt) :
wird nun der erste kleinste wert vom timer ereicht d.h. das compare1a interrupt ausgeloest, zaehlst du einfach einen zaehler von 255 um eins nach unten, vergleichst diesen wert mit dem deiner lampe wenn diese beiden gleich sind zuendest du. Bevor der return kommt noch schnell den naechsten comapre wert setzen,damit das spiel von vorne beginnen kann.
zur Hauptschleife :
Hier kanns du alles reinpacken was du willst nur , es darf nicht zu viel zeit "kosten" . Du brauchst in deiner hauptschleife nicht zu warten oder zu "pausieren" oder irgendwelche interrupte manuel auszuloesen, das geht alles von selbst.
Klingt alles sehr verwirrend geb ich zu doch wenn du dir mein progi anschaust und ein bischen auseinander nimst wirst du es verstehen wenn nicht werd ich dir helfen,ich hab auch einige tage und wochen damit verbracht.
Ich schreib dir nen richtigen code sobald ich zuhause bin
@Getaco
Alles klar. danke schonmal
Hier kuck mal.
Dieser code hat in etwa so bei mir funktioniert. experimentiere mal damit herum. Ist glaube ich auch ne bessere erklaerung als mein versuch vorhinCode:$regfile = "m8535.dat" $crystal = 10000000 Config Portc = Output '( Im Hauptprogramm Berechnest Du Aus Jedem Helligkeitswert(8 Bit) Die Entsprechende Anzahl Von Timerticks. Beim Nulldurchgang Löscht Du Deinen Timer Und Schreibst Die Timerticks Der Hellsten Lampe Ins Compare -register Deines Timers. Wenn Das Compare -reg Einen Ir Auslöst, Schaltest Du Die Lampe Ein Und Schreibst Den Wert Der Zweithellsten Lampe Ins Compare -reg , Usw. Fang Am Anfang Mit Nur Einer Lampe An. Dann Hast Du Nur Einen Wert Für Das Compare -register Und Dein Programm Bleibt Einfach. Wenns Läuft , Bau Die Anderen Lampen Ein! ') ' 8 chanel werter festleen an engem array ! Dim Chanel_val(8) As Word Dim Temp_chanel_val(8) As Word Dim Trigger_chanel_num(8) As Byte Dim T As Byte Dim C As Byte Dim M As Byte Dim Idx As Byte Dim Chanel As Integer 'actuel chanel nummer Dim Comp As Integer Dim T_c As Integer Dim R_c As Integer Dim R2d2 As String * 1 Dim R3d3 As String * 10 Declare Sub Big_level() As Bit ' Offset NUll Duurchgang = 1750 ticks Chanel_val(1) = 1750 'MIN Chanel_val(2) = 1700 Chanel_val(3) = 1600 ' Chanel_val(4) = 1500 ' Chanel_val(5) = 1400 ' Chanel_val(6) = 1300 ' Chanel_val(7) = 1200 ' Chanel_val(8) = 1100 'MAX 'Config Int0 = Rising Set Mcucr.isc01 Set Mcucr.isc00 ' Interrupts Enable Interrupts 'timer configureiren Call Big_level Compare1b = 250 '12502 Config Timer1 = Timer, Prescale = 8 Config Serialin = Buffered, Size = 64 Enable Int0 'Null Durchgans erkennung Enable Compare1a 'timer1 interrupt Enable Compare1b 'timer1 interrupt On Int0 Int0_isr On Compare1a Timer_isr On Compare1b Port_reset Do R2d2 = Inkey() If Err = 0 Then If R2d2 <> "*" Then R3d3 = R3d3 + R2d2 Else Print "Chanel 1 set to "; R3d3 Chanel_val(1) = Val(R3d3) R3d3 = "" End If End If Loop 'main routine 'Timer_ticks_max = 12500 'bei prescale = 8 ass 12500 'One_step = 50 'linear ticks Timer_isr: 'compare1a interrupt T_c = Trigger_chanel_num(Chanel) Select Case T_c Case 1 : Set Portc.0 Case 2 : Set Portc.1 Case 3 : Set Portc.2 Case 4 : Set Portc.3 Case 5 : Set Portc.4 Case 6 : Set Portc.5 Case 7 : Set Portc.6 Case 8 : Set Portc.7 End Select Chanel = Chanel + 1 If Chanel > 8 Then Chanel = 1 End If T_c = Trigger_chanel_num(Chanel) Comp = Chanel_val(T_c) Compare1a = Comp Return Int0_isr: 'Null Durchgangs Interrupt Timer1 = 0 Start Timer1 Chanel = 1 T_c = Trigger_chanel_num(Chanel) Comp = Chanel_val(T_c) Compare1a = Comp Return Port_reset: Portc = 0 Return![]()
mal sehen, ob ich das richtig verstanden habe :
nach jedem Nulldurchgang muss ich ja 0-10ms warten, bis ich den Triac zünde. Ich nehme mir also einen Timer und lege die Timerzeit fest ( z.B. 5ms ). Wenn nun Int0 auslöst, starte ich den Timer. Ist der Timer abgelaufen, zünde ich den Triac. Ist das so im groben richtig ?
ja so im groben richtig, die feinheiten liegen in den timer werten die sich mit einer, zumindest für mich, Formel berechnen lassen. Wieviele triacs möchtest du eigentlich ansteuern ?
mfg
getaco
---------------------------------------------------------------------------------------------
Programiere lang und erfolgreich.
also ich will 3 Dimmer bauen. aber für jeden Dimmer ist 1 AVR und 1 Triac vorgesehen. Also jetzt zum testen, habe ich einen Atmega 8 und nen Tic226. Also nur einen Triac. Wie berechnest du die Timer Werte denn genau ?
Lesezeichen