Universelle Hardware-Basis für 868MHz Funksensoren und Aktoren

Begonnen von papa, 05 Juli 2017, 22:12:42

Vorheriges Thema - Nächstes Thema

ZeroC_41

Ich bin es wieder ... langsam wird es wohl peinlich.

Der HMSensor läuft soweit auch mit einem BME280. Ich hatte mir nun noch einpaar Thermostate besorgt um diese dann in einer Gruppe zu gruppieren.

Das war der Plan.
Um diese beiden Geräte (also als WDS40) zu koppeln muß man ja nur die zwei 9pF Kondensatoren und den Quarz einlöten, und in der .ino das "Use_RTC" auskommentieren. Stimmt es?
Tue ich das bootet der Sensor folgendermaßen:

18:35:11.397 -> AskSin++ v5.0.0 (Jan 19 2021 15:15:06)
18:35:11.397 -> Address Space: 32 - 73
18:35:11.432 -> CC init1
18:35:11.432 -> CC Version: 04
18:35:11.432 ->  - ready

(auch mit der 4.1.7 läuft es nicht, falls jemand über die 5.0.0 stolpert ^^)

kommentiere ich den RTC wieder aus läuft der WDS40 durch, nur halt unbrauchbar für die Thermostate. In der CCU meldet er sich auch ganz brav.
Spannung liegt überall an. die beiden XTAL sind durchgängig bis zum Quarz. Die Schwingung kann ich mit meinem Multimeter leider nicht messen, da der Quarz da zusammenbricht. ein Oszi steht mir leider nicht zur Verfügung.
Aus meinen Fehlern lernend habe ich noch bei einem großen Deutschen Elektronikhändler neue Quarze bestellt, das selbe Ergebnis. Ich weiß nicht was ich übersehen habe...

Anbei noch ein Bild meiner Schaltung.

Danke für die Hilfe.


papa

Was für einen Quarz hast Du denn eingebaut ?
Und bitte mal den kompletten Sketch zeigen / verlinken.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

ZeroC_41

#677
der erste war der https://de.aliexpress.com/item/1990577957.html
der zweite der https://de.elv.com/micro-crystal-uhrenquarz-cm7v-t1a-32768khz-7pf-20ppm-ta-qc-32768-khz-15-x-32-mm-smd-112597

und der Sketch:

//- -----------------------------------------------------------------------------------------------------------------------
// AskSin++
// 2016-10-31 papa Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/
//- -----------------------------------------------------------------------------------------------------------------------

// define this to read the device id, serial and device type from bootloader section
// #define USE_OTA_BOOTLOADER

#define EXTRAMILLIS 730 // 730 millisecond extra time to better hit the slot
#define EI_NOTEXTERNAL // Disable all external interruptes
#include <EnableInterrupt.h>
#include <AskSinPP.h>
#include <LowPower.h>
#include <Register.h>
#include <MultiChannelDevice.h>
#include <Weather.h>

#define LED_PIN 4
#define CONFIG_BUTTON_PIN 8

// === Choose one Temperture/Humidity sensor ===
#define SENSOR_BME280
//#define SENSOR_DHT22
//#define SENSOR_SHT10
//#define SENSOR_SHT21
//#define SENSOR_SHT31
//#define SENSOR_SI7021

// === Define the clock ===
// Remove comment if you have an external oscillator like a 32kHz crystal
// Necessary for exact timings if you want to pair with a HM-CC-RT-DN
#define USE_RTC


// === Battery measurement ===
#define BAT_VOLT_LOW        28  // 2.1V low voltage threshold
#define BAT_VOLT_CRITICAL   26  // 1.9V critical voltage threshold, puts AVR into sleep-forever mode
// Internal measuring: AVR voltage
//#define BAT_SENSOR BatterySensor
// External measuring: Potential devider on GPIO; required if a StepUp converter is used
// one can consider lower thresholds (low=20; cri=13)
#define BAT_SENSOR BatterySensorUni<17,7,3000> // <SensPIN, ActivationPIN, RefVcc>

// === Sensor offset settings ===
// OFFSET for Temperature -> measured Temp +/- Offset = Announced Temperature
#define OFFSETtemp 0 //e.g. -50 ≙ -5°C / 50 ≙ +5°C
// OFFSET for Humidity -> measured Humidity +/- Offset = Announced Humidity
#define OFFSEThumi 0 //e.g. -10 ≙ -10%RF / 10 ≙ +10%RF

