ATTINY13 Phasenanschnitt

Code:
sei();
_delay_ms(2000);
cli();
  PORTB |= (1 << Ausgang);
Dann wäre der Interrupt nur 2 Sekunden aktiv.
Der Akku würde über Phasenanschnitt angesteuert.
Nach 2 Sekunden wird der Thyristor voll durchgeschaltet.
Nicht ordentlich formuliert...
Der Interrupt ist nicht 2s aktiv, sondern 2s lang scharf. Genauer gesagt alle für sich geschärften Interrupts sind jetzt für 2s global scharf, danach nicht mehr. Besser wäre es, wenn Du nicht alle Interrupts global entschärfst, sondern den konkreten, indem Du das konkrete Interrupt Enable Bit löschst. Also hier INT0 im Globalen Interrupt Mask Register (GIFR).
 
Nicht ordentlich formuliert...
Der Interrupt ist nicht 2s aktiv, sondern 2s lang scharf. Genauer gesagt alle für sich geschärften Interrupts sind jetzt für 2s global scharf, danach nicht mehr. Besser wäre es, wenn Du nicht alle Interrupts global entschärfst, sondern den konkreten, indem Du das konkrete Interrupt Enable Bit löschst. Also hier INT0 im Globalen Interrupt Mask Register (GIFR).

Gibt es denn noch andere Interrupts welche ich nicht mit sei() aktiviert habe, welche dann mit cli() entschärfe?
Oder anders, cli() wäre im konkreten Beispiel kein Problem ?
 
Hi,

Mal was anderes... kann man die Antworten auch über ein MailClient schreiben, oder muss man immer über die Seite hier antworten?

denk mal an die Hilfesuchenden die evtl nur passiv mitlesen oder später im Internet Suchen um ne Lösung zu finden. Deine Mails können die leider nicht lesen. Ein Forum ist dafür da um vielen Leuten zu helfen und nicht um für einen einzelnen eine Lösung herbeizuführen. Es gibt auch keine blöden Fragen sondern nur blöde Antworten ;) Ich hab hier selber auch schon Anfängerfragen reingestellt. :rolleyes:

Gruß
Dino
 
Hi,



denk mal an die Hilfesuchenden die evtl nur passiv mitlesen oder später im Internet Suchen um ne Lösung zu finden. Deine Mails können die leider nicht lesen. Ein Forum ist dafür da um vielen Leuten zu helfen und nicht um für einen einzelnen eine Lösung herbeizuführen. Es gibt auch keine blöden Fragen sondern nur blöde Antworten ;) Ich hab hier selber auch schon Anfängerfragen reingestellt. :rolleyes:

Gruß
Dino

Hi Dino,
ne ne, ich meine dass wie es z.B. in der easylinux-liste gemacht wird.
Jeder schreibt an die Adresse easy-linux über seinen e-mail-account. Jeder kann das mitlesen und seinen Kommentar dazugeben.
Wie man das Verfahren nennt weiß ich nicht.
So könnte man mehrere Listen bequemer verwalten.
Gruß
Ralf
 
Hi,

Hi Dino,
ne ne, ich meine dass wie es z.B. in der easylinux-liste gemacht wird.
Jeder schreibt an die Adresse easy-linux über seinen e-mail-account. Jeder kann das mitlesen und seinen Kommentar dazugeben.
Wie man das Verfahren nennt weiß ich nicht.
So könnte man mehrere Listen bequemer verwalten.
Gruß
Ralf

das ist dann wohl ne Mailing-Liste wie sie auch für andere Softwareprojekte verwendet wird. Man meldet sich auf der Liste an und bekommt dann die reinkommenden Mails zugeschickt, kann sie sich auf der Webseite ansehen und auch was hinschicken. ... naja ... das hat dann nicht mehr wirklich viel mit nem Forum zu tun. Außerdem kann man da nicht mehr wirklich kontrollieren was da abgeht außer durch Ausschluß der entsprechenden Übeltäter. Das ganze trägt eigentlich nur zum Anwachsen der sowieso schon recht hohen Mailflut bei.

