und zwar soll das so aussehen X ms aus und Y ms an....
also X und Y sollen einstellbar sein von 0-1000ms.
Ich hatte hier schonmal gefragt, da wurde mir empfohlen die SQW oder 32k FUnktion der RTC zu nutzen ?
Ich finde leider nicht sehr viele Infos bzw Beispiele dazu ):
Ich hatte eigentlich überlegt den Interval über Arduino bzw I2C einzustellen und den SQW dann zu nutzen um ein FET anzusteuern usw.....
Aber wenn ich das richtig verstanden habe, übermittel ich der RTC über I2C nur eine Frequenz....
das würde ja heißen, das AN und AUS immer gleich lange dauern....
und zwar soll das so aussehen X ms aus und Y ms an....
also X und Y sollen einstellbar sein von 0-1000ms.
Ich hatte hier shconmal gefragt, da wurde mir empfohlen die SQW oder 32k FUnktion der RTC zu nutzen ?
Dafür machst Du Dir am besten einen "Timer-Interrupt", der 1000 mal pro Sekunde aufgerufen wird.
Und innerhalb der ISR-Routine zählst Du einfach mit:
wenn EIN und Interrupt Y mal aufgerufen wurde: Setze AUS und Zähler auf 0
wenn AUS und Interrupt X mal aufgerufen wurde: Setze EIN und Zähler auf 0
Timer0 auf den Atmegas ist standardmaßig in Benutzung, so dass Du für allgemeine Fälle auf einem Atmega328 Timer1 und Timer2 zur Verfügung hättest. Abzüglicher der Timer, die Du bereits für etwas anderes verbraten hast, wie z.B. PWM-Ausgänge, Servo-Steuerung, Funkmodule etc.
Wenn Dein Sketch keine blockierenden Funktionen wie "delay()" oder "pulseIn()" oder ähnliche Scheißndrecksfunktionen aufruft, kannst Du so langsame Aktionen, die nur im Millisekundentakt ablaufen sollen, auch über die "micros()" Funktion relativ genau in der loop() Funktion steuern.
Was meinst du mit millisekundengenau?
Meine Vermutung:
Es sollen z.B. 9, 10 oder 11 Millisekunden vorgegeben sein und
10 Millisekunden ist etwas zwischen z.B. 9800 und 10200 µs? Das kann jeder attiny locker selber, dafür brauchst du keine RTC.
PWM ist, wenn die Summe aus X und Y einigermassen immer dasselbe ist.
War aber nur eine Vermutung, warum du wohl einen FET andauernd schalten willst, aber das Verhältnis zwischen AN und AUS unterschiedlich sein soll. Vorteil wäre, das kann ein µC besonders gut, da die Timer darauf ausgelegt sind, sowas ohne Software zu erledigen
Das beste wäre wahrscheinlich PWM per Hand implementiert. Und zwar auf Timer1. Wenn man da Modus 14 nimmt (Fast PWM) kann man den Top-Wert selbst bestimmen. Dadurch ist man nicht mehr auf 8-Bit PWM beschränkt, sondern kann die vollen 16 Bit ausschöpfen. Mit einem Prescaler von 1024 hat man eine Auflösung von 64µs. Die maximale Zeit wäre dann 65535 * 64µs = 4,1942s. Für 1s hätte man einen Top-Wert von 15625 wenn ich das richtig sehe. Das gibt die Frequenz an. Und der Schaltpunkt wird durch das OCR1A Register bestimmt.
Manche RTC-Modelle geben an einem Pin ganzzahlige Teile der 32768 Hz Quarzfrequenz aus. Je nach Modell sind die Teiler einstellbar und Du erreichst 1Hz aber niemals 1kHz ( 1/1000 stel Sekunde).
uwefed:
... Du erreichst 1Hz aber niemals 1kHz ( 1/1000 stel Sekunde).
Hallo Uwe, Du weißt, ich widerspreche Dir nur äußerst ungerne, aber im DS3231-Datenblatt lese ich "PIN 1 32kHz Output" und "The TCXO frequency output is available at the 32kHz pin." sowie "PIN 3 Square-Wave Output" und "SQUARE-WAVE OUTPUT FREQUENCY 1Hz 1.024kHz 4.096kHz 8.192kHz".
Ich würde daher behaupten wollen, daß mehr als 1 Hz das IC verlassen kann.
... Du erreichst 1Hz aber niemals 1kHz ( 1/1000 stel Sekunde).
agmue:
Hallo Uwe, Du weißt, ich widerspreche Dir nur äußerst ungerne, aber im DS3231-Datenblatt lese ich "PIN 1 32kHz Output" und "The TCXO frequency output is available at the 32kHz pin." sowie "PIN 3 Square-Wave Output" und "SQUARE-WAVE OUTPUT FREQUENCY 1Hz 1.024kHz 4.096kHz 8.192kHz".
Ich würde daher behaupten wollen, daß mehr als 1 Hz das IC verlassen kann.
Das 1kHz bezog sich auf den genauen Wert von 1000,00 Hz +/- 100ppm Ungenauigkeit des Quarzes. Der Wert der 1kHz nahe kommt ist 1024 Hz; das sind dann ca 2,4% Abweichung vom der 1000stel Sekunde (wenn man die 100ppm des Quarzes hier nicht berücksichtigt).
1,000 Hz bekommt man exakt als 32768-stel Teil der Quarzfrequenz.
Es bezog sich nicht darauf, daß 1Hz die einzige mögliche Frequenz sei. Im Satz davor bin ich ich auf die Möglichkeit von verschiedenen Einstellbaren Ausgangsfrequenzen eingegangen. Genaueres ist immer dem jeweiligen Datenblatt zu entnehmen.
das projekt soll später auf ein atmega1284.........
naja und der ließt halt auch noch einige sensoren(analog, i2c und onewire) aus(und schaltet dementsprechend ein paar ssr und leds), steuert ein display an und ließt über ein attiny ein paar taster aus (per i2c).
außerdem ließt der noch eine rtc aus, hat eine "timer" bzw "stoppuhr" funktion, steuert über die sekunden von der rtc ein paar leds an (blinken) und ein summer...... und wlan
ich hatte wie gesagt, bei einer abgespeckten version des sketches mal probiert, den timer/stoppuhr ohne rtc, nur mit millis laufen zu lassen, der ist nach ein paar minuten deutlich falsch gegangen, weil das programm wahrscheinlich so große verzögerungen verursacht hat.
und wenn ich ein interenen timer + interrupt nehme, würde der doch dann im millisekundentakt das programm unterbrechen oder ?
ich vermute mal, da wäre es doch am sinnvollsten noch ein attiny45 zu nehmen und den über i2c anzusteuern oder ? die kosten ja nicht die welt und der hätte dann nur die aufgabe undd er atmega wäre "entlastet" ?
entweder mit quarz + millis, dem interenen timer oder dem sqw oder 32k von der rtc ?
magictrips:
und wenn ich ein interenen timer + interrupt nehme, würde der doch dann im millisekundentakt das programm unterbrechen oder ?
Die ms-Unterbrechung hast du schon durch den Arduino Code auf Timer0
Aber mit den Timern kann man Ausgänge komplett in Hardware steuern. Ohne dass ständig Code läuft oder ein Interrupt ausgelöst wird. Das ist genau was du auch bei analogWrite() machst!
Man kann Timer auch auf andere Arten verwenden. Und wenn du alle paar hundert ms mal einen Interrupt auslösen müsstest wäre das auch nicht schlimm.
Um das nochmal klar zu machen: du willst ein 1Hz Signal ausgeben und das an/aus Verhältnis bestimmen? Also z.B. 200ms an - 800ms aus - 200ms an ....
Das ist PWM! Wenn du es anders willst, habe ich es falsch verstanden.
ich würde sagen, mein vorhaben geht stark in die richtung......
aber die werte sollen unabhängig voneinander einstellbar sein.... und am besten unabhängig vom restlichen sketch laufen.....
im sektch wir dann höchstens die dauer eingestellt bzw mitgeteilt...
Y AUF und dann X ZU und Y AUF und X ZU usw
Y = 0-1000ms
X = 0-1000ms
als rechteck bzw kein sinus oder so....
wenn ich das richtig verstanden hab, ist bei pwm nur das verhältnis zwischen 5v und 0v flanke einstellbar und zusammen betragen die auch immer 2 ms ?
Auf UNO und Mega2560 habe ich mit diesem Sketch ein Blinken im Mehrsekundentakt. Der teensy 3.2 zeigt ein allerdings nur fast gleichmäßiges Signal, das ich eher bei der Verwendung von millis() erwartet hätte:
das ist aber kein Sekundentakt. Du hast hier kHz. Die Frage wäre, was machst du mit dem ISR? Wenn die Reaktion auf den ISR erst später in der loop erfolgt, hängt es wieder von der Durchlaufzeit der loop ab. Wenn die nicht gleichmäßig ist, haste trotz perfekten ISR eine Abweichnung drin.
Wenn du mit dem Timer direkt den Timer-Pin schalten lassen kannst, haste absolut 0 Abweichnung.
Oder meinetwegen irgendeinen Pin im ISR Aufruf selbst.