• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
PCF8574 - brak współpracy_błędny kod
#1
Kod:
#include<PCF8574.h>
//#include <AccelStepper.h>
#include <Wire.h>         
#include <LiquidCrystal_I2C.h>        
LiquidCrystal_I2C lcd(0x27, 20, 4);
PCF8574 ex1;
PCF8574 ex2;

void setup()
{
lcd.init();
lcd.clear();
lcd.backlight();  


ex1.begin(0x3F);  //IC1
ex1.pinMode(0, INPUT);
ex1.pinMode(1, INPUT);
ex1.pinMode(2, INPUT);
ex1.pinMode(3, INPUT);
ex1.pinMode(4, INPUT);
ex1.pinMode(5, INPUT);
ex1.pinMode(6, INPUT);
ex1.pinMode(7, INPUT);

ex2.begin(0x20);  //IC2
ex2.pinMode(0, OUTPUT); //Led1
ex2.pinMode(1, OUTPUT); //Led2
ex2.pinMode(2, INPUT);  //SW1           
ex2.pinMode(3, INPUT);  //SW2
ex2.pinMode(4, INPUT);
ex2.pinMode(5, INPUT);
ex2.pinMode(6, INPUT);
ex2.pinMode(7, INPUT);
}

void loop()
{
  if(ex2.digitalRead(2),LOW)
  //if(ex2.digitalRead(2),HIGH) //test1
    {
    lcd.setCursor (1, 0);
    lcd.print("SW1 active");
    ex2.digitalWrite(0,HIGH);
    }
  else
    {
    lcd.setCursor (1, 0);
    lcd.print("SW1 no active"); 
    ex2.digitalWrite(0,LOW);
    }

  if(ex2.digitalRead(3),LOW)
  //if(ex2.digitalRead(3),HIGH)  //test1
    {
    lcd.setCursor (1, 1);
    lcd.print("SW2 active");
    ex2.digitalWrite(1,HIGH);
    }
  else
    {
    lcd.setCursor (1, 1);
    lcd.print("SW2 no active"); 
    ex2.digitalWrite(1,LOW);
    }
    //ex2.blink(0,5,1000); //test2
    //ex2.blink(1,5,500); //test2
}

Witam wszystkim
Postanowiłem skorzystać / zapoznać się z bliska z ekspanderem PCF8574, zabrakło pinów w UNO [Obrazek: sad.gif]
Przedstawiam szkic w wersji uproszczonej i schemat, w pełni oddają problem:

Założenia układu:
- SW1 i SW2 spoczynkowo (zwarte styki 2 i 1) podaje +5V na P2 i P3 IC2(EX2),
- po naciśnięciu SW1 lub SW2 ma zostać podane zasilanie odpowiednia na Led1 lub Led2,
oraz zmienić komunikat na LCD,
- nie istnieje fizyczna możliwość naciśnięcia równocześnie SW1 i SW2, 
(są to wyłączniki krańcowe uruchamiane jedną dźwignią) , 

Napotkany problem:
po wgraniu załączonego kodu, układ nie reaguje na zmianę stanu SW1 lub SW2; 
Led1 i Led2 wygaszone,
LCD wyświetla "SW1 no active" i "SW2 no active".

Co próbowałem wykonać:
- dodawałem w kodzie podciągnięcia na wejściach ekspandera,
- próbowałem z R6 i R5 = 22k,
- podmieniałem IC,
w/w nie przyniosły zamierzonego efektu,

- wykonałem test1 (linia 40 i 54), 
przy test1; Led1 i Led2 świecą, LCD "SW1 active" i "SW2 active",

- wykonałem test2 (linia 66 i 67),
przy test2 Led1 i Led2 mrugają prawidłowo.

Dodatkowe informacje:
- IC2 (IC2 ex1 schemat) to PCF8574N natomiast nie widoczny na schemacie IC1 (ex1) tp PCF8574A, 
nie ma pomyłki w adresowaniu
- jeżeli wymusiłem załączenie Led1 i / lub Led2 natężenie w obwodzie każdej było I=3mA

Gdzieś popełniam błąd, ale jestem już w pętli - brak pomysłu [Obrazek: sad.gif]
Proszę o podpowiedź gdzie popełniam błąd.

Pzdr


Załączone pliki Miniatury
   
 
Odpowiedź
#2
Nie czytałeś noty producenta PCF8574, w której napisane jest jaka wydajność prądową maja port układu.
 
Odpowiedź
#3
(26-04-2020, 20:52)RPI86 napisał(a): Nie czytałeś noty producenta PCF8574, w której napisane jest jaka wydajność prądową maja port układu.
Cześć
dzięki za odpowiedź, brałem to pod uwagę, między innymi dlatego w poście wspomniałem o I:
Cytat:- jeżeli wymusiłem załączenie Led1 i / lub Led2 natężenie w obwodzie każdej było I=3mA

ale założyłem że:
- wspomniane 3mA to tak naprawdę 2,6 - 2,7mA, ale i tak to jest mniej niż 4mA (wg datesheet od Tex.), 
więc uznaję że nie tutaj leży powód,
- nawet jak led-y są odłączone to pozostaje problem braku zmiany komunikatu wyświetlanego na LCD.
Dzięki Sad
 
Odpowiedź
#4
Jeśli czytałeś dokumentację PCF8574 to bardzo dobrze, ale chyba nie wszystko zrozumiałeś. Ten układ ma dość nietypową budowę portów:
   
Na czerwono zaznaczyłem źródło prądowe o wydajności 100uA. Gdyby go nie było, sterowanie pinem jako wyjściem odbywałoby się "normalnie", czyli gdy wystawiane jest zero, dolny tranzystor zwierałby do masy, a gdy jedynka, górny do zasilania. Wtedy wydajność prądowa takiego układu wynosiłaby spodziewane miliampery.
Jednak to źródło prądowe sprawia, że gdy układ wystawia logiczne "1", jego wydajność prądowa jest ograniczona to tych 100uA.
To dlatego sterowanie ledami nie działa - gdy chcesz je zapalić, wystawiasz stan wysoki, ale prąd jest ograniczony do 100uA, a to może nie wystarczać. Jest na to proste rozwiązanie - podłącz diody nie do masy, ale do zasilania. Wtedy zapalać je będziesz wystawiając logiczne zero i układ będzie spokojnie dostarczał tyle prądu ile potrzeba.
Natomiast jak chodzi o przyciski to sytuacja jest nieco bardziej złożona. Całe to źródło prądowe zostało dodane, aby umożliwić pracę wyprowadzeń PCF8574 zarówno jako wejścia, jak i wyjścia i to bez rejestru konfigurującego kierunek portu. Biblioteka Arduino ma co prawda metodę konfiguracji kierunku, ale sam układ tego nie zapewnia - jedyne co można zrobić, to wystawić na wyjściu logiczną jedynkę. Prąd jest wtedy ograniczony do 100uA, więc zewnętrzny układ może wymusić stan niski. Inaczej mówiąc to źródło działa jak rezystor pull-up, który jest zawsze włączony.
Przyciski na Twoim schemacie zwierają albo do zasilania - i wtedy jest ok. Natomiast, gdy przycisk jest rozwarty, stan niski wymuszają rezystory 47k, czyli pull-down zwierające do masy. Niestety wbudowane źródło prądowe działa jak pull-up - dostarcza ono 100uA prądu, co na rezystorach daje spadek 100uA * 47k = 4.7V.. więc nawet jak rezystory zwierają do masy i tak na wejściu jest logiczna jedynka.
Tutaj też możesz łatwo naprawić układ - wystarczy żeby przyciski zwierały do masy, rezystory nawet nie będą potrzebne.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości