AskSin++ Library

Begonnen von papa, 08 September 2016, 11:11:25

Vorheriges Thema - Nächstes Thema

Linef

Zu der 32KHz Thematik gibt's ein gutes Whitepaper von Atmel, da wegen Ultra-Low-Power doch die eine oder andere hardwaretechnische Problematik entstehen kann. Da sind dann auch einige zu den verschiedenen Oszillatoren der Atmel-Prozessoren passende Quarze aufgelistet...

Martin
fhem auf cubietruck, HM-USB-CFG-2, CUL-V3, 6x HM-CC-RT-DN, 5x HM-SEC-SD, 2x HM-SEC-SCo, 5x HM Eigenbausensoren, AVR-Heizungsgateway

plombe

Das Beispiel mit dem Watchdog sollte kein Vorschlag für eine Codeänderung sondern nur ein Beleg für die Möglichkeit sein, auch den Watchdog Timer Millisekunden genau zu betreiben. In der Praxis kommt es bei HM ja nicht auf eine absolut genaue Zeit an, sondern einen Timer, der jeweils zwischen 120 und 185 Sekunden  auf ca. 50ms genau läuft. Und das bei minimalstem Stromverbrauch. Ich denke, es ist ein Irrtum, eine genau gehende Uhr implementieren zu wollen. Den HM-CC-RT-DN interessiert nur die Zeitspanne von einem empfangenen Datentelegramm bis zum nächsten. Eine RTC oder einen Quarzofen benötigt man da nicht. Also Aufwand und Nutzen.
Hans-Georg.

Linef

Mir gings auch gar nicht um die Genauigkeit - im ersten Step hatte ich auch eine Kalibrierung für den Watchdog bei mir eingebaut, und die ist für den RT-DN völlig ausreichend.

Viel mehr ging's mir um den Stromverbrauch, da man mit dem Quarz in den Powersave-Modus gehen kann und da braucht
der Atmel statt 4,5uA (mit WD) nur noch 0,6uA...

Martin
fhem auf cubietruck, HM-USB-CFG-2, CUL-V3, 6x HM-CC-RT-DN, 5x HM-SEC-SD, 2x HM-SEC-SCo, 5x HM Eigenbausensoren, AVR-Heizungsgateway

Dietmar63

Ich habe extrem viel versucht eine genaue Zeit zu bekommen.
Ein Powersensor sollte aus meiner Sicht da ganz genau sein, sonst kann er die Leistung nicht genau berechnen.

Habe es inzwischen mit einer zs-042 gelöst.
Der powersensor zählt 5 Minuten lang per Interrupt die LED -  Signale am Zähler aus.
Ohne Uhr bekommt man keine Zeit hin.

Klasse finde ich die Kalibrierung - werde ich bei mir einbauen.
Es scheint so zu sein, dass jeder Arduino seine eigene Abweichung hat.

Für welchen Zweck benötigt man 0,6uA?
Was machst du mit dem Strom, den du da sparst?  ;)

Im Übrigen vielen Dank für diese Version des AskSin Frameworks. Hier habe ich einen leichten verständlichen Einstieg gefunden. Die Unterstützung ist hier am besten.

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

papa

Zitat von: plombe am 10 Februar 2017, 23:51:22
Das Beispiel mit dem Watchdog sollte kein Vorschlag für eine Codeänderung sondern nur ein Beleg für die Möglichkeit sein, auch den Watchdog Timer Millisekunden genau zu betreiben. In der Praxis kommt es bei HM ja nicht auf eine absolut genaue Zeit an, sondern einen Timer, der jeweils zwischen 120 und 185 Sekunden  auf ca. 50ms genau läuft. Und das bei minimalstem Stromverbrauch. Ich denke, es ist ein Irrtum, eine genau gehende Uhr implementieren zu wollen. Den HM-CC-RT-DN interessiert nur die Zeitspanne von einem empfangenen Datentelegramm bis zum nächsten. Eine RTC oder einen Quarzofen benötigt man da nicht. Also Aufwand und Nutzen.

Du hast ja die originale LowPower Lib erweitert. Könntest Du das ganze auf GitHub forken ? Dann würde ich diesen Fork als Alternative mit aufnehmen. Ich möchte gern nur Libs verwenden, die einfach per GitHub installiert und aktualisiert werden können. Das macht es für andere einfacher den Code zu nutzen.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

papa

Zitat von: Dietmar63 am 11 Februar 2017, 00:22:43
Habe es inzwischen mit einer zs-042 gelöst.
Der powersensor zählt 5 Minuten lang per Interrupt die LED -  Signale am Zähler aus.
Ohne Uhr bekommt man keine Zeit hin.

Durch die vielen Interrupts geht es hier nur mit einer separaten Zeitmessung. Liest Du die RTC jedes mal aus ? Oder kann die CPU mit einem Interrupt geweckt werden ?

Zitat von: Dietmar63 am 11 Februar 2017, 00:22:43
Für welchen Zweck benötigt man 0,6uA?
Was machst du mit dem Strom, den du da sparst?  ;)

Fernbedienung mit CR2032
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

papa

Hat jemand schon Erfahrung mit nem STM32 ? Habe mir ein Maple Mini Clone in China bestellt und wollte damit mal experiementieren. Mit STM32duino gibt es ja eine Arduino-kompatible Entwicklungsumgebung.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Linef

Zitat von: papa am 12 Februar 2017, 10:02:38
Fernbedienung mit CR2032
Hast Du so was schon gebaut?
Welches Gehäuse, welche Tasten verwendest Du?

Martin
fhem auf cubietruck, HM-USB-CFG-2, CUL-V3, 6x HM-CC-RT-DN, 5x HM-SEC-SD, 2x HM-SEC-SCo, 5x HM Eigenbausensoren, AVR-Heizungsgateway

papa

Zitat von: Linef am 12 Februar 2017, 10:18:51
Hast Du so was schon gebaut?
Welches Gehäuse, welche Tasten verwendest Du?

Ich will meine IT Fernbedienugen umbauen. Platine dafür habe ich grob schon fertig. Das ganz soll dann als HM-RC-12 funktionieren.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Linef

Oh, sehr schön! So was steht bei mir auch noch an...
Wo bekommt man das Gehäuse (mit Tasten)? Oder ist das was Altes / Umfunktioniertes?

Martin
fhem auf cubietruck, HM-USB-CFG-2, CUL-V3, 6x HM-CC-RT-DN, 5x HM-SEC-SD, 2x HM-SEC-SCo, 5x HM Eigenbausensoren, AVR-Heizungsgateway

Dietmar63

#175
Die zs-042 ist ein chinesischer Nachbau der ds3231 - sehr genau.
Diverse Abhandlungen im Netz beschäftigen sich mit der Verbesserung.

- Ladediode auslöten
- Widerstandsarray auslöten, dafür dann Pullups auf Signalleitungen auf dem Arduino auf high setzen.

Es soll möglich sein dann den Arduino per Interrupt im Batteriebetrieb der zs-042 wecken zu lassen. Ein Testprogramm funktioniert auch, aber beim powersensor mache ich es anders, weil es irgendwie nicht klappen wollte

Per WDT nähert sich der A. an den Lieferzeitpunkt der Daten (5Min) an. Interrupts lassen die Zeit schneller vergehen(weil offsets abgezogen werden). Wenn dann der Zeitpunkt zum Senden erreicht scheint, wird nachjustiert. Zum Auslesen der Zeit wird die Uhr kurz über den vcc am PIN mit Strom versorgt und wieder abgeschaltet.

Stromverbrauch 50uA. Könnte man durch den Ausbau des LOD weiter herunterbringen.
I2C schalte ich während der 5Min auch stromlos.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

#176
Wäre es nicht besser die Kalibrierung in AlarmClock einzubauen und irgendwie einen Faktor beim Verbrauch der Zeit oder beim ermitteln der ticks in setTicks() einzurechnen.

Extra eine LowPower bereitzustellen erscheint mir nicht sinnvoll. Man wäre immer davon abhängig dass diese Variante aktuell gehalten wird.

Für mich ist das eindeutig eine Eigenschaft der AlarmClock, wenn sie nicht genau genug ist.
Und calibrate lässt sich super einbauen

Und jedesmal wenn offset abgezogen wird, wird vorher der Faktor eingerechnet.

etwa so(basiert auf Code von plombe).



// =====================================================================
class AlarmClock: public Link {

   Link     ready;
 
   uint32_t summe      = 0;
   uint32_t summeCount = 0;
   
public:
   uint32_t korrekturZaehler = 0;
   uint32_t korrekturNenner  = 0;
...
// =====================================================================

void AlarmClock::init() {
 
  if (korrekturZaehler==0) {
     getCalibrierungsFactor();
  }
 
  Serial << "cycleSoll_for_SLEEP_15MS: " << (F_CPU / 64 / 8)  << " (" << korrekturZaehler << "/" << korrekturNenner << ")" << eol;
 
  Timer1.initialize(CLOCK_RESOLUTION * 1000L); // initialize timer1, and set a 1/10 second period
  enable();
}
...
// ---------------------------------------------------------------------
void AlarmClock::getCalibrierungsFactor() {

   Serial.flush();
   uint32_t cycleSoll_for_15_625ms = F_CPU / 64 / 8;

   for (uint8_t i=0;i<3;i++) {
      summe += getCycleIst_for_15_625ms();
      summeCount++;   
   }
   // Serial << "summe:" << summe << eol;

   //Serial << "cycleSoll_for_SLEEP_15MS: " << cycleSoll_for_15_625ms  << " (" << korrekturZaehler << "/" << korrekturNenner << ")" << eol;

}
// ---------------------------------------------------------------------
uint32_t  AlarmClock::getCycleIst_for_15_625ms() {
 
  // Calibration needs Timer 1. Ensure it is powered up.
  uint8_t PRRcopy = PRR;
  PRR &= ~_BV(PRTIM1);
 
  uint8_t TCCR1Bcopy = TCCR1B;
  TCCR1B &= ~(_BV(CS12) | _BV(CS11) | _BV(CS10)); // Stop clock immediately
 
  // Capture Timer 1 state
  uint8_t TCCR1Acopy = TCCR1A;
  uint16_t TCNT1copy = TCNT1;
  uint16_t OCR1Acopy = OCR1A;
  uint16_t OCR1Bcopy = OCR1B;
  uint16_t ICR1copy  = ICR1;
  uint8_t TIMSK1copy = TIMSK1;
  uint8_t TIFR1copy  = TIFR1;

  // Configure as simple count-up timer
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1  = 0;
  TIMSK1 = 0;
  TIFR1  = 0;
  // Set clock to /8 (should take 15625 cycles at 16MHz clock)
  TCCR1B = _BV(CS11);
 
  LowPower.idle(SLEEP_15MS,ADC_OFF,TIMER2_OFF,TIMER1_ON,TIMER0_OFF,SPI_ON,USART0_ON,TWI_OFF);
 
  uint16_t watchdogDuration = TCNT1;
  //Serial << "watchdogDuration: " << watchdogDuration << eol;
  //Serial.flush();
   
  TCCR1B = 0; // Stop clock immediately

  // Restore Timer 1
  TIFR1  = TIFR1copy;
  TIMSK1 = TIMSK1copy;
  ICR1   = ICR1copy;
  OCR1B  = OCR1Bcopy;
  OCR1A  = OCR1Acopy;
  TCNT1  = TCNT1copy;
  TCCR1A = TCCR1Acopy;
  TCCR1B = TCCR1Bcopy;

  // Restore power reduction state
  PRR = PRRcopy;
 
  return  watchdogDuration;
}


und in Sleep:


// ---------------------------------------------------------------------
  static inline uint32_t wdt_Abschlag(uint32_t zeit) {
   
     uint32_t z = aclock.korrekturZaehler;
     uint32_t n = aclock.korrekturNenner;
   
     uint32_t aufschlag = z - n;
     return (zeit * aufschlag / n );
  }   

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

papa

Zitat von: Linef am 12 Februar 2017, 10:53:30
Oh, sehr schön! So was steht bei mir auch noch an...
Wo bekommt man das Gehäuse (mit Tasten)? Oder ist das was Altes / Umfunktioniertes?

Alte Platine raus - neue rein  :)
Ab und an findet man die in der Bucht. Sicherlich lassen sich auch andere Bauformen recyceln.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

papa

#178
Zitat von: Dietmar63 am 12 Februar 2017, 11:31:44
Wäre es nicht besser die Kalibrierung in AlarmClock einzubauen und irgendwie einen Faktor beim Verbrauch der Zeit oder beim ermitteln der ticks in setTicks() einzurechnen.

Ja und nein. Es gibt ja auch Geräte, die den Deep-Sleep nicht brauchen. Dort ist dann die Kalibrierung des WDT unnötig. Aber man könnte eine Ableitung CalibratedAlarmClock machen und dann aclock selbst mit der benötigten Klasse anlegen. Oder wir machen ein Define USE_CLOCK_CALIBRATION, welches das entsprechend einschaltet. Aber zu viele Defines machen den Code so unleserlich. Das USE_AES will ich eigentlich auch wieder weg kriegen.

Edit: Nach nochmaligem Überegen würde ich das nicht in die AlarmClock einbauen, da diese ja nur die Ticks zählt und entsprechend die Alarme auslöst. Sie ist komplett vom Auslöser der Zählevents entkoppelt. Das kein ein Timer sein - oder aber auch einfach nur das Empfangen einer nachrricht - oder - oder - oder
Ich denke die Korrektur der WDT-Abweichung muss dort gemacht werden, wo sie auftritt. Und das ist im Sleep-Code. Also eher ein CalibratedSleep.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

micky0867

Hallo,

ich habe 2 selbstgebaute HM_SEC_WDS, die mit der NewAskSin laufen.
Jetzt wollte ich sie mal auf die AskSinPP umbauen.

Dabei ist mir aufgefallen, dass es in der AskSinPP zwei Beispiele gibt, bei denen die minimale Spannung bei Pro Minis mit 2.2 Volt angegeben/geprüft wird.
Bei mir hat der HM_SEC_WDS bei ca. 2.7 Volt aufgegeben, bis ich die BOD rausgenommen habe...wie lange der jetzt noch läuft, bleibt abzuwarten.

Sind denn 2.2 Volt als Minimalspannung realistisch?

Micky