Es gibt für alles eine entsprechende Lösung aber für Hilfe finde ich eine Mailing-Liste eher die falsche Lösung. Die einzelnen Benutzer werden eher vom Geschehen abgekoppelt und wurschteln ohne auf die gesamte Liste im Internet zu sehen nur noch "im stillen Kämmerlein" vor sich hin. Es wird sowieso bei längeren Threads wenig gelesen was da abgegangen ist und einfach mal schnell was zu dem gepostet was im letzten Beitrag vorkam. Ob das nun schon ne Seite vorher behandelt/ausgeschlossen/gelöst wurde bekommen die meißten nicht mehr mit. Das wird bei ner Mailingliste noch stärker der Fall sein. Ich fürchte das die Leute dann nur noch ne Mail mit ihrer Frage schicken und auf Antwort warten. Alles was daneben her geht? ... Was interessiert mich das Geschwätz der anderen :p Das ist so meine Befürchtung.

EDIT: Ich habs mir mal trotzdem angesehen ...
- easylinux.de - Mailinglisten SuSE
.. \_einklich.net - Zitieren im Usenet

So wie ich das nun interpretiere läuft das Geschehen nicht mehr in einer Forensoftware ab sondern in elendig langen "FullQuote"-Mails. Na große Klasse. Meine Befürchtung wird damit noch übertroffen. Jetzt stell dir mal vor das du eine Mail bekommst die hier zB einen Thread von 10 Seiten wiederspiegeln würde. Mit allen Anhängen (Datenblättern, Programmcode, Schaltplänen, ...) darin. Ich mach mal ne Beispielrechnung aus diesem Forum auf ...
Beispielthread: 2676-OLED-mit-SSD1306
- 570kB Text
- 3,5MB Anhänge (werden in einer Mail durch umcodierung etwa zu 5,2MB)
Du wirst dann also ab der 4ten Threadseite bei jedem Beitrag mit einer knapp 6MByte großen Mail beglückt die immer weiter anwächst. Viel Spaß auch :p :(

Gruß
Dino
 
Hi,



das ist dann wohl ne Mailing-Liste wie sie auch für andere Softwareprojekte verwendet wird. Man meldet sich auf der Liste an und bekommt dann die reinkommenden Mails zugeschickt, kann sie sich auf der Webseite ansehen und auch was hinschicken. ... naja ... das hat dann nicht mehr wirklich viel mit nem Forum zu tun. Außerdem kann man da nicht mehr wirklich kontrollieren was da abgeht außer durch Ausschluß der entsprechenden Übeltäter. Das ganze trägt eigentlich nur zum Anwachsen der sowieso schon recht hohen Mailflut bei.

Es gibt für alles eine entsprechende Lösung aber für Hilfe finde ich eine Mailing-Liste eher die falsche Lösung. Die einzelnen Benutzer werden eher vom Geschen abgekoppelt und wurschteln ohne auf die gesamte Liste im Internet zu sehen nur noch "im stillen Kämmerlein" vor sich hin. Es wird sowieso bei längeren Threads wenig gelesen was da abgegangen ist und einfach mal schnell was zu dem gepostet was im letzten Beitrag vorkam. Ob das nun schon ne Seite vorher behandelt/ausgeschlossen/gelöst wurde bekommen die meißten nicht mehr mit. Das wird bei ner Mailingliste noch stärker der Fall sein. Ich fürchte das die Leute dann nur noch ne Mail mit ihrer Frage schicken und auf Antwort warten. Alles was daneben her geht? ... Was interessiert mich das Geschwätz der anderen :p Das ist so meine Befürchtung.

Gruß
Dino

Hi Dino,
die Gefahr besteht, wohl war. In der Linux-Liste funktioniert es aber ganz gut. Manche Diskussionen erstrecken sich über Wochen und ziehen weitere neue Beiträge nach sich.
Man solle die Nachrichten entsprechend filtern und in einen Ordner verschieben.
Gruß
Ralf
 
Hi Ralf,

die Gefahr besteht, wohl war. In der Linux-Liste funktioniert es aber ganz gut. Manche Diskussionen erstrecken sich über Wochen und ziehen weitere neue Beiträge nach sich.
Man solle die Nachrichten entsprechend filtern und in einen Ordner verschieben.
ich hab noch ein wenig weitergeschrieben. Nach dem was ich da so zusammenreime ... Keine Chance das in so einem Forum durchzuführen. Hier wird man wenigstens dazu gezwungen die Anhänge halbwegs klein zu halten. Stell dir das mal mit der "Faulheit" der Leute vor die dann ihre 4MByte großen IPhone-Fotos vom Aufbau mit in die Mail packen :p Ne danke. Das wär der erste Grund mich sofort von der Liste abzumelden damit mein Postfach nicht explodiert. Lösung wäre wenn man nur noch Textmails zulassen würde. Wird dann aber kompliziert mit Datenblättern, Fotos und Schaltplänen :hahaha:

EDIT: easylinux.de - 2014-April Archiv
Da sind nur reine Textmails drin die keinen wirklichen FullQuote machen.
Ich empfinde das als etwas anstrengend zu verfolgen. Wie will man da ne Baubeschreibung von nem Projekt machen wo man die Entwicklungsschritte verfolgen kann? Forum ist Forum und Mailing-Liste ist Mailing-Liste.

Gruß
Dino
 
Hi Ralf,


ich hab noch ein wenig weitergeschrieben. Nach dem was ich da so zusammenreime ... Keine Chance das in so einem Forum durchzuführen. Hier wird man wenigstens dazu gezwungen die Anhänge halbwegs klein zu halten. Stell dir das mal mit der "Faulheit" der Leute vor die dann ihre 4MByte großen IPhone-Fotos vom Aufbau mit in die Mail packen :p Ne danke. Das wär der erste Grund mich sofort von der Liste abzumelden damit mein Postfach nicht explodiert. Lösung wäre wenn man nur noch Textmails zulassen würde. Wird dann aber kompliziert mit Datenblättern, Fotos und Schaltplänen :hahaha:

EDIT: easylinux.de - 2014-April Archiv
Da sind nur reine Textmails drin die keinen wirklichen FullQuote machen.
Ich empfinde das als etwas anstrengend zu verfolgen. Wie will man da ne Baubeschreibung von nem Projekt machen wo man die Entwicklungsschritte verfolgen kann? Forum ist Forum und Mailing-Liste ist Mailing-Liste.

Gruß
Dino
Hi Dino,
stimmt, Datenblätter und Fotos müssen dann erst über einen Server hochgeladen werden... und mit so etwas gehen einige HardLiner und Sicherheitsexperten da sehr kritisch um...
Allerdings kommt so etwas eher selten dort vor....also das Hochladen..
AVR und Linux- da gehört man nun mal einer elitären Gemeinschaft an. :)
Jetzt fällt mir wieder meine Idee ein...
man könnte ja das Thema quasi als Abo übernehmen und dann mit einem Programm bearbeiten.
Man würde dann ja dasselbe sehen wie hier jetzt auch.
Ein Programm für viele Listen...
Das war mein Gedanke...
Scheinbar gibt es nur Software um ein eigenes Forum zu erstellen...
Gruß
Ralf
 
Hi Ralf,

irgendwie artet das Thema grad komplett aus und ist sowas von OffTopic :p :rolleyes:
Ich schreib nochmal kurz was und dann sollte es auch gut sein ...

(OFFTOPIC ON)
stimmt, Datenblätter und Fotos müssen dann erst über einen Server hochgeladen werden... und mit so etwas gehen einige HardLiner und Sicherheitsexperten da sehr kritisch um...
Allerdings kommt so etwas eher selten dort vor....also das Hochladen..
Ein Technikforum lebt von Fotos von den Aufbauten, Schaltplänen, Dokus, Datenblättern, Programmdateien, ... usw.
Es reicht hier nicht, nur ein paar Zeilen einer Configdatei einzufügen. Manche Programme sind mehrere hundert oder tausend Zeilen lang. Wenn jemand den Aufbauprozess eines Projektes zeigen möchte, dann geht das auch nicht in einer Mailingliste. Es sind einfach zwei komplett verschiedene Medien. Bei Heise gibt es ja auch Mailing-Listen. Es reicht in einem Forum wie diesem ein paar Codezeilen in den Text zu streuen und den Rest einfach zu verlinken. Dann wäre der eigentliche Beitrag nämlich total unübersichtlich, über zig Server und Medien verteilt, nicht zu durchsuchen und wie zB bei einigen Bilderdiensten nach wenigen Monaten nur noch Stückwerk weil auf einmal Teile fehlen. Dann kann man sich das dokumentieren eigentlich auch gleich sparen. Ich mach mir nicht die Arbeit und tippe mehrere Stunden eine Doku um sie nach spätestens einem Jahr als Datenstückwerk wiederzufinden weil mache der Server meinen das es nun Zeit ist den Speicherplatz für neue Dateien wiederzuverwenden. Das hilft niemandem weiter.

man könnte ja das Thema quasi als Abo übernehmen und dann mit einem Programm bearbeiten.
Man würde dann ja dasselbe sehen wie hier jetzt auch.
Ein Programm für viele Listen...
Das war mein Gedanke...
Scheinbar gibt es nur Software um ein eigenes Forum zu erstellen...
Du würdest also sozusagen eine Art Forensoftware zweiteilen und nur derjenige kann sehen was an Beiträgen da ist, der vorher die Software runterlädt und bei sich installiert. Wenn man bedenkt, wieviel verschiedene Forensoftware und Versionen es gibt wird das ne ziemliche Installationsorgie wenn das mehrere machen würden :p Man würde dann alle ausschließen die diese Software nicht installieren wollen. Sie sind dann von den Informationen abgeschnitten. Das wär so als wenn ich dir nen Schaltplan als Visio-Datei schicken würde. Wenn du das Programm nicht hast ... Pech gehabt. :rolleyes: HTML ist ein Standard den jeder Browser ohne irgendwelche Extraprogramme anzeigen kann. Du würdest eine proprietäre Lösung schaffen.

Es gibt Software für Mailing-Listen, Forensoftware, Software für Blogs, usw. Sie haben alle ihre Berechtigung sonst hätte man sie nicht entwickelt oder sie wäre sehr schnell wieder verschwunden. Man sollte die Software einsetzen die die Aufgabe am besten für alle erfüllen kann. Ich schreib ja auch keine Briefe mit ner Tabellenkalkulation nur weil man es könnte.

So das sollte nun reichen :rolleyes: :offtopic:
(OFFTOPIC OFF)
kehren wir zurück zum Thema "ATTINY13 Phasenanschnitt", Interrupts, ... usw ;)

Gruß
Dino
 
Hi Ralf,

irgendwie artet das Thema grad komplett aus und ist sowas von OffTopic :p :rolleyes:
Ich schreib nochmal kurz was und dann sollte es auch gut sein ...

(OFFTOPIC ON)

Ein Technikforum lebt von Fotos von den Aufbauten, Schaltplänen, Dokus, Datenblättern, Programmdateien, ... usw.
Es reicht hier nicht, nur ein paar Zeilen einer Configdatei einzufügen. Manche Programme sind mehrere hundert oder tausend Zeilen lang. Wenn jemand den Aufbauprozess eines Projektes zeigen möchte, dann geht das auch nicht in einer Mailingliste. Es sind einfach zwei komplett verschiedene Medien. Bei Heise gibt es ja auch Mailing-Listen. Es reicht in einem Forum wie diesem ein paar Codezeilen in den Text zu streuen und den Rest einfach zu verlinken. Dann wäre der eigentliche Beitrag nämlich total unübersichtlich, über zig Server und Medien verteilt, nicht zu durchsuchen und wie zB bei einigen Bilderdiensten nach wenigen Monaten nur noch Stückwerk weil auf einmal Teile fehlen. Dann kann man sich das dokumentieren eigentlich auch gleich sparen. Ich mach mir nicht die Arbeit und tippe mehrere Stunden eine Doku um sie nach spätestens einem Jahr als Datenstückwerk wiederzufinden weil mache der Server meinen das es nun Zeit ist den Speicherplatz für neue Dateien wiederzuverwenden. Das hilft niemandem weiter.


Du würdest also sozusagen eine Art Forensoftware zweiteilen und nur derjenige kann sehen was an Beiträgen da ist, der vorher die Software runterlädt und bei sich installiert. Wenn man bedenkt, wieviel verschiedene Forensoftware und Versionen es gibt wird das ne ziemliche Installationsorgie wenn das mehrere machen würden :p Man würde dann alle ausschließen die diese Software nicht installieren wollen. Sie sind dann von den Informationen abgeschnitten. Das wär so als wenn ich dir nen Schaltplan als Visio-Datei schicken würde. Wenn du das Programm nicht hast ... Pech gehabt. :rolleyes: HTML ist ein Standard den jeder Browser ohne irgendwelche Extraprogramme anzeigen kann. Du würdest eine proprietäre Lösung schaffen.

Es gibt Software für Mailing-Listen, Forensoftware, Software für Blogs, usw. Sie haben alle ihre Berechtigung sonst hätte man sie nicht entwickelt oder sie wäre sehr schnell wieder verschwunden. Man sollte die Software einsetzen die die Aufgabe am besten für alle erfüllen kann. Ich schreib ja auch keine Briefe mit ner Tabellenkalkulation nur weil man es könnte.

So das sollte nun reichen :rolleyes: :offtopic:
(OFFTOPIC OFF)
kehren wir zurück zum Thema "ATTINY13 Phasenanschnitt", Interrupts, ... usw ;)

Gruß
Dino

Hi Dino,
ich hatte die Sache auch schon abgehakt. Im Linuxforum wusste auch scheinbar keiner etwas dazu. Es gibt da keine Softwarelösung. Basta....
Übrigens nicht offtopic ! -> Interrupt !
return();
cli();
;)
Gruß
 
Hallo alle zusammen,
nach langer Zeit bin ich wieder mal am AVr dran.....
Mein Projekt mit der Phasenanschnittsteuerung lag mal auf Eis.
Gerade versuche ich eine Wellenpaketsteuerung zu realisieren.
Dazu will ich zuerst einmal die steigende Flanke abfragen.



ISR(INT0_vect)
{
PORTB |= (1 << PB0); // Ausgang an

// Das auskommentierte ist ein weiteres Problem.... hier soll die Länge, also wie lange soll der Triac durchschalten, für wieviele Perioden....läuft aber nicht so.. dehalb hier eine Konstante _delay_ms(100);
/*
uadc=ADCsingleREAD(3);
while (uadc--)
{
_delay_ms(1000);
}
*/
_delay_ms(100);
PORTB &= ~(1 << PB0); //Ausgang aus
}



void()
{
DDRB |= (1<< PORTB0); // -> Ausgang -> Optokoppler
DDRB &= (1<< PORTB1); // -> Eingang Trigger

//PCMSK |= (1<<PINB1); //PCMSK – Pin Change Mask Register
GIMSK |= (1<<INT0); //External Interrupt Request 0 Enable
MCUCR |= ((1<<ISC00)); // Interrupt auslösen wenn INT0 = GND
sei();
}

Das Problem ist, dass das der Trigger sowohl auf steigende als auch fallende Flanke triggert.
Laut ISC=1 sollte es doch nur die steigend sein, oder?

Gruß
Ralf
 
Warum eigentlich kein Code-Block?
...
[CCODE]ISR(INT0_vect)
{
PORTB |= (1 << PB0); // Ausgang an

// Das auskommentierte ist ein weiteres Problem.... hier soll die Länge, also wie lange soll der Triac durchschalten, für wieviele Perioden....läuft aber nicht so.. dehalb hier eine Konstante _delay_ms(100);
/*
uadc=ADCsingleREAD(3);
while (uadc--)
{
_delay_ms(1000);
}
*/
_delay_ms(100);
PORTB &= ~(1 << PB0); //Ausgang aus
}
[/CCODE]


[CCODE]void()
{
DDRB |= (1<< PORTB0); // -> Ausgang -> Optokoppler
DDRB &= (1<< PORTB1); // -> Eingang Trigger

//PCMSK |= (1<<PINB1); //PCMSK – Pin Change Mask Register
GIMSK |= (1<<INT0); //External Interrupt Request 0 Enable
MCUCR |= ((1<<ISC00)); // Interrupt auslösen wenn INT0 = GND
sei();
}
[/CCODE]
Das Problem ist, dass das der Trigger sowohl auf steigende als auch fallende Flanke triggert.
Laut ISC=1 sollte es doch nur die steigend sein, oder?
Du läßt aber auf beide Flanken triggern (any change)...
(PS. an Dirk: in den neuen Code-Blöcken kann man Text-Tags nicht mehr verwenden (Fett, Farbe usw...)
 
Du läßt aber auf beide Flanken triggern (any change)...

Ja, auf fallende Flanke triggert man mit MCUCR |= 1<<ISC01; (bei ISC00 = 0)

(Ich würde in der ISR keine ADC-Wandlung durchführen, das würde ich ab und zu mal im Hauptprogramm machen. Ich würde hier in der "TriggerISR" auch kein Delay verwenden, nachdem der Ausgang wieder ausgeschaltet wird, dies würde ich mit einem Timer machen, in Verbindung mit der TimerISR.)

(PS. an Dirk: in den neuen Code-Blöcken kann man Text-Tags nicht mehr verwenden (Fett, Farbe usw...)
Ja, es wird komplett neu formatiert. Die Tags vom Forum haben hier keine Wirkung, die Forumsoftware hat keinen Einfluß mehr auf den Code-Bereich.

Dirk :ciao:
 
Warum eigentlich kein Code-Block?
Du läßt aber auf beide Flanken triggern (any change)...
(PS. an Dirk: in den neuen Code-Blöcken kann man Text-Tags nicht mehr verwenden (Fett, Farbe usw...)

Moin, sag' ja, bin voll raus, hatte das mit dem Code verschlafen.... Danke für die Bearbeitung.

Code:
GIMSK |= (1<<INT0); //External Interrupt Request 0 Enable
MCUCR |= ((1<<ISC00)); // Interrupt auslösen wenn INT0 = GND

Ja, Du hast Recht, in diesem Beispiel wird auf beide Flanken getriggert.
Das war aber auch der Fall wenn ich ISC01 und ISC0 gesetzt hatte, also auf steigende.
Der Fehler war wohl, dass ich den usb-flasher nicht abgezogen hatte, denn jetzt funktioniert es.
Jetzt hänge ich noch an der Abfrage des Sollwertes über die auskommentierte Zeile welche die
Abfrage des adc beinhaltet. Ob das geht was ich nicht. Auf jeden Fall scheint der Lesevorgang zu lange zu dauern.
Meine Idee ist folgende:
Es geht um 50 Hz.
Wenn der Trigger auslöst, öffnet sich durch int0 ein Zeitfenster von z.B. T=500 ms.
Über adc lese ich dann einen Wert ein, welcher das Tastverhältnis bestimmt, also wie lange t_an
in den 500 ms der Triac angesteuert werden soll.
Am Ende der interrupttroutine wird der Triac wieder auf Null gesetzt und die Restzeit von 500 ms - t_an vertrödelt.
Mit einem festen Wert klappt das so weit auch.
Aber an welcher Stelle kann ich den adc-Wert abfragen? In der interrupt-Routine oder global in void()?
Gruß
Ralf
 
Hallo,

mal kurz, wie ich das damals realisiert hatte:
2-Kanal Phasenanschnittsdimmer (TRIACs), Vorgabe des Anschnittswinkels über ADC (Spannungsteiler), Ausgabe des eingestellten Wertes über UART

Jeder Phasendurchgang löst einen externen Interrupt aus (Netzspannung -> Komperator -> Optokoppler -> INT0).
INT0-ISR synchronisiert einen Timer so, daß er sicher vor dem nächsten Nulldurchgang (also weniger als 10ms) überläuft.
Der Timer läuft als PWM, im OutputCompare-Match geht der PWM-Pin High (was den TRIAC zündet), beim Überlauf (also vor dem nächsten Nulldurchgang) geht er low, wird die Zündspannung vom TRIAC genommen (verlöschen tut er ja selbst im Nulldurchgang).
Der Wert im OutputCompare-Register ist also der Anschnittswinkel.

Das mit dem ADC hatte ich damals an den Timer gekoppelt - Auto Trigger enable, und als Quelle den Timerüberlauf eingestellt. Also jeder Timerüberlauf hat im Hintergrund eine neue ADC-Konversion angestoßen. Ist die fertig, löst der ADC einen IRQ aus, in dessen ISR ich das ADC-Result (nach Kontrolle/Überprüfung) in das OutputCompare-Register übernommen habe.

Der Inhalt des OCR wird ausserdem über die serielle Schnittstelle ausgegeben - in der INT0-ISR wird bei jedem 256sten Durchgang (Bytevariable wird jedesmal invertiert, bei Zero Flag->)wird der Inhalt vom OCR ins UART-Data Register kopiert.

Ich habe also 2 Interrupts verwendet: den INT0 für die Synchronisation des Timers auf die Nulldurchgänge (und die Ausgabe alle 2,56s), und den ADC-IRQ wenn dieser fertig ist, um den Vorgabewert zu erfassen.

Man könnte das ADC-Ergebnis auch in INT0 auslesen und in das OCR übertragen - also nur den einen IRQ nutzen.
 
Hallo,

mal kurz, wie ich das damals realisiert hatte:
2-Kanal Phasenanschnittsdimmer (TRIACs), Vorgabe des Anschnittswinkels über ADC (Spannungsteiler), Ausgabe des eingestellten Wertes über UART

Jeder Phasendurchgang löst einen externen Interrupt aus (Netzspannung -> Komperator -> Optokoppler -> INT0).
INT0-ISR synchronisiert einen Timer so, daß er sicher vor dem nächsten Nulldurchgang (also weniger als 10ms) überläuft.
Der Timer läuft als PWM, im OutputCompare-Match geht der PWM-Pin High (was den TRIAC zündet), beim Überlauf (also vor dem nächsten Nulldurchgang) geht er low, wird die Zündspannung vom TRIAC genommen (verlöschen tut er ja selbst im Nulldurchgang).
Der Wert im OutputCompare-Register ist also der Anschnittswinkel.

Das mit dem ADC hatte ich damals an den Timer gekoppelt - Auto Trigger enable, und als Quelle den Timerüberlauf eingestellt. Also jeder Timerüberlauf hat im Hintergrund eine neue ADC-Konversion angestoßen. Ist die fertig, löst der ADC einen IRQ aus, in dessen ISR ich das ADC-Result (nach Kontrolle/Überprüfung) in das OutputCompare-Register übernommen habe.

Der Inhalt des OCR wird ausserdem über die serielle Schnittstelle ausgegeben - in der INT0-ISR wird bei jedem 256sten Durchgang (Bytevariable wird jedesmal invertiert, bei Zero Flag->)wird der Inhalt vom OCR ins UART-Data Register kopiert.

Ich habe also 2 Interrupts verwendet: den INT0 für die Synchronisation des Timers auf die Nulldurchgänge (und die Ausgabe alle 2,56s), und den ADC-IRQ wenn dieser fertig ist, um den Vorgabewert zu erfassen.

Man könnte das ADC-Ergebnis auch in INT0 auslesen und in das OCR übertragen - also nur den einen IRQ nutzen.


Hallo.
ich bin gerade dabei Deinen Vorschlag zu verstehen, das muss ich erstmal verarbeiten... ;-)
mir kam gerade eine Idee....Wenn ich es richtig verstehe... ist es doch irgendwie möglich eine PWM zu generieren, welche durch ein externes Signal getriggert wird, oder?
Als Trigger könnte ich dann die Wechselspannung nehmen, die PWM schaltet für t_an den Triac über dem Optokoppler durch und schaltet diesen wieder für t_aus wieder aus.
Kein Phasenanschnitt sondern Wellenpaketsteuerung !
Gruß
pwm.png
 
Ok, der Thread geht zwar eigentlich über Phasenanschnitt mit einem Tiny13, aber egal...

Letztendlich bleibts ja trotzdem bei PWM, nur eben länger. Du hast Perioden von (sagen wir erstmal) 500ms, und in diesen willst Du irgendwas variabel lange aktivieren. Wenn es zulässig ist, den "Schalter" erst im nächsten Nulldurchgang abzuschalten, ist ein TRIAC weiterhin Methode der Wahl. Wenn (Wellenpakete) es außerdem zulässig ist, den "Schalter" erst mit dem nächsten Nulldurchgang anzuschalten, bietet sich ein TRIAC mit integrierter Nulldurchgangserkennung an (MOC3042 oder so).

Dann brauchst Du also Eingangsseitig des Optotriacs nur 'n geeignetten PWM auf die LED zu legen -> 500ms PWM-Periodendauer (also 2Hz PWM-Frequenz). Der TRIAC synchronisiert sich ja selbst auf die Nulldurchgänge.

Du kannst statt der Zeit die Nulldurchgänge für den Timer verwenden -> also den Timer als Counter nutzen. Statt des vorgeteilten Systemtaktes wird dann 'ne Flanke am T0-Pin als Timer-Takt verwendet. Allerdings lassen sich nur steigende oder fallende Flanken einstellen - nicht beides. Das löst man zB mittels Optokoppler - entweder 2 antiparallel oder einer mit zwei internen antiparallelen Dioden. Also einen Impuls (2 Flanken) bei jedem Durchgang.

Dann würde der Timer bei jedem Nulldurchgang (und nicht nach soundsoviel ns) inkrementieren. Für Deine ~500ms mußt Du den Timer(Counter) also dann auf 50 Schritte (á 10ms) begrenzen. Also weiterhin fastPWM mit OCR0A(=49) als TOP-Wert (WGM=7), und den MOC am OC0B (OCR0B mit 0<OCR0B<OCR0A ist dann Deine Leistungsvorgabe), den Doppel-Optokoppler für die Nulldurchgangs-Flanken an T0 (wenn der Weg mit dem Counter gewählt wird - wenn Du einfach den 500ms-PWM wählst (über den Systemtakt/Prescaler), erübrigt sich das natürlich).

Bleibt die Sache mit dem ADC - prinzipiell sollte der irgendwie automatisch getriggert werden (ADATE). Als Quellen bieten sich hier der ADC selbst (free Running Mode) und die Compare-Matches des Timers an.

Der ADC ist auf 'ne ADC-Clock von 50..200kHz ausgelegt, 'ne Wandlung braucht 13(Dauerlauf) bzw 25 ADC-Takte - also im Dauerlauf eigentlich zu schnell für Dich (verwendet man den ADC-IRQ zur Aktualisierung von OCR0B, tritt dieser IRQ unnötig oft auf). Verwendest Du stattdessen den CompareMatchA (ADTS=3), wird der ADC nur bei jedem zurücksetzen des Timers (also alle 500ms) einmal ausgelöst (und hat 25 ADC-Takte später ein Ergebnis, welches er mit einem IRQ signalisieren kann).
Auf diesem Weg würde fast alles im Hintergrund laufen: Der Timer wird entweder über Systemtakt/Prescaler oder die Optokoppler/T0 getaktet, erzeugt die PWM mit 2Hz und startet im Hintergrund (alle 500ms) außerdem den ADC. dieser wandelt, und stellt das Ergebnis bereit. Das einzige was Dein Programm dann noch machen muß ist, im ADC-Interrupt das Ergebnis nach OCR0B zu übernehmen. Und wahrscheinlich muß dort das Interrupt-Flag vom OCR0A (OCF0A) gelöscht werden.

So, mal wieder viel zu lesen und zu verarbeiten...
 
Hallo,

ich muss da mal ein wenig wiedersprechen ...
Ein Triac mit integrierter Nullspannungserkennung bringt hier nichts! Problem sind die 12 V, diese Triacs sind für Netzspannung gedacht, da spielt es keine grosse Rolle, wenn die erst bei mehrere V zünden, könnte bei 12 V aber genau auf oder kurz vor dem Scheitelpunkt sein - und das bei jeder Halbwelle! Der Grund liegt in der Sache selbst, die Nullspannungserkennung braucht ja auch Strom.

- gp177 -
 
Hallo,

ich muss da mal ein wenig wiedersprechen ...
Ein Triac mit integrierter Nullspannungserkennung bringt hier nichts! Problem sind die 12 V, diese Triacs sind für Netzspannung gedacht, da spielt es keine grosse Rolle, wenn die erst bei mehrere V zünden, könnte bei 12 V aber genau auf oder kurz vor dem Scheitelpunkt sein - und das bei jeder Halbwelle! Der Grund liegt in der Sache selbst, die Nullspannungserkennung braucht ja auch Strom.

- gp177 -

Triac ist ein KT728, Optokoppler ist ein MOC 3023, Lastspannung ist ca. 27 V.
 
Dmm... das mit der Niederspannung hab ich irgendwie verpennt...

Der MOC302x ist ebenso wie der MOC304x ein OptoTRIAC (also ein Optokoppler mit TRIAC-Ausgang). Die 4er-Serie hat zusätzlich 'ne integrierte Nulldurchgangsdetektion. Wieviel Spannung diese nun benötigt, hab ich nicht durchgesehen. Die letzte Ziffer (x) stellt AFAIK die unterschiedlichen Vorwärtsspannungen der internen LEDs dar.

Hmm... gabs nicht auch irgendsowas wie "photovoltaische" Koppler?

Egal - das Problem mit der Nulldurchgangsdetektion via Optokoppler sollte bei den geringeren Amplituden aber ähnlich wie bei den MOCs der 4er-Serie sein - auch hier muß ja erst die Vorwärtsspannung der LEDs erreicht werden...

Methode der Wahl sollte also irgend'ne Komperatorschaltung (wie bei meinem Dimmer) sein.

Für die Wellenpaketsteuerung blieben weiterhin 2 Möglichkeiten:
Entweder:
man verzichtet auf die Detektion, steuert die also Knallhart mit PWM an (und nimmt alle 500ms beim Anschalten den eventuellen RUMS im Scheitel in kauf), oder:
man nutzt den Timer wie beschrieben als Counter (Komperator->T0 aber irgendwie mit beiden Flanken, zB mit vorheriger Gleichrichtung) - dann ist jedes Inkrement des Timers dicht am Nulldurchgang, also insbesondere auch jedes Compare-Match (bzw auch die Timer-Takte danach), also kippt der Ausgang auch immer dicht am Durchgang...
Nachtrag:
Im Datenblatt der 4er-MOCs sind für die Nulldurchgangsdetektion typisch 5V angegeben - max allerdings bis zu 20V;)
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)