// Number of available peers per channel
#define PEERS_PER_CHANNEL 6

// All library classes are placed in the namespace 'as'
using namespace as;

// Define all device properties
const struct DeviceInfo PROGMEM devinfo = {
    {0x34,0x56,0x05},       // Device ID
    "HMWDS40-05",           // Device Serial
    {0x00,0x3f},            // Device Model: HM-WDS40-TH-I
    0x10,                   // Firmware Version
    as::DeviceType::THSensor, // Device Type
    {0x01,0x00}             // Info Bytes
};


#ifdef SENSOR_BME280
#include <sensors/Bme280.h>
typedef Bme280 SensorType; // I2C
#endif
#ifdef SENSOR_DHT22
#include <sensors/Dht.h>
typedef Dht<4,DHT22> SensorType; // <DataPin, Type>
#endif
#ifdef SENSOR_SHT10
#include <sensors/Sht10.h>
typedef Sht10<A4, A5> SensorType; // <DataPin, ClockPin>
#endif
#ifdef SENSOR_SHT21
#include <sensors/Sht21.h>
typedef Sht21<> SensorType; // I2C
#endif
#ifdef SENSOR_SHT31
#include <sensors/Sht31.h>
typedef Sht31<> SensorType; // I2C
#endif
#ifdef SENSOR_SI7021
#include <sensors/Si7021.h>
typedef Si7021 SensorType; // I2C
#endif


// Configure the used hardware
typedef AvrSPI<10,11,12,13> SPIType;
typedef Radio<SPIType,2> RadioType;
typedef StatusLed<LED_PIN> LedType;
#ifdef USE_RTC
typedef AskSinRTC<LedType,BAT_SENSOR,RadioType> Hal;
#else
typedef AskSin<LedType,BAT_SENSOR,RadioType> Hal;
#endif

// Define List0 registers
DEFREGISTER(WeatherRegsList0,MASTERID_REGS,DREG_BURSTRX)
typedef RegList0<WeatherRegsList0> WeatherList0;

// Sensors class is used by the WeatherChannel to measure the data.
// It has to implement temperature() and humidity().
class Sensors : public Alarm {
  SensorType    sensor;
public:
  Sensors () {}
  // init the used hardware
  void init () { sensor.init(); }
  // return how many milliseconds the measure should start in front of sending the message
  uint16_t before () const { return 4000; }
  // get the data
  virtual void trigger (__attribute__ ((unused)) AlarmClock& clock) {
    DPRINTLN("Measure...  ");
    sensor.measure();
    DPRINT("T: ");DDEC(sensor.temperature()+OFFSETtemp);DPRINT("  H: ");DDECLN(sensor.humidity()+OFFSEThumi);
  }
  uint16_t temperature () { return sensor.temperature()+OFFSETtemp; }
  uint8_t  humidity () { return sensor.humidity()+OFFSEThumi; }
};

#ifdef USE_RTC
typedef WeatherChannel<Hal,RTC,Sensors,PEERS_PER_CHANNEL,EXTRAMILLIS,WeatherList0> ChannelType;
#else
typedef WeatherChannel<Hal,SysClock,Sensors,PEERS_PER_CHANNEL,EXTRAMILLIS,WeatherList0> ChannelType;
#endif

typedef MultiChannelDevice<Hal,ChannelType,1,WeatherList0> WeatherType;

Hal hal;
WeatherType sdev(devinfo,0x20);
ConfigButton<WeatherType> cfgBtn(sdev);

void setup () {
  DINIT(57600,ASKSIN_PLUS_PLUS_IDENTIFIER); // Init serial console
  sdev.init(hal);
  buttonISR(cfgBtn,CONFIG_BUTTON_PIN); // Register btn interrupt
  hal.initBattery(60UL*60,BAT_VOLT_LOW,BAT_VOLT_CRITICAL); // Measure Battery every 1h
  sdev.initDone();
  DDEVINFO(sdev); // Print DeviceInfo to serial console
}

void loop() {
  bool worked = hal.runready();
  bool poll = sdev.pollRadio();
  if( worked == false && poll == false ) {
    if( hal.battery.critical() ) {
      // this call will never return
      hal.activity.sleepForever(hal);
    }   
    hal.sleep<>();
  }
}


eigentlich alles Standard

ich sehe gerade: der zweite wäre ein cm7v-t1a und kein CC7v-t1a wie aus der BOM. Das dürfte schonmal erklären warum der auch nicht geht, mal schauen was der unterschied ist.

edit:

so wie ich das sehe, sollte auch der CM tauglich sein, zumindest was ich auf digikey finde...

papa

Die Quarze sollten eigentlich gehen.

Mach mal den Loop wie folgt

void loop() {
  bool worked = hal.runready();
  bool poll = sdev.pollRadio();
/*
  if( worked == false && poll == false ) {
    if( hal.battery.critical() ) {
      // this call will never return
      hal.activity.sleepForever(hal);
    }   
    hal.sleep<>();
  }
*/
}


Sonst könntest Du auch mal meinen Sketch testen - den SHT durch den BME austauschen, sollte ja nicht so schwer sein.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

ZeroC_41

#679
Einen schönen guten Morgen,

also, das sleepforever hab ich auskommentiert, keine Veränderung. Er bleibt wieder bei " - ready" stehen und kommt nicht zum nächsten Schritt, wäre ja das setzen der Frequenz aus der FreqTest.ino.

@Papa
Ich dachte, das ich deinen Sketch nutze, zumindest ist es der aus dem Git. Oder habe ich mich verguckt? https://github.com/pa-pa/AskSinPP/tree/master/examples/HM-WDS40-TH-I

edit:
Also er scheint bei der rtc.init() aus der asksinpp.h stehen zu bleiben. Hab mir einige Serialprints gemacht, damit ich weis ob er richtig durchläuft. alles vor dem init läuft, danach ist Funkstille.

edit-2:
in der AlarmClock.h. Sollte er nicht das define für den "ARDUINO_AVR_ATmega32" nutzen? Stattdessen nutzt er die "ARDUINO_ARCH_AVR" und bleibt in der der while Schleife stehen.

public:

  RTC () : ovrfl(0) {}

  static RTC& instance();

  void init () {
#if defined ARDUINO_AVR_ATmega32
    TIMSK &= ~(1<<TOIE2); //Disable timer2 interrupts
    ASSR  |= (1<<AS2); //Enable asynchronous mode
    TCNT2 = 0; //set initial counter value
    TCCR2 = (1<<CS22)|(1<<CS20); // mode normal & set prescaller 128
    while (ASSR & (1<<TCN2UB)); //wait for registers update
    TIFR |= (1<<TOV2); //clear interrupt flags
    TIMSK |= (1<<TOIE2); //enable TOV2 interrupt
#elif defined(__AVR_ATmega128__)
    TIMSK &= ~(1<<TOIE2); //Disable timer2 interrupts
    ASSR  |= (1<<AS0); //Enable asynchronous mode
    TCNT2 = 0; //set initial counter value
    TCCR2 = (1<<CS22)|(1<<CS20); // mode normal & set prescaller 128
    while (ASSR & (1<<TCN0UB)); //wait for registers update
    TIFR |= (1<<TOV2); //clear interrupt flags
    TIMSK |= (1<<TOIE2); //enable TOV2 interrupt
#elif defined(ARDUINO_ARCH_AVR)
    TIMSK2  = 0; //Disable timer2 interrupts
    ASSR  = (1<<AS2); //Enable asynchronous mode
    TCNT2 = 0; //set initial counter value
    TCCR2A = 0; // mode normal
    TCCR2B = (1<<CS22)|(1<<CS20); //set prescaller 128
    while (ASSR & ((1<<TCN2UB)|(1<<TCR2BUB))); //wait for registers update
    TIFR2  = (1<<TOV2); //clear interrupt flags
    TIMSK2  = (1<<TOIE2); //enable TOV2 interrupt
#elif defined(ARDUINO_ARCH_STM32F1) && defined(_RTCLOCK_H_)
    rt = RTClock(RTCSEL_LSE);
    rt.attachSecondsInterrupt(rtccallback);
#else
  #warning "RTC not supported"
#endif

papa

Zitat von: ZeroC_41 am 20 Januar 2021, 05:28:06
Also er scheint bei der rtc.init() aus der asksinpp.h stehen zu bleiben. Hab mir einige Serialprints gemacht, damit ich weis ob er richtig durchläuft. alles vor dem init läuft, danach ist Funkstille.

edit-2:
in der AlarmClock.h. Sollte er nicht das define für den "ARDUINO_AVR_ATmega32" nutzen? Stattdessen nutzt er die "ARDUINO_ARCH_AVR" und bleibt in der der while Schleife stehen.
Oh - muss ich mir mal ansehen, ob sich da ein Käfer eingeschlichen hat :-)
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Tom Major

