Hallo, ich suche eine funktionierende Version eines Phasenanschnitt programmes für einen simplen 220V dimmer für einen 2313 oder 4433 wenn möglich in ASM. Kann mir da bitte jemand weiter helfen ?
Ist für AT90S1200 mit 4 MHz Quarz, sollte man aber anpassen können... http://www.mikrocontroller.net/forum/read-4-9509.html mfg SiSt
Hallo danke erst mal, aber den link hatte ich auch schon gefunden. Habs für den 2313 angepasst, aber das problem ist, entweder ich bekomm die Lampe nicht ganz dunkel gedimmt, oder wenn ich die verzögerung t_sin0 ändere dann gehts zwar ganz runter aber nicht mehr weit genug hoch bis zur vollen helligkeit. Hat vielleicht jemand ein funktionierendes programm oder weiß was man in diesem ändern kann damit das funktioniert, vom glimmen bis maximum helligkeit ? Ich kenn mich mit phasenanschnitt als solches überhaupt nicht aus, aber ich denke auch dass man das rad nicht zig mal erfinden muss. Es werden doch schon sicher viele mit phasenanschnitt experimentiert haben die sich damit auskennen und mir weiterhelfen können. wär wirklich wichtig. Danke schonmal im vorraus. Gruß, Andy
Das mit der Helligkeit ist doch bei den Baumarktdimmern genauso, da bekommt man auch hinterher nicht mehr die Helligkeit vom anfang, auch wenn der Dimmer voll aufgedreht ist. ist vielleicht ein ganz normales Phänomen?!
hab mir das projekt oben net angeguggt aber ich rate einfach mal so mangels sachverstand: da wird doch sicherlich im analogteil beim verwendeten triac or whatever der rückkopplungszweig kompensiert werden müssen, auf dass da kein hystereseeffekt auftritt.
Hallo, Sven, ich habe bei mir auch einen Baumarkt Dimmer in Betrieb, der geht von ganz dunkel bis maximum ohne probleme. Allerdings verwendet der auch ein spezielles Sensor dimmer IC. Ripper, von den Bauteilen hab ich genau die, die im txt angegeben sind. Auch mit dem nullspannungsschalter, der den int0 auslöst den angegebenen OC. Wie gesagt, soweit funktioniert die geschichte ja auch, bis auf dass der volle dimmbereich nicht ausgeregelt wird. Das Triac ist ein solid state relais. Triac mit integriertem Optokoppler, welches aber auch auf die impule des Prozessors angewiesen ist um die phase richtig anschneiden zu können. Hardwaremässig denke ich ist das kein Problem. Ich denke liegt wohl eher an der Auflösung ( 0-255 ) und 7° Auflösung reicht vielleicht nicht um den vollen dimmbereich auszunutzen. Und dass das prog jetzt auf einem 2313 läuft statt auf einem 1200 daran kanns wohl auch nicht liegen. Hmmmmmmmmmmmmmmmmm
Hi! Da kam mir doch was bekannt vor. Du hast ein kleines Timingprobl. Poste oder schicke mir mal das Prog, ich passe es dir an. Ämmm Du hast aber 100Hz am PD2-Eingang? MFG Uwe
Hi Uwe, das prog ist das allerselbe wie Simon oben schon gepostet hat. http://www.mikrocontroller.net/forum/read-4-9509.html Ja, ich habe 100hz am Eingang, auch gemessen mit einem frequenzzähler... obwohl mir 50 Hz lieber gewesen wären, wäre für mich einfacher aus der netzspannung zu gewinnen. Gruß, Andy
Hier aber nochmal mein angepasstes. da der tov interrupt beim 2313 anders liegt als beim 1200 habe ich den lediglich an die richtige stelle verschoben. Gruß, Andy
Salut, @Voyager9: Du kannst Dir mal mein Projekt ansehen. Enthält Hard- und Softwareteil für einen Phasenanschnittdimmer mit Taster-, IR- und UART-Schnittstelle. Läuft seit Wochen völlig problemlos. Realisiert auf einem 2313 in Assembler. Dimmt von 0% auf 100% (Netzteil eingebaut, daher volle Leistung). Der Analogteil ist relativ klein und preisgünstig, der µC vom Netzpotential getrennt. Der Netzfrequenzeingang hat 50Hz. Mehr Infos auf der Website: http://semitone.sourceforge.net http://sourceforge.net/projects/semitone/ Grüße und danke nochmal an alle hier, die mir geholfen haben! Mark
Hallo Voyager9 ! Wenigstens 2 Fehler stechen mir gleich ins Auge: 1. die "include "- Anweisung steht noch auf AT90S1200 .include "4433def.inc" 2. du hast den Stack nicht initialisiert .org $00 ldi temp,RAMEND ;$df out SP,temp ;Stack als 1.festlegen Weiterhin steht noch der 4MHz Quarz drinn, hast du auch einen verwendet? Ansonsten bitte die richtige Frequenz eintragen. Der Phasenanschnitt ist schon für 50Hz Netzfrequenz, nur du musst ja die positive und die negative Halbwelle anschneiden um auf Vollwellenbertieb zu kommen. Dazu brauchst du aber beide Nulldurchgänge eines kompletten Sinus, was dann natürlich 100Hz sind. Mal was zum Verständnis. Eine Halbwelle wird in 255 zeitgleiche Teile zerlegt was einem Winkel von 180°/255=0,706° entspricht. Das sind genau 10ms / 255 = 39,21µs für ein solches "Zeitsegment" welches der Timer erzeugen muss. Es müssen also pro Halbwelle(180°) 255 TOV0's erzeugt werden. Kommen wir mal zu "t_sin0". Der Nulldurchgang wird etwas vor dem echten Nulldurchg. detekt. weil ja der Stromfluss durch den OK nicht erst bei Null Volt aufhört sondern schon etwas eher. Du musst also noch etwas Zeit verstreichen lassen bis der echte Sin0-Durchgang stattfindet. Genau diese Zeit muss mit t_sin0 erzeugt werden. Das Zeitraster ist ebenfalls 39,21µs. Wenn da also ein Wert von 10 drinnsteht,bei mir war das so, entspricht das genau 392,1µs was der OK eher schaltet. Solltest du an einen Oszi rankommen kannst du dir das sehr schön anschauen indem du dir das 50(100)Hz Signal nach dem Gleichrichter auf einen Kanal legst und den anderen Kanal mit dem INT0-Signal ansteuerst. Getriggert wird auf das steigende INT0-Signal und schon kannst du die genaue Zeit ablesen die deine Schaltung eher ist. Ich hoffe das du jetzt etwas besser klarkommst, ansonsten fragen, fragen,..... MFG Uwe Ps.: Sage bitte auch was dir zum Verständnis gefehlt hat, damit ich es in den Beitrag einarbeiten kann.
Hi! Mir ist nochwas eingefallen. Das Schreiben des EE-Prom geht etwas anders: Statt ee_wr: in eetmp,eedr ;alte eeprom Daten laden cp eetmp,w_soll ;mit neuen vergleichen breq wr_e ;wenn gleich nicht speichern ee1: sbic eecr,1 ;überspringe wenn eewe = 0 (schreiben bereit) rjmp ee1 ;noch nicht bereit out eedr,w_soll ;nun in's ee .schreiben sbi eecr,1 ;und schreiben aktivieren wr_e: clt ;T-Flag löschen rjmp loop ;*** neu für 2313 ********* ee_wr: in eetmp,eedr ;alte eeprom Daten laden cp eetmp,w_soll ;mit neuen vergleichen breq wr_e ;wenn gleich, nicht speichern EE: sbic EECR,EEWE ;Schreibbit gelöscht? rjmp EE ;nein->EE out eedr,w_soll ;nun in's ee .schreiben sbi EECR,EEMWE ;Schreiben Masterbit=1 sbi EECR,EEWE ;Schreibbit =1 wr_e: clt ;T-Flag löschen rjmp loop MFG Uwe
Hi Uwe, mal 1000 Dank für die ausführliche erklärung. Das Device ist richtig und der stack ist auch initialisiert. Habe ausversehen das falsche file erwischt. Wäre der stack nicht ok würden wahrscheinlich auch die irq`s nicht gehen. Das mit dem stack war das 2te was ich sofort gemacht hatte, da ich irgendwo gelesen habe dass der 1200er eine art automatischen stack hat und nicht initialisiert werden braucht. Soweit funktioniert ja auch alles, bis, wie du wahrscheinlich richtig liegst, mit dem Timing Problem von t_sin0. Ich habe mir mal die mühe gemacht und alle werte von 0 bis 255 in 2er schritten ausprobiert, aber bei keinem Wert erreiche ich den vollen Dim Berech von 0 bis max. Ich habe nun spasseshalber mal das t_sin0 in ein register umgewandelt, in das ich dann 2 verschiedene Werte schreibe. Bei 255 ist die lampe ganz aus, und wenn w_soll null ist hat sie dann ca die halbe helligkeit. Danach lade ich t_sin0 mit 10 und setze w_soll auf ca 230 hoch, das entspricht ca der vorigen helligkeit, damit kein helligkeitssprung beim übergang drin ist. dann wird w_soll wieder bis 0 gezählt und damit erreiche ich dann die volle helligkeit. Danach halte ich den weiteren countup von w_soll an, da er sonst, so wie es im original programm ist überläuft und wieder von unten anfängt. Das gleiche mache ich beim dunkel dimmen in umgekehrter reihenfolge. ABER.... das ganze ist ja nicht im Sinne des Erfinders. Als OP der int0 triggert benutze ich ein PC817 und als Rel. ein S201S01, also beides was als funktionierende hardware im text des programmes angegeben ist. Die 100 Hz habe ich momentan über einen trafo laufen, dem ein normaler 4 dioden Gleichrichter folgt. Logischerweise ohne kondensator :-) Auf den Trafo möchte ich aber gerne verzichten können da das ganze später in eine Schalterdose passen soll. setz ich den Gleichrichter direkt an die 220 V brauche ich wieder einen riesen widerstand für die OC LED, weil die verlustleistung zu hoch ist. Selbst ein 1 Watt wird noch ziemlich heissaber daran dürfte es ja im Moment auch nicht liegen. Laut Frequenzzähler liegen satte 100 Hz an PD2 an, etwas schwankend, weil unser netz ist auch nicht das stabilste :) ( Ich weiß, es gibt länder da würden wir die Hände überm kopf zusammen schlagen ) Aber egal, dafür ist ja der int0 da. Nun, Hardwaretechnisch dürfte also normalerweise kein fehler vorliegen. Woran es hängt entzieht sich wirklich meiner kenntnis :( Heul Hey Mark, Dein Projekt ist echt ganz nett, aber wie gesagt, das ganze soll in einer Schalterdose platz finden ;) Vielleicht werden sich auch einige Fragen warum ich mir keinen Handelsüblichen Dimmer einbaue... Nun, das hat folgenden Grund: Ich möchte (wenn der Phasenanschnitt endlichmal richtig klappt ) das Licht beim einschalten des Lichtschalters ( ersetzt durch einen kleinen, dann am AVR angeschlossenen ) langsam von null hochfahren lassen, um einfach die birnen zu schonen. und beim Ausschalten langsam herunter. Ausserdem möchte ich durch 3 LED`s die ungefähre Helligkeit angezeigt bekommen, LED1 ca 33%, LED2 ca 66% und die 3. LED dann eben 100% Ich kenne keinen Dimmer der diese features bietet ;);)
Salut, @Voyager9: also genau dieses Fading war es auch, was mich dazu brachte, mein Projekt zu starten. Die Platine ist mit 50x100mm² nicht wirklich winzig, zugegeben. Aber für einen PhasenANschnitt brauchst Du die entsprechende Entstörung - und die braucht Platz. Wenn Du die ganze Geschichte in Reihe zur Lampe schalten willst, kommst Du auch ohne Trafo aus, dann kannst Du die Z-Dioden-Schaltung verwenden. Aber dann hast Du auch keine Potentialtrennung mehr, was solche Sachen wie UART fast unmöglich macht und einen externen Taster gefährlicher. Außerdem kannst Du die Lampe dann nur noch bis ca. 90% fahren, damit sich der Schaltkreis nicht seiner eigenen Spannung beraubt. Alles in allem dachte ich mir die Sache auch billiger und einfacher, aber die Anforderungen haben schließlich zu dem geführt, was es heute ist. Das nächste Modell in der Reihe sollte auch ein Dimmer werden, der in eine Schalterdose paßt. PhasenABschnitt, Drehgeber oder Poti, und IR. Muß man evtl. als Sandwich bauen. Insgesamt halte ich die Idee mit der Schalterdose aber für ein zu krasses Kriterium. Meine nächste Idee war dann, den Dimmer selbst in ein Gehäuse zu bauen und nur den Triac-Zündstrom zur Schalterdose zu leiten. Auf Wunsch könnte dieser Dimmer dann auch mehrere Lampen getrennt ansteuern. Ist dann ja nur noch ne Frage von freien I/O's und entsprechender Firmware. Das nur als kleiner nett gemeinter Denkanstoß. :) Viele Grüße und viel Erfolg! Mark
Hallo Voyager9 ! Hast du etwar einen 8MHz Quarz? Dein Timer scheint zu schnell zu laufen!Das Ganze geht nur bis ~6,5MHz ohne Vorteiler, und dafür ist im Kopf die Berechnung zugeschnitten. Wenn du 8MHz hast musst du den Ladewert für 39,21µs per Hand ausrechnen und als "teiler" einsetzen. equ t_wert =$00-teiler ;157=4MHz =>10ms(Timerwert) Ein Transformator ist für dich ein Problem? Hast du schon mal einen 0,35VA Trafo gesehen? Der ist kleiner wie deine Kondensatoren und die Potentialtrennung ist gratis. Ich habe so eine Dimmerschaltung übrigens mal in ein Sicherungsgeh.(16A Automat=12,5mm) eingebaut. Da ist eine Schalterdose ja riesig und mit einer Ringkerndrossel kannst du sehr gut entstören. Was du da bauen willst habe ich vor 2-3 Jahren mal einem Aquarianer gebaut, der wollte unbedingt Sonnenauf und untergang haben.(Für seine Fische natürlich) Wenn ich mal richtig grabe fine ich bestimmt das Progr.noch irgendwo. War allerdings mit einem 2323(8-Beiner) Also wie gehabt, immer schön fragen fragen ..., Das wird schon! MFG Uwe
Hallo Uwe, Als Quarz habe ich momentan im Versuchsaufbau einen Quarzoszillator von genau 4 Mhz dran, das sollte soweit alles passen. Hmmmmm... diese Trafos sind mir nicht geläufig... kenn ich echt nicht. ( Haben will ) :-) Gibts die auch bei conrad? Falls Du das Prog noch irgendwo finden würdest wäre ich sehr interessiert daran :) 2323 ist auch kein Problem, habe hier eine breite Palette AVR`s zur verfügung. Ich entschied mich lediglich für den 2313 wegen der ports für spätere led`s usw.... aber ich denke mal das dürfte ja normalerweise ohne probleme anzupassen sein. Echt mal 1000 Dank für Deine Bemühungen und Geduld mit mir :-))) Mark...Die schaltung ist so konzipiert, dass Phase und Null angeschlossen sind, sind also in der schalterdose vorhanden, da Schlter / Steckdose Kombination. Uart und IR brauche ich für diese Ausführung nicht, sind also nicht von belang, daher spielt auch die potentialtrennung hier nur eine nebenrolle. Aber dein Projekt ist nicht von schlechten Eltern :) und ich werde es auch bestimmt bei gelegenheit mal nachbauen. Interessiert mich selber, obwohl mir dein coding den rest gibt. Ich finde die initialisierung der led Ports und diverser wären auch einfacher gegangen, anstatt sie hintereinander einzuschieben lol diese sachen machen für mich zumindest das coding etwas unleserlicher und man verliert leicht den überblick. zumindest geht es mir so, was nicht heissen soll das ich an einem funktionierenden Programm auch nur das geringste auszusetzen hätte. :) Aber egal, jeder programmiert ja wie es für ihn am einfachsten und sinnvollsten ist und jeder kann ja auch programmieren wie er will smile Hauptsache es funktioniert am ende so wie man es gerne hätte. Gruß, Andy
Hi Voyager9 ! Mich macht das sehr stutzig was du mit dem Progr. veranstaltest um den richtigen Erfolg zu haben. Vermutlich hast du auch ein kleines Verständnisproblem, zu dem ich schnell mal eine Zeichnung gemacht habe. Wenn du einen 4MHz Quarz/Takt hast, muss es gehen, es sei denn dein Assembler macht Mist. Setze doch bitte mal statt "teiler" den Wert 157 ein. Bei w_soll = 0 muss volle Helligkeit sein und bei 255 kein Zündimp. Jedenfalls, wenn du soviel Zeit verstreichen lassen musst, um volle Helligkeit zu erreichen, bist du schon in der nächsten Halbwelle und das ganze haut nicht hin. Hänge doch mal dein richtiges Progr. an damit ich nachvollziehen kann was du da machst. MFG Uwe
Hi Voyager9 ! Mir ist nochwas eingefallen. Kann es sein das dein Lastrelais nicht zwischen +5V und dem Ausgang angeordnet ist, sondern gegen GND? Das invertiert die ganze Geschichte und bei Nulldurchgang würde ein- statt ausgeschaltet. Und nochwas! Der OK am Eingang muss Int0 im nicht angesteuerten Zustand erzeugen.(Trafo aus, dann muss Int0-Eing.auf 5V sein) MFG Uwe
Hallo Uwe, so, nun, anscheinend hat der AVR eine Macke, warum auch immer. Ich habe aus lauter frust mal einen neuen AVR eingesteckt, die soft draufgebrutzelt und jetzt funktioniert es komischerweise problemlos. Wieder den alten avr hat wieder die selben fehler zur folge. Verstehen muß ich das wohl nicht, denn ich habe mal alle ports mit led`s belegt und die lassen sich mit einem keinen testprog problemlos einzeln ansteuern. Vermute mal dass der Timer dieses avr`s spinnt. Was ich aber dennoch immer noch nicht ganz verstehe, bezogen auf Deine Zeichnung. Wie kann die Lampe nach ablauf von t_sin0 und w_soll auf 0 ( wo sie sich kreuzen auf der nullinie ) zum Zeitpunkt des Nullpunktes 100% Helligkeit haben ?????? Zum Zeitpunkt des Nullpunktes fliesst doch kein Strom, demnach müsste die lampe doch aus sein, oder? Oder interpretiere ich die Zeichnung verkehrt? Oder heißt das dass zu diesem Zeitpunkt ( bei w_soll auf 0 ) die halbwelle nicht geschnitten wird und somit die Lampe die ganze halbwelle abbekommt. Dann escheint es mir logischer dass sie dann 100% erreicht :) ( Jetzt davon ausgegangen dass beide halbwellen durchgingen ) Gruß, Andy
Hi Voyager9 ! Schön das du Erfolg hattest, ich hatte schon fast keine Idee'n mehr. Hatte übrigens selbst auch schon mal so ein Probl.,da ging INT0 auf einmal nicht nehr, alles andere war i,O. Und ,ja die Lampe (Verbraucher) bekommt die ganze(n) Halbwelle(n) womit sich 100% Leistung einstellen. MFG Uwe
Hallo Uwe, habe mit Interesse die Diskussion verfolgt. Ich bastel selbst auch an einer Dimmerschaltung mit dem AT2051. Funktioniert auch alles prima (ähnliches Prinzip wie Deine Beschreibung). Hast Du evtl. eine Idee (theoretischer Ansatz), wie man die Helligkeit linear zum Stellwert (0-255) bekommt. Es gibt da ja Wahnsinnsformeln, aber das kann der kleine Controler nicht. Für eine Tabelle ist auch nicht genügend Platz...??? Olaf
Salut, ich will Dir ja nicht den Mut nehmen, aber ich glaube nicht, daß man einen arccos in weniger Code als sie eine Tabelle braucht nachbilden kann. Nun da mein 2313 auch randvoll ist (aber doch noch soviele Features warten, implementiert zu werden), hab ich schon über eine einfache lineare Interpolation nachgedacht. Hab mir aber noch nicht die Zeit genommen, die entsprechenden Graphen mal zu vergleichen. 128, 64 oder gar 32 Stützwerte könnten reichen. Und linear interpolieren sollte sich relativ einfach gestalten. Mein persönlicher Ausweg aus dieser Misere wird wohl aber, doch auf den Mega8 umzusteigen. Kostet minimal mehr und bietet eine Handvoll mehr Features. Viel Erfolg! Bin auf eventuelle andere Ansätze aber auch gespannt. :) Mark
Hi Olaf! Darüber habe ich mir noch nicht einmal Gedanken gemacht, aber wenn ich mir das recht überlege so bedeutet ja 50% Leistung noch nichtmal 50% Licht. Ist das überhaupt berechenbar? Selbst wenn, so trifft das doch dann auch nur auf einen speziellen Verbraucher zu. Ich denke da nur mal an die vielen unterschiedlichen Lampentypen. Persöhnlich würde ich warscheinlich den Bereich unter 100(mal schauen ab wann sich kaum noch etwas ändert) ausblenden und den Rest des Bereiches auf 255 verteilen, sozusagen 10ms/355 als kleinste Takteinheit. Die 100 fehlenden "Takte" müssten dann in meine "t_sin0"mit eigearbeitet werden. Wenn es ganz ausgefeilt sein soll könnte das der uC eigentlich selbst aufteilen indem er ein "Setup" durchführt in der Art: Wert "Min"-> Anwender stellt "Min"->OK(Taste)-> Wert Max-> Anwender stellt "Max"->OK(Taste)->neue Teiler berechnen und im EEprom ablegen. Aber wie gesagt das sind jetzt nur undurchdachte Ansätze, wie das vernünftig zu bewerkstelligen ist müsste man untersuchen. MFG Uwe
Salut Uwe, naja, Du könntest mit Hilfe eines Fotowiderstandes (dessen Kennlinie Du kennen mußt) den jeweiligen Lampentypen ausmessen. D.h. schrittweise hochfahren bis Du an je einem 1/256 Helligkeitsschritt angekommen bist, und dann den aktuellen Zündzeitpunkt im ROM speichern (EEPROM oder dann in den Flash übertragen). Wenn Du eine Linearisierung brauchst, die Dir die Leistung (also die Fläche unter der sin-Halbwelle) linear zum "Helligkeitswert" berechnet, dann hilft Dir diese Formel: y = acos (2x - 1) / PI. Das bildet Dir dann quasi das Gegenstück zu den jeweils stark nichtlinear weggeschnittenen sin-Halbwellenstückchen. Das funktioniert an sich auch ganz prima. Mir persönlich gefällt es besser, wenn dieser arccos noch mit 1/3 der linearen Funktion gemittelt wird. Das bringt in den dunkleren Bereichen eine höhere Auflösung. Bei großen Helligkeiten nimmt das menschliche Auge kaum noch Unterschiede wahr. Wie gesagt, mein Dimmerprojekt liegt unter http://semitone.sf.net . Wen's interessiert... inzwischen läßt sich der Dimmer auch über ein GTK- und Kommandozeilen-Frontend unter GNU/Linux steuern. :)) Viel Spaß, Mark
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.