Hallo,
zuerst mal wieder meinen Dank an die AskSin- und HB-Experten papa, Jérôme und Ronny Thomas, die dieses Thema und die Hardware weiter fleißig voranbringen.
Habe mir vor Weihnachten die Platinen für den HB-UNI-SenAct-8-8 von Ronny besorgt. Auch die Beschaffung der Bauteile klappte Dank Ronnys reichelt-Bestellliste problemlos. Der Zusammenbau dauerte dann doch etwas länger als zunächst gedacht - ist halt kein ARR-Bausatz . Trotzdem Dank an Ronny für den guten Bausatz.
NUN ZUM PROBLEM
Nach Anpassung der PCF8574_ADDRESS auf 0x20 (hatte gem. Ronnys Liste einen PCF8574 und nicht die Default-Version PCF8574A eingebaut) und Setzen von #define RELAY_ON_STATE_INVERT false klappte das Schalten der Ausgänge wunschgemäß.
Ein Wechsel der (Prüf-) Tasterzustände wurde allerdings nicht erkannt...
Nach langer Suche (hier wäre ein Schaltplan von Ronnys Schaltung hilfreich gewesen) wurde klar, dass dieses Problem mit der Beschaltung der Tastereingänge und der softwaremäßigen Abfrage zusammenhängt: Die Taster schalten die Eingänge, die jeweils direkt vor der Statusabfrage über prozessorinterne Pullups auf 3,3V-Pegel gelegt werden, nach GND. Da alle Eingänge noch einen Entstör-/Entprellkondensator von 0,1µF gegen Masse haben, schaffen die internen Pullups es nicht, bei geöffnetem Taster das Eingangssignal bis zur Abfrage auf einen vernüpftigen High-Pegel ansteigen zu lassen. Also wird der geöffnete Taster nicht erkannt !
Anders sollte es aussehen, wenn über die externen Klemmen-Einänge (sind über 330 Ohm an die Eingänge angeschlossen) ein niederohmiges Schaltsignal (z.B.: 0 oder 3,3V) vorgegeben wird.
Um die Taster, gerade für erste Testzwecke, sauber abfragen zu können, habe ich dann in der verwendeten readPin-Abfrageroutine in AskSinPP.h folgende Änderung vorgenommen:
Code: Alles auswählen
static uint8_t readPin(uint8_t pinnr,uint8_t enablenr=0,uint8_t ms=0) {
uint8_t value=0;
if( enablenr != 0 ) {
digitalWrite(enablenr,HIGH);
if( ms != 0 ) {
_delay_ms(ms);
}
}
pinMode(pinnr,INPUT_PULLUP);
value = digitalRead(pinnr);
// mod by mar ...
// pinMode(pinnr,OUTPUT);
// digitalWrite(pinnr,LOW);
if( enablenr != 0 ) {
digitalWrite(enablenr,LOW);
}
return value;
}
@papa und Jérôme:
- Gibt es eine einfachere Lösung, die einen Eingriff in AskSinPP unnötig macht ?
- Warum werden Eingangspins in der Setup-Phase bzw. beim init() nicht einfach fest auf INPUT_PULLUP gesetzt ?
Gruß
Thomas