Hast du einen mega328P? Dann wäre ARDUINO_ARCH_AVR schon richtig. Der Mega32 ist speziell in ein paar Regs und zählt nicht als 328.

Wenn er in der while bei rtc.init() hängt schwingt wahrsch. der 32k nicht weil die while auf das asynchrone (32k) update der timer Regs wartet.
Vergrößere mal die beiden Cs auf 15..20p.
Früher: FHEM 5.x
Jetzt: RaspberryMatic / ioBroker

ZeroC_41

Zitat von: Tom Major am 20 Januar 2021, 10:24:20
Hast du einen mega328P? Dann wäre ARDUINO_ARCH_AVR schon richtig. Der Mega32 ist speziell in ein paar Regs und zählt nicht als 328.

Wenn er in der while bei rtc.init() hängt schwingt wahrsch. der 32k nicht weil die while auf das asynchrone (32k) update der timer Regs wartet.
Vergrößere mal die beiden Cs auf 15..20p.
Das erklärt es, war nur Verwundert über die "32".

Habe leider nur die Cs aus der BOM, die anderen musste ich mir jetzt erstmal bestellen, aber danke für den Hinweis. Bei dem von ELV steht auch das der wohl für 12pF ausgelegt ist, könnte vieles Erklären. Warum der aus Fernost nicht will, k.a. evtl. Streuung...

Ich werde berichten, danke Tom & Papa für die Hinweise.

Tom Major

#683
Zitat von: Tom Major am 20 Januar 2021, 10:24:20
Wenn er in der while bei rtc.init() hängt schwingt wahrsch. der 32k nicht weil die while auf das asynchrone (32k) update der timer Regs wartet.
Vergrößere mal die beiden Cs auf 15..20p.

Also 18pF könntest du mit 2x9pF parallel testen.

Aber, ich habe mir noch mal deine Quarze aus den links angeschaut. Die gibt es in min. 3 verschiedenen CL. Der Ali link hat keine Angaben, aber der ELV spricht von 7pF CL.
Dann ist es eigentlich genau andersrum: Teste mal ganz ohne die beiden C.
Weil
Ce = 2CL - Cs - Ci
siehe mega328 Datenblatt, Abschnitt Low Frequency Crystal Oscillator
je kleiner CL des Quarzes, desto kleiner müssen auch Ce werden, bei 6pF CL brauchst du keine Ce mehr.
Gängige 32k Quarze haben 12,5pF, da sind dann die 9..15pF Ce angebracht.
(Cs 6pF Schätzung, Ci 6pF Datenblatt)
Früher: FHEM 5.x
Jetzt: RaspberryMatic / ioBroker

ZeroC_41

Zitat von: Tom Major am 20 Januar 2021, 23:42:56
Aber, ich habe mir noch mal deine Quarze aus den links angeschaut. Die gibt es in min. 3 verschiedenen CL. Der Ali link hat keine Angaben, aber der ELV spricht von 7pF CL.
Dann ist es eigentlich genau andersrum: Teste mal ganz ohne die beiden C.

Morgen Tom,

sorry fürs Delay. Hab einmal deinen Rat befolgt und mit dem ELV-Quarz die Cs demontiert, leider keinen Erfolg. Heute sollte einen Auswahl an Cs ankommen und dann teste ich es nochmal.

ZeroC_41

#685
Mahlzeit an alle,

so kam nochmal zum Fehlersuchen.

Ich habe zum Glück noch einen HMSENSOR mit Quarz (mein alter Prototyp) und hab mir den nochmal genauer angeschaut. Das Sketch kan man ausschließen, hab es auf diesen installiert und den RTC aktiviert. Lief sofort durch. (hätte ich auch früher draufkommen können  :-\)

Somit steht fest an meiner Schaltung stimmt was nicht, also mir mal die Spannungen angeschaut, vor allem auf dem XTAL1&2 bzw. deren Cs.

Auf dem funktionierenden HMSensor liegen zwischen XTAL 1 & 2 ungefähr 0,002V an (zumindest messe ich das) die Cs haben gegen Masse ca. 0,5V.
Bei den fehlerhaften Endgeräten hat der C von XTAL2 0V, zwischen XTAL 1&2 liegen 0,8V an und am C von XTAL1 gegen Masse auch 0,8V.
Dabei fiehl mir auf, dass sobald ich mit der Messspitze an den XTAL-2kam die while-Schleife des RTC getriggert wurde und der HMSENSOR lief. Bestückt war er mit dem China Quarz und zwei 9pF Cs wie der Prototyp auch. Ich gehe davon aus, das ich mit der Messspitze den XTAL1 gezogen habe, korrekt?

Mir stellt sich nur jetzt die Frage, warum alle Platinen die ich nach dem Prototypen gebaut habe diesen Fehler aufweisen, von der Bestückung gibt es keinen Unterschied und alle nutzen das selbe PCB. Selbst die Bauteile sind aus den selben Bestellungen...

Bin einfach komplett Ratlos.

Laut Atmel-Studio sind bei allen Sensoren, die Fuses gleich gesetzt.

Tom Major

Das mit der Messspitze deutet imho klar drauf hin das der Osc bei 32k nicht richtig schwingt. Mit 2x 0pF gab es keine Änderung schreibt du, hast du es auch mal mit 2x 18pF versucht?

Warum es nur mit dem einen geht und dem anderen nicht kann ich dir aus der Ferne nicht beantworten. Evtl. mal gute Fotos vom Aufbau von beiden machen.
Früher: FHEM 5.x
Jetzt: RaspberryMatic / ioBroker

ZeroC_41

Hallo @all,

sorry war privat etwas eingespannt und da war das Projekt erstmal zweitrangig.

Was ich rausgefunden hatte:

Am nicht funktionierenden Sensor hat XTAL2 gegen Masse 6,3kOhm. Beim Funktionierenden sind es wie beim XTAL1 62kOhm (ungefähr).
Da der XTAL2-C somit keinen Strombekommt schwingt der Quarz auch nicht.
Da ich schon vorher mit den China 328ps auf die Nase gefallen war hab ich mir nochmal ne Handvoll bei CSD bestellt. Nach Murphys-Art ging natürlich das erste Packet auf dem Postweg verloren...also nochmal.

Und was soll ich sagen. alten 328p entlötet und neuen rein, läuft. Der Fehler ist bei allen 328p (bis auf einen) aus China.

Also merket: Cs, Widerstände und sonstiges kann man aus Fernost kaufen, ICs nicht! Zwei Bestellungen zwei mal auf die Nase gefallen.

Hab mitlerweile 5 WDS40 mit Quarz am rennen und keiner zickt rum, das einzige was mich stützig macht ist wenn ich via eVCC die Spannung messe, liegt die 1,2V über dem realen. Nutze ich iVCC ist der Wert korrekt.
Im Scetch steht, dass die Ref.-Spannung 3V sind, muß man das evtl. anpassen. Betreibe alles ohne Step-UP, nutze eine LiFEPo-Zelle, da sie die perfekten Werte liefert.

Danke ans Forum für die Unterstützung... 8)

papa

Zitat von: ZeroC_41 am 12 Februar 2021, 18:20:50
Hab mitlerweile 5 WDS40 mit Quarz am rennen und keiner zickt rum, das einzige was mich stützig macht ist wenn ich via eVCC die Spannung messe, liegt die 1,2V über dem realen. Nutze ich iVCC ist der Wert korrekt.
Im Scetch steht, dass die Ref.-Spannung 3V sind, muß man das evtl. anpassen. Betreibe alles ohne Step-UP, nutze eine LiFEPo-Zelle, da sie die perfekten Werte liefert.
eVCC mach nur Sinn, wenn Du auch nen Regler mit drauf hast. Wenn der LiPo einfach direkt angeschlossen ist, ist iVCC richtig. ALternative könntest Du auch die IrqInternalBatt nehmen. Da wird dann im Hintergrund gemessen, wenn die CPU aktiv ist. Allerdings darf dann nirgendwo anders analogREad verwendet werden.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire