Schreibbefehl auf PCF8574 friert ATMEGA328 ein

Hallo,

jetzt muss ich auch mal um Hilfe fragen. Irgendwie verträgt sich scheinbar die PCF8574 Library nicht mit der RS485 Library.

Verwendete Libraries aus dem Bibliotheksverwalter:
RS485HwSerial

PCF8574 library
https://www.mischianti.org/category/my-libraries/pcf8574/

Hier mal ein zusammengekürzter Testsketch:

#include <Arduino.h>
#include <PCF8574.h>
#include <RS485HwSerial.h>

// RS485_TE:
// rs485 transceiver's transmit enable pin (often called TE or DE).
const uint8_t RS485_TE = A2;

// RS485_BPS:
// baud rate/bps on rs485 port
const uint32_t RS485_BPS = 9600;

int Fuellstand = 0;
unsigned long lastrefresh = 0;

PCF8574 pcf8574(0x38);

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  pcf8574.pinMode(P0, OUTPUT);
  RS485HwSerial0.begin(RS485_BPS);
  RS485HwSerial0.transmitterEnable(RS485_TE);
  RS485HwSerial0.begin(RS485_BPS);   // rs485 uart setup
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);
  if (millis() - lastrefresh >= 5000){
    if (Fuellstand == 6) Fuellstand = 1;
    RS485HwSerial0.write(Fuellstand);
//    pcf8574.digitalWrite(P0, LOW);
    lastrefresh = millis();
    Fuellstand = Fuellstand + 1;
  }
}

DE des MAX481 hängt an A2, RX und TX an Pin0 und 1. Da es sich um eine selbst entwickelte Platine handelt, gehen Pin0 und 1 nur an den MAX481!
Der PCF8574 hängt natürlich an A4 und A5.

Sobald am PCF8574 im Sketch ein Ausgang gesetzt werden soll, hängt der ATMEGA 328. Ich habe mal testweise noch eine LED angeklemmt und diese im 0,5 Sekundentakt blinken lassen.
Nach rund 5 Sekunden schreibt er dann noch über den RS485 die 0 raus und danach geht nichts mehr. Wenn der Schreibbefehl für den PCF8574 auskommentiert ist (wie oben im Sketch), funktioniert der Sketch.
Habe schon die PCF8574 Lib gewechselt und die RS485 Lib auch.

Leider habe ich zum Testen keinen UNO greifbar...

Hat eventuell jemand noch eine Idee?

Gruß, Jürgen

pcf8574.begin();

??

Auch:

int PCF8574::lastError()

Was sagt es dir?

Dann noch, I2C Forenposting Standard Annahme:
Werden keine Pullup erwähnt, liegt das Problem genau dort.

Auch das doppelte RS485HwSerial0.begin(RS485_BPS); verwirrt mich ein wenig.

1 Like

Dir fehlt noch ein Pin für den MAX481

Na toll. 7 Stunden lang das

pcf8574.begin();

nicht vermisst. Kaum ist das drin, geht es.
PullUps sind drin.

Mit dem doppelten RS485HwSerial0.begin(RS485_BPS); hast Du Recht. Ist mir nicht mal bei dem zusammengekürzten Testsketch aufgefallen. Habe ich jetzt auch gleich im kompletten Sketch entfernt.

Vielen Dank für die schnelle Hilfe!!

Hätte mich vorhin aus Verzweiflung schon fast aus dem Kellerfenster gestürzt :wink:
Derweil war die Lösung so einfach...

Hier noch der überarbeitete Testsketch:

#include <Arduino.h>
#include <PCF8574.h>
#include <RS485HwSerial.h>

// RS485_TE:
// rs485 transceiver's transmit enable pin (often called TE or DE).
const uint8_t RS485_TE = A2;

// RS485_BPS:
// baud rate/bps on rs485 port
const uint32_t RS485_BPS = 9600;

int Fuellstand = 0;
unsigned long lastrefresh = 0;

PCF8574 pcf8574(0x38);

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  pcf8574.begin();
  pcf8574.pinMode(P0, OUTPUT);
  RS485HwSerial0.begin(RS485_BPS);
  RS485HwSerial0.transmitterEnable(RS485_TE);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);
  if (millis() - lastrefresh >= 5000){
    if (Fuellstand == 6) Fuellstand = 1;
    RS485HwSerial0.write(Fuellstand);
    pcf8574.digitalWrite(P0, Fuellstand%2);
    lastrefresh = millis();
    Fuellstand = Fuellstand + 1;
  }
}

Ausgang P0 und die OnboardLED dienen nur als DebugLED.

Gruß, Jürgen

Nein, das passt soweit. Es gibt 3 Möglichkeiten die Kommunikationsrichtung umzuschalten.
/RE und DE bekommen je einen Pin am ATMEGA.
/RE und DE kommen an einen PIN.
/RE auf GND und nur DE gesteuert, liefert alle gesendeten Daten zurück auf den RX des ATMEGA. So habe ich das bei mir auch angeklemmt. Damit kann man auch auf Kollisionen prüfen. Wenn empfangene Daten ungleich gesendete Daten sind, hat wohl ein anderer Busteilnehmer zur gleichen Zeit gesendet.

Gruß, Jürgen

Acha gut zum wissen die MAX laufen bei mir mit 4 Pins muss mal herumspielen
Danke

Gruß
Bernhard

PS. Hast verdammt großes Kellerfenster :wink:

Nach 30cm kommt die Wand vom Lichtschacht. Verursacht beim "aus dem Fenster stürzen" dann nur Kopfschmerzen. Kann man dann notfalls auch öfter machen. :wink:

:rofl: :rofl: :rofl:

Wenn ich sehr verzweifelt bin, stürze ich mich immer vom Teppichrand. :slightly_smiling_face: