• 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
Konflikt bibliotek softwareserial z PCF8574
#1
Witam
Czy da się rozwiązać konflikt bibliotek od softwareserial i rozszerzenia portów PCF8574.
Prawdopodobnie rozchodzi się o przerwanie. 
Może istnieje jakieś inne rozwiązanie. Potrzebuję dodatkowo 2 porty (wyjścia cyfrowe)  a mogę wykorzystać tylko I2C, do którego już podłączony jest wyświetlacz i czujnik temperatury.
Dodam, że urządzenie jest już wykonane i działa. Chciałem dodać jeszcze sterowanie dwoma zewnętrznymi urządzeniami i napotkałem na problem z rozszerzeniem PCF8574. Rozszerzenie miało być poza aktualnym urządzeniem, nie chcę w nim nic poza zmianą softu robić.
 
Odpowiedź
#2
(15-02-2020, 20:35)Agregacik napisał(a): Witam
Czy da się rozwiązać konflikt bibliotek od softwareserial i rozszerzenia portów PCF8574.
Prawdopodobnie rozchodzi się o przerwanie.
Softserial (zły pomysł, dlaczego użyłeś tego wynalazku?) używa przerwań timera, PCF8574 przerwań I2C. Konfliktu nie powinno być, chyba, że jest duża prędkość softserial (bry.....). Wyjściem z sytuacji będzie nie używanie kiepskiej biblioteki Wire ale napisanie obsługi I2C "na piechotę".

Oczywiście, głównym winowajcą problemów jest softwareserial . Jego użycie oznacza najczęściej zły wybór mikrokontrolera do realizowanego zadania (np płytki UNO tam gdzie należałoby użyć MEGA). Gdy się zdarzy, że założenia projektu się zmienią, zamiast ograniczonej softwareserial można użyć SC16IS7xx. Używasz I2C więc problemu prawie nie ma.
Kod z delay to nie kod, to DEMO!
Możliwości sprzętowe uC trzeba wykorzystywać a nie /machać/. GPIO!
Jestem a usilnie chcę być amatorem to dwie różne rzeczy.

http://er-mik.prv.pl/projekty edw.php 
http://er-mik.prv.pl/projekty_avt.php
 
Odpowiedź
#3
Wstępnie problem opanowany. Znalazłem inną bibliotekę i nie wykazuje konfliktu przy kompilacji. Czeka mnie wgranie kodu do urządzenia i sprawdzenie czy to wszystko do kupy działa.
 
Odpowiedź
#4
Inna biblioteke I2C czy softserial?
Kod z delay to nie kod, to DEMO!
Możliwości sprzętowe uC trzeba wykorzystywać a nie /machać/. GPIO!
Jestem a usilnie chcę być amatorem to dwie różne rzeczy.

http://er-mik.prv.pl/projekty edw.php 
http://er-mik.prv.pl/projekty_avt.php
 
Odpowiedź
#5
Inna biblioteka do PCF8574. Ta która nie powoduje "konfliktu" to PCF8574_library-master.
 
Odpowiedź
#6
W sumie uzywać biblioteki aby transmitować dwa bajty po I2C? Nie szybciej było napisać ten fragment kodu zamiast szukać biblioteki wątpliwej jakości?
Wysłanie bajtu po I2C w AVR mega:
Kod:
//----------------------------------------------------------------------//
byte TWI_Write( byte d )
{
    TWDR = d;
    return( TWI_Action( 0 ) );
}
Porównaj to do tego co robią biblioteki, które w dodatku się wieszają. Cała obsługa PCF to zapis:
Kod:
TWI_Start();
TWI_Write( adres_pcf_da_zapisu );
TWI_Write( dana )
TWI_Stop();
i odczyt:
Kod:
TWI_Start();
TWI_Write( adres_pcf_do_odczytu );
dana = TWI_Read(  false );
TWI_Stop();
Naprawdę potrzeba biblioteki?

Pozostałe potrzebne funkcje obsługi I2C bez ograniczeń w arduino są podobnie banalne
Kod:
byte TWI_Read( byte ack )
{
    if ( ack ) TWI_Action( 1<<TWEA );
    else TWI_Action( 0 );

    TWI_Status = TWSR;
    return( TWDR );
}


byte TWI_Start()
{
    return( TWI_Action( 1<<TWSTA ) );
}

byte TWI_Stop()
{
byte overtime=100;


    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
    // Generując stop czekamy na bit TWSTO a nie WTINT
    while ( (TWCR & (1<<TWSTO)) )
        {
        _delay_us(10);
        overtime--;
        if ( !overtime ) break;
        }
    return( TWSR );
}


void TWI_Master_Initialise()
{
    TWI_Master_Off();

    //SCL frequency CPU Clock frequency / ( 16 + 2(TWBR) + 4 · TWPS ) TWPS = PRESKALER
    //F_CPU/(16+2*TWBR+4*(TWSR&3))
    // TWBR min 10
    TWBR = ((F_CPU/1000/TWISCK)-16)/2;            // TWISCK - CLK w kHz
    TWCR = (1<<TWEN);        // Enable TWI-interface and release TWI pins.
}
i działa ponowny start w przeciwieństwie do bibliotek arduino, nie ma ograniczenia liczby danych do 32. Do tego wszystkiego potrzebna funkcja:
Kod:
byte TWI_Action( byte command )
{
byte overtime=100;


    //write command to TWCR and make sure TWINT is set
    TWCR = (command | (1<<TWINT) | (1<<TWEN) );
    //now wait for TWINT to be set again (when the operation is completed)
    while( !(TWCR & (1<<TWINT)) )
        {
        _delay_us(10);
        overtime--;
        if ( !overtime ) break;
        }
/*
Istnieją dwa kody stanu, które nie odpowiadają określonym stanie TWI, patrz tabela 120.

Stan 0xF8 wskazuje, że żadne istotne informacje są dostępne ponieważ TWINT Flag
nie jest ustawiona. Dzieje się tak gdy TWI nie jest zaangarzowany w transfer.
Jeśli status F8 pojawia się po wysłaniu warunku statt, może to oznaczać uszkodzenie magistrali IIC (zwarcie lub brak rezystorów podciągających).

Stan 0x00 oznacza, że wystąpił błąd magistrali IIC.
Błąd występuje, gdy START lub STOP pojawił się w nieodpowiednim miejscu najczęściej podczas nielegalnego przejęcia magistrali.
Gdy wystąpi błąd magistrali (w trybie Slave), należy wyserować TWSTO i ustawiC TWINT.
TWI nie wygeneruje nic na magistrali ale zwolni linie.
*/
    TWI_Status = TWSR & 0b11111100;
    return( TWI_Status );
}
Kod z delay to nie kod, to DEMO!
Możliwości sprzętowe uC trzeba wykorzystywać a nie /machać/. GPIO!
Jestem a usilnie chcę być amatorem to dwie różne rzeczy.

http://er-mik.prv.pl/projekty edw.php 
http://er-mik.prv.pl/projekty_avt.php
 
Odpowiedź
#7
Dzięki za obszerne wyjaśnienia i przykłady. Postaram się to przeanalizować. Właściwie zapis do PCF8574 wydaje się prosty.
Nie jestem biegły w te klocki. Przygodę z programowaniem zacząłem ze dwa lata temu. Rozwijam swoje umiejętności na tyle na ile jest mi to potrzebne do moich projektów, o kurcze jak to szumnie brzmi. "Szkolę" się raczej na przykładach adaptując je do swoich celów.
Gotowe biblioteki są pewnym rozwiązaniem dla takich jak ja, którzy nie mając większego pojęcia o języku programowania np C++ , udaje się wykonać coś działającego.
Zdaję sobie sprawę, że biblioteki nie są doskonałe i w połączeniu z innymi mogą stwarzać problemy, czego dowodem jest ten wątek.
Rozszerzenia portów użyłem w tym przypadku z konieczności. Wykonane urządzenie na arduino nano zajęło wszystkie jego porty. W pierwotnym założeniu to wystarczyło, ale pojawiły się okoliczności że potrzebuję dodatkowych 2 portów do sterowania innym urządzeniem i stąd pomysł rozszerzenia.
Dlaczego użyłem softwareseriala, bo łatwiej jest wymieniać oprogramowanie jak nie jest on zajęty i w przypadku problemów można na niego "wyrzucać" sobie "markery" z programu. Dodatkowo w innych "projektach" nie stwarzał problemów.
 
Odpowiedź
#8
(18-02-2020, 12:47)Agregacik napisał(a): 1. Nie jestem biegły w te klocki. Przygodę z programowaniem zacząłem ze dwa lata temu.


2. Rozwijam swoje umiejętności  na tyle na ile jest mi to potrzebne do moich projektów, o kurcze jak to szumnie brzmi.  "Szkolę" się raczej na przykładach adaptując je do swoich celów.
Gotowe biblioteki są pewnym rozwiązaniem dla takich jak ja, którzy nie mając większego pojęcia o języku programowania np C++ , udaje się wykonać coś działającego. Zdaję sobie sprawę, że biblioteki nie są doskonałe i w połączeniu z innymi mogą stwarzać problemy, czego dowodem jest ten wątek.


3. Rozszerzenia portów użyłem w tym przypadku z konieczności. Wykonane urządzenie na arduino nano zajęło wszystkie jego porty. W pierwotnym założeniu to wystarczyło, ale pojawiły się okoliczności że potrzebuję dodatkowych 2 portów do sterowania innym urządzeniem i stąd pomysł rozszerzenia.


4. Dlaczego użyłem softwareseriala, bo łatwiej jest wymieniać oprogramowanie jak nie jest on zajęty i w przypadku problemów można na niego "wyrzucać" sobie "markery" z programu. Dodatkowo w innych "projektach" nie stwarzał problemów.
ad 1.
Jeszcze kilka lat i będziesz pisał dobre programy.

2.
Nie wzoruj sie na bibliotekach arduino. Są pisane beznadziejnie. Nie widziałem ani jednej napisanej dobrze. Na arduino to nawet miganie diodą potrafi być napisane źle.

3.
Czyli jak pisałem wcześniej, źle dobrany mikrokontroler. Wybieraj zawsze z zapasem.

4.
Soft serial, zwłaszcza na AVR + arduino to zły wybór. Arduino uwielbia zawieszać przerwania na bardzo długo. Arduino jest złą platformą do nauki jak niegdyś Basic. Zanim poznałem Arduino, myślałem, że co najgorsze w programowaniu i budowie CPU jest związane z Billem G, poczynając od Basic (najgorszy używany jeszcze język programowania), poprzez skradzionego i nieudolnie przerobionego DOS do najgorszego pseudosystemu Windows do USB, którego implementacja na Windzie jest najgorsza z możliwych.
Arduino przebiło chyba to wszystko. Dobry przykład jak nie budować urządzeń i pisać softu. Od strony sprzętu wybór złego mikrokontrolera. Pierwotnie był mega8, naturalnie bez debugera, niczym jak w latach 80 I8051.Zmiana na mega328 zły kierunek. Mimo, że ma debuger arduino raczy tego nie widzieć. Gdyby go użyć, to mega328 ma DW więc dawniej drogo i kiepsko, DW jest kapryśne. Lepszy byłby mega z JTAG. Interfejs dobry i tani ale AVR z JTAG jest kilka razy droższy niż ARM. Z punktu widzenie "programisty" arduino co za różnica ARM czy AVR? Taka, że ARM jest lepszy i tańszy ale nie wiedzieć czemu początkujący brną w AVR

Zainteresuj sie tanimi i co ważne oryginalnymi płytkami NUCLEO/DISCOVERY ze stajni STM. Takie badziewiarski oryginalne arduino uno kosztuje ok 90zł. Oryginalnye NUCLEO jakieś 1000 razy lepsze od uno, 50-60zł. Co ważne, arduino do CV raczej nie wpiszesz, tak jak i Bascom (chyba, że chcesz aby Cię wyśmiano) co innego ARM.
AVR, tak jak i Bascom, przyszłości nie ma . Przyszłość uC, czy się to komuś podoba czy nie, należy do 32-bit i C. Jak najszybciej zejdź ze ścieżki zwanej arduino.
Kod z delay to nie kod, to DEMO!
Możliwości sprzętowe uC trzeba wykorzystywać a nie /machać/. GPIO!
Jestem a usilnie chcę być amatorem to dwie różne rzeczy.

http://er-mik.prv.pl/projekty edw.php 
http://er-mik.prv.pl/projekty_avt.php
 
Odpowiedź
#9
@semi dlaczego zmieniłeś nazwę użytkownika?
 
Odpowiedź
#10
(19-02-2020, 12:51)elvis napisał(a): @semi dlaczego zmieniłeś nazwę użytkownika?
Straciłem dane do konta e-mail i forum. Musiałem założyć nowe konto.
Kod z delay to nie kod, to DEMO!
Możliwości sprzętowe uC trzeba wykorzystywać a nie /machać/. GPIO!
Jestem a usilnie chcę być amatorem to dwie różne rzeczy.

http://er-mik.prv.pl/projekty edw.php 
http://er-mik.prv.pl/projekty_avt.php
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości