ATMega und Timer (statt RTC und SQW bzw 32K)

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

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?

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

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

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 :wink:

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

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

... und ein strobo licht ? :sunglasses:

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

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.

Ich fühle mich mißverstanden :wink:

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

Grüße Uwe

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

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

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

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 hab mir das mal angesehen:

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 ?

die timer funktion werd ich mir jetzt mal ansehen

ich glaube ich habs ! vielen dank !!!!!!!!!!!!

habe mir hierraus was zusammengebastelt (so ein kleines lern-und-versteh-beispiel (; ):

http://playground.arduino.cc/Deutsch/HalloWeltMitInterruptUndTimerlibrary

https://www.pjrc.com/teensy/td_libs_TimerOne.html

#include "TimerOne.h"  
int ledpin = 13;
int led_status = 0;
long interval_an = 1000; //ms
long interval_aus = 1000; //ms
     
void setup()   
{
pinMode(ledpin, OUTPUT);
digitalWrite(ledpin, LOW);
Timer1.initialize(1);
Timer1.attachInterrupt(blinken);
}
     
     
void blinken() 
{
if (led_status == 0)
{
digitalWrite(ledpin, HIGH);
led_status = 1;
Timer1.setPeriod((interval_an * 1000));
}
else if (led_status == 1)
{
digitalWrite(ledpin, LOW);
led_status = 0;
Timer1.setPeriod((interval_aus * 1000));
}
}
     
     
void loop()    
{
  delay(10000);
  interval_an = 5000; 
  interval_aus = 5000;

}

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:

Hallo,

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. :slight_smile:
Oder meinetwegen irgendeinen Pin im ISR Aufruf selbst.

Mein Tipp an den Themensteller, auf jeden Fall nochmal nachmessen, was sich wirklich am Ausgang tut. :wink:

:sleeping: