Go Down

Topic: ATMega und Timer (statt RTC und SQW bzw 32K) (Read 6795 times) previous topic - next topic

magictrips

Nov 15, 2015, 05:37 pm Last Edit: Nov 19, 2015, 07:22 pm by magictrips
Hallo zusammen,

ich würde gerne etwas "schalten".

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....

michael_x

Quote
das würde ja heißen, das AN und AUS immer gleich lange dauern
ja, sehe ich auch so, bei den RTC die ich kenne.


Du willst nicht zufällig PWM neu erfinden?

jurs

#2
Nov 15, 2015, 05:45 pm Last Edit: Nov 15, 2015, 05:48 pm by jurs
ich würde gerne etwas "schalten".

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.

magictrips

ok, vielen dank für die antwort !

hmmm pwm ? hab ich noch nie benutzt, aber das generiert doch nur eine frequenz ?

ich brauche es millisekunden genau und mein sketch ist recht lang und enthält recht viele sensoren usw usw.....

ich hatte es damals bei einer abgespeckten version des sketches mit millis() probiert, aber das ging leider ziehmlich daneben..

ich denke mal ein interrupt durch sqw ist in meinem fall auch nicht das richtige oder ?

da wie gesagt auch noch etliche sensoren, ein display und taster und wlan am attmega hängen sollen...

hatte auch noch die überlegung durch den sqw ein attiny45 anzusteuern und über diesen dann den FET

michael_x

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 ;)

Serenifly

#5
Nov 15, 2015, 07:20 pm Last Edit: Nov 16, 2015, 10:36 pm by Serenifly
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.

Falls ich das richtig verstanden habe...

michael_x

Quote
da wie gesagt auch noch etliche sensoren, ein display und taster und wlan am attmega hängen sollen...
... und ein strobo licht ?   :smiley-cool:

uwefed

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).

Beschreibe mal Dein projekt genauer.
Grüße Uwe

agmue

... 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.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

uwefed

#9
Nov 15, 2015, 10:50 pm Last Edit: Nov 15, 2015, 10:52 pm by uwefed
Ich fühle mich mißverstanden ;)
Quote
... 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.
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.

Grüße Uwe

magictrips

#10
Nov 15, 2015, 11:49 pm Last Edit: Nov 15, 2015, 11:56 pm by magictrips
da ich mich nicht wirklich mit den dingen, die ihr vorgeschlagen habt, auskenne, frag ich mal so....
welche möglichkeit wäre den am genausten ?

es geht darum ein elektromagnetisch betätigten flüssigkeitsteiler zu schalten....

da über die AN und AUS zeiten der rückfluss eingestellt wird, wäre eine gewisse genauigkeit nicht verkehrt....

ich habe eine ds3231 hier

Serenifly

Mit Timern hast du eine Auflösung im µs Bereich :)

Ist aber auch nicht einfach wenn man noch nichts damit gemacht hat.

magictrips

#12
Nov 16, 2015, 12:18 am Last Edit: Nov 16, 2015, 12:27 am by magictrips
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 ?

magictrips

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 ?

Serenifly

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.

Go Up