AskSin++ Library

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

Vorheriges Thema - Nächstes Thema

LuBeDa

Frage zu "Register.h"

Hallo zusammen,
ursprünglich habe ich Probleme mit dem seriellen Debbuging. Um dem Problem auf die Spur zukommen habe ich eine
neue Hardware Arduino Pro Mini und einen neuen CC1101 genommen und wollte nun das Differenzthermometer https://github.com/jp112sdl/Beispiel_AskSinPP/tree/master/examples/HM-WDS30-OT2 von Jerome nachbauen.

Das ganze natürlich in einer sauberen Softwareumgebung.

Also habe ich die "HM-WDS30-OT2.ino" heruntergeladen und die ASK-Library V2 von pa-pa. Beim kompilieren bleiben zwei Fehler:

fatal error: Register.h:
fatal error: sensors/Ds18b20.h

Die Ds18b20.h kann ich aus dem Master von pa-pa nehmen, das ist glaube ich unkritisch aber kann ich auch die Register.h daher nehmen?

Irgendwo in dem Thread stand etwas in der Art "Man mehme die XML-Gerätebeschreibung von EQ3 und erzeuge sich die passende Register.h"

Da schwirren viele Fragezeichen in meinem Kopfs herum!?!?!

Ludger

jp112sdl

Um mit einem konsistenten Stand zu arbeiten, nimm alles aus dem master-Branch.
Sonst müsstest du alle in allen referenzierten  Libs diffen, um nur das nötigste für dein Projekte nachzuziehen.


Gesendet von iPhone mit Tapatalk

LuBeDa

So, jetzt läuft es bei mir soweit.

Mein Problem mit dem seriellen Debugging lag an PlattformIO, scheinbar kommt er mit COM12 unter Windows nicht klar.  Der
WDS30-OT2 sketch von @jp112sdl mit dem Master-Branch der Library läuft perfekt.

Jetzt wird erstmal gegrillt und dann sehen wir weiter. ;D

Danke für die Library und den Support hier im Forum.

Ludger

Tom Major

Hallo papa,
ich baue gerade einen Wassermelder mit MAX1724 auf und frage mich eben ob Deine BatterySensor class eine Spannungsmessung z.B. einer Zelle von 1,5V oder 1,2V gegen Bandgap berücksichtigen kann?
Du hast zwar die BatterySensorUni, bei der man mit Spannungsteiler eine andere Spannung als den Default case (Bandgap gegen Vcc) messen kann, aber irgendwie vermisse ich dort die Umschaltung der Ref.Spannung auf Bandgap.
Wenn ich z.B. meinen 1,2V Akku mit Spannungsteiler 1:2 teile dann möchte ich die gegen die Bandgap messen und nicht gegen die Vcc vom MAX1724. Habe ich da was übersehen oder geht das zur Zeit wirklich nicht? Mache gern einen pull-request dafür..
Früher: FHEM 5.x
Jetzt: RaspberryMatic / ioBroker

Tom Major

#799
Hallo papa,

Hmm, ich entdecke gerade im Beispiel HM-SEC-RHS (das einzige was BatterySensorUni verwendet) die Verwendung einer eigene Klasse BatSensor abgeleitet von BatterySensorUni. Das würde für meine Frage oben helfen, ich könnte in der abgeleiteten Klasse selbst die Ref.Spannung auf Bandgap umschalten und dann messen. Damit hätte sich meine Frage oben erledigt.

Daraus ergibt sich meine nächste Frage im Zusammenhang mit der Batteriemessung, ich verwende die eigene Klasse ADCThreeStateChannel für einen "ADCPosition" Sensor, ADCThreeStateChannel ist von ThreeStateGenericChannel abgeleitet.

class ADCThreeStateChannel : public ThreeStateGenericChannel<ADCPosition,HALTYPE,List0Type,List1Type,List4Type,PEERCOUNT> {


Ich möchte gern in ThreeStateGenericChannel die Batteriemessung direkt nach dem Senden machen, um ein realistischeres Bild des Ladezustands der Batterie zu bekommen - und keine "selbstständige" zyklische Batteriemessung mehr haben. So was in der Art:

ThreeState.h
class ThreeStateGenericChannel : public Channel<HALTYPE,List1Type,EmptyList,List4Type,PEERCOUNT,List0Type>, public Alarm {

  class EventSender : public Alarm {
  public:
    ThreeStateGenericChannel& channel;
    uint8_t count, state;

    EventSender (ThreeStateGenericChannel& c) : Alarm(0), channel(c), count(0), state(255) {}
    virtual ~EventSender () {}
    virtual void trigger (__attribute__ ((unused)) AlarmClock& clock) {
      SensorEventMsg& msg = (SensorEventMsg&)channel.device().message();
      msg.init(channel.device().nextcount(),channel.number(),count++,state,channel.device().battery().low());
      channel.device().sendPeerEvent(msg,channel);
***   channel.device().battery().voltage(); ***
    }
  };


Meine Ergänzung mit *** gekennzeichnet. Siehst Du einen Weg diese Funktionalität zu bekommen ohne den Library source code (ThreeState.h) zu patchen?
Eigene patches in der Lib sind bei updates immer schlecht bzw. man vergisst leicht das man mal früher gepatcht hatte..

Danke,

Früher: FHEM 5.x
Jetzt: RaspberryMatic / ioBroker

papa

Es gibt mehrere Batteriesensor-Klassen. Einfach mal in Battery.h nachsehen. Dort steht auch die Beschreibung, wie sie funktionieren. Wenn das alles nicht passt, können wir auch noch weitere hinzufügen.

Schau Dir mal das RC-4 Beispiel an, da wird Hal::sendPeer() überladen, um nach 50 Nchrichten den aktuellen Batteriestand zu ermittel. Wenn Du nach jeder Nachricht messen willst, kannst Du das da auch einfach einfügen.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Tom Major

ZitatEs gibt mehrere Batteriesensor-Klassen. Einfach mal in Battery.h nachsehen. Dort steht auch die Beschreibung, wie sie funktionieren. Wenn das alles nicht passt, können wir auch noch weitere hinzufügen.
Schau Dir mal das RC-4 Beispiel an, da wird Hal::sendPeer() überladen, um nach 50 Nchrichten den aktuellen Batteriestand zu ermittel. Wenn Du nach jeder Nachricht messen willst, kannst Du das da auch einfach einfügen.

Hal::sendPeer() ist genial, quasi die Möglichkeit eines callbacks direkt nach dem Senden, genau das was ich gesucht hatte.
Vielen Dank für die Info und die Voraussicht beim SW-Design 8).

Wegen der Batteriesensor Klasse überlege ich noch mal wie es für die Applikation am Besten wäre und melde mich noch mal bei Bedarf.
Früher: FHEM 5.x
Jetzt: RaspberryMatic / ioBroker

Gruenebe

Zitat von: Wzut am 18 März 2018, 18:50:36
11,12,& 13 kannst du nicht ändern , siehe Datenblatt des ATMega328. Einzig CS auf Pin 10 kannst du bedenklos umlegen.
D.h. die interne LED auf Pin 13 ist für dich verloren/wertlos , da hatten die Arduino Designer kein glückliches Händchen :)
Hallo pa-pa,
läuft die Lib auch auf einem 328pb? Dieser hat den Vorteil, dass er eine 2. HW Serial hat und man damit auch Sensoren koppeln könnte, die per Uart kommunizieren. Ich denke da an einen FS20WUE von ELV, um eine Brücke zu alten Wettersensoren schlagen zu können oder auch einen Fingerprintsensor.
Mit SW Serial kann man nicht arbeiten, da die sich mit EnableInterrupt nicht verträgt.

Beim 328pb liegt aber auf den Pins 10-13 gerade diese zusätzliche serielle Schnittstelle. Zusätzlich hat der 328pb aber auch auf den Pins 14,15, 20&21 nochmal Miso1, Mosi1, SCK1 und SS1. Könnten diese für die Lib genutzt werden?

papa

Zitat von: Gruenebe am 09 April 2018, 19:12:21
Hallo pa-pa,
läuft die Lib auch auf einem 328pb? Dieser hat den Vorteil, dass er eine 2. HW Serial hat und man damit auch Sensoren koppeln könnte, die per Uart kommunizieren. Ich denke da an einen FS20WUE von ELV, um eine Brücke zu alten Wettersensoren schlagen zu können oder auch einen Fingerprintsensor.
Mit SW Serial kann man nicht arbeiten, da die sich mit EnableInterrupt nicht verträgt.

Beim 328pb liegt aber auf den Pins 10-13 gerade diese zusätzliche serielle Schnittstelle. Zusätzlich hat der 328pb aber auch auf den Pins 14,15, 20&21 nochmal Miso1, Mosi1, SCK1 und SS1. Könnten diese für die Lib genutzt werden?

Das wird sicherlich irgendwie gehen, wenn es entsprechende Packages für die Arduino Umgebung gibt. Wenn es nur um die serielle Schnittstelle geht, kannst Du auch einfach NDEBUG definieren. Es gibt dann keine Ausgaben mehr und die serielle Schnittstelle kann für andere Sachen verwendet werden.
Als schnelle alternative geht auch ein STM32F1 - wie z.B. das Maple Mini Board. Das hat 4 serielle Schnittstellen und mehr Speicher. Beispiele für dem STM32 gibt es bereits.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Gruenebe

#804
Was meinst Du mit Packages?

Ich teste gerade mit einem A-Star 328PB Micro 3,3V 8Mhz, für den es auch eine Arduino IDE Boardbeschreibung gibt.

https://a.pololu-files.com/picture/0J8487.1200.jpg?f96c03fe3147f6a518b4a3cc08596866

Meine FS20WUE Abfrage inkl. EnableInterrupt alleine läuft damit.

Nun wollte ich ein Asksin++ Beispiel testen und den CC1101 mit    typedef AvrSPI<20, 21, 14, 15> SPIType;       statt an 10,11,12,13 hängen.

In der Konsole erscheint dann aber
AskSin++ V2.1.4 ...
Adress Space: 32 - 78
CC initl
Error at 00 expected: 2E read:FF
usw

Müssen die Ports für den CC1101 noch an anderer Stelle geändert werden?

jp112sdl

Zitat von: Gruenebe am 10 April 2018, 10:18:28
Was meinst Du mit Packages?

Ich teste gerade mit einem A-Star 328PB Micro 3,3V 8Mhz, für den es auch eine Arduino IDE Boardbeschreibung gibt.

https://a.pololu-files.com/picture/0J8487.1200.jpg?f96c03fe3147f6a518b4a3cc08596866

Meine FS20WUE Abfrage inkl. EnableInterrupt alleine läuft damit.

Nun wollte ich ein Asksin++ Beispiel testen und den CC1101 mit    typedef AvrSPI<20, 21, 14, 15> SPIType;       statt an 10,11,12,13 hängen.

In der Konsole erscheint dann aber
AskSin++ V2.1.4 ...
Adress Space: 32 - 78
CC initl
Error at 00 expected: 2E read:FF
usw

Müssen die Ports für den CC1101 noch an anderer Stelle geändert werden?

Hast du den GD0 auch umgelegt? Der wird ja in den Sketchen an Pin 2 übergeben:
typedef AskSin<StatusLed<4>,NoBattery,Radio<RadioSPI,2> > Hal;

papa

Zitat von: Gruenebe am 10 April 2018, 10:18:28
Müssen die Ports für den CC1101 noch an anderer Stelle geändert werden?

Die Ports nicht - aber hat die CPU auch das gleich Register ? Die Daten werden ja per Hardware übertragen und dazu in das SPSR Register geschrieben.
Du kannst aber auch einfach mal auf die Arduino-SPI-Library umschalten. Dazu SPI.h includen und dann das Radio wie folgt definieren (siehe auch RC-4 Example):

typedef LibSPI<10> SPIType;
typedef Radio<SPIType,2> RadioType;


Es wird hier nur der Chip-Select-Pin (10) und der Interrupt-Pin (2) benötigt.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Tom Major

ZitatMüssen die Ports für den CC1101 noch an anderer Stelle geändert werden?

Für SPI1 Verwendung müssen m.E. mindestens in Radio.h die SPI register angepasst werden, auf SPSR1, SPCR1 usw.

Oder eine Portierung wie z.B.
https://github.com/watterott/ATmega328PB-Testing verwenden und dann auf diese SPI lib im sketch umschalten.
Früher: FHEM 5.x
Jetzt: RaspberryMatic / ioBroker

Tom Major

Übrigens geiles Teil, der Pololu A-Star 328PB.
Das Design und der Aufbau sehen ziemlich sauber aus, es gibt eine richtige und ausführliche Doku https://www.pololu.com/docs/0J74/all
4 Varianten bezüglich Spannungen und Frequenz,
Pololu hat bereits einige Sachen für Arduino portiert (aber nicht die SPI1),
und mir gefällt der extra ISP Header.
Habe mir gleich mal welche bestellt.

Und Microchip bzw. Atmel haben echte Verbesserungen im Chip reingebaut (außer den Flash und RAM zu vergrössern, das wäre noch nicer gewesen):

    Two additional GPIO pins: PE0 and PE1
    Two pins that were previously analog inputs only (ADC6 and ADC7) can now also be used as digital inputs and outputs: PE2 and PE3
    Two additional 16-bit Timer/Counters: TC3 and TC4 (for a total of two 8-bit timers and three 16-bit timers)
    Three additional PWM output pins
    A second USART (TTL serial port)
    A second TWI (Two-Wire Serial Interface, I²C-compatible)
    A second SPI (Serial Peripheral Interface)
Früher: FHEM 5.x
Jetzt: RaspberryMatic / ioBroker

Gruenebe

Es funktioniert.

Dazu habe ich die Radio.h an den entsprechenden Stellen wie folgt angepasst:

class AvrSPI {

public:
  uint8_t send (uint8_t data) {
#if defined ATmega328PB
SPDR1 = data;                  // send byte
while (!(SPSR1 & _BV(SPIF1)));  // wait until transfer finished
return SPDR1;
#else
SPDR = data;                  // send byte
while (!(SPSR & _BV(SPIF)));  // wait until transfer finished
return SPDR;
#endif
  }

  void waitMiso () {

und
    // SPI enable, master, speed = CLK/4
{
#if defined ATmega328PB
SPCR1 = _BV(SPE1) | _BV(MSTR1);
#else
SPCR = _BV(SPE) | _BV(MSTR);
#endif
}
    PINTYPE::setHigh(CS);
    // Set SCLK = 1 and SI = 0, to avoid potential problems with pin control mode


Damit kann durch Einfügen von

#define ATmega328PB

am Anfang des Scetches zwischen einem normalen 328P und einem 328PB  umgeschaltet werden.
Beim 328PB kann dann die zweite SPI statt mit typedef AvrSPI<10, 11, 12, 13> SPIType; mit typedef AvrSPI<20, 21, 14, 15> SPIType;
genutzt werden.