Wpis z mikrobloga

#programowanie #arduino #atmega #atmel #nano #oled
Siema bogowie programowania za 15k.
Mam układ na arduino nano wraz z wyświetlaczem OLED 1.3" podłączonym przez SDA i SCL (na wyświetlaczu jest opis SCK).
Układ działał jakiś czas, potem działał losowo a teraz nie działa wcale. Podpiąłem się z laptopem i monitorem portu szeregowego i ładnie daje informacje zwrotne z ADC itp ale jak tylko podepnę SDA lub SCL to nagle atmega staje i koniec komunikacji, diody przestają migać, no zawiecha totalna.
Ktoś miał taki lub podobny przypadek? Problem z banalnym kodem czy raczej uszkodzenie OLEDa i szukać nowego?
  • 16
@bambus94:
1. Sprawdź czy SDA/SCL nie są zwarte do zasilania lub do masy.
2. Jeśli możesz sprawdź moduł OLED z innym Arduino lub Arduino z innym OLED.

To tak na szybko.

Edit - jeśli masz taką możliwość to sprawdź komunikację po I2C za pomocą analizatora stanów logicznych lub chociaż oscyloskopu. Niektóre oscyloskopy mają możliwość dekodowania I2C. Jeśli nie masz takiego sprzętu sprawdź czy jest aktywność na SCL. Jeśli tak, to na
@groman43: 1. Nie są, nie na zwarcie, mają po 1,2M do masy.
2. Nie mam drugiego OLEDa, ale mam drugie identyczne nano, i też jest taki sam problem. Ale jak wgram program który nie ma formuły do obsługi OLEDa to działa, komunikacja z konsolą wciąż jest mimo podłączonego wyświetlacza.
@bambus94: Czyli albo coś jest nie tak z Twoim softem, albo ze samą komunikacją I2C. Sprawdź czy na pewno używasz odpowiedniego adresu oraz czy na pewno wysyłasz odpowiednie komendy. Inna bajka to jak obsługujesz I2C - czy przez pooling w pętli (coś mi mówi że tak) czy za pomocą przerwań. Jeśli uważasz że Twój kod jest dobry, to analizator stanów logicznych / oscyloskop i do dzieła.
Wczoraj jak sprawdzałem oscyloskopem to wykres był płaski jak stół.


@bambus94: Na 99.9% problem z kodem. Pewnie w tak zwanym "międzyczasie" coś się usunęło lub przestawiło...

Napisz bardzo prostą obsługę I2C (albo skorzystaj z jakiegoś gotowca), która wysyła non-stop jakieś dane po I2C i sprawdź oscyloskopem.

Sprawdź również ciągłość linii I2C i rezystory pull-up.
@groman43: Idę zepnę to do kupy jeszcze raz i zobaczę co się będzie działo.

Na 99.9% problem z kodem. Pewnie w tak zwanym "międzyczasie" coś się usunęło lub przestawiło...


Możliwe, ale to było tak że wczoraj działa, a dzisiaj nie. Nikt nic nie ruszał w układzie ani w kodzie.
@groman43: No właśnie te rezystory Pull up, bo w wyświetlaczu ich nie ma, ja też ich nie montowałem więc albo programowo muszę dać pull up na tych pinach albo dołożyć rezystory.
@bambus94: No panie Andrzeju, z czym do ludzi ( ͡° ͜ʖ ͡°) Przyznam że nie wiem czy Arduino Nano ma wbudowane rezystotory pull-up, które można włączyć programowo. Najszybciej pewnie jest podłączyć dwa razyk 4k7 pomiędzy zasilanie a linie I2C.

Jeszcze jedna rzecz z tych bardziej oczywistych - sprawdź czy Arduino Nano i wyświetlacz OLED korzystają z tego samego napięcia, na przykład 5V. Jeśli wyświetlacz korzysta z innego
@groman43: Dzięki mordo, dołożyłem 2x 2k (bo na jakimś schemacie takie widziałem) pull up i ruszyło od strzała. Ciekawe jak to działało wcześniej bez tych rezystorów.
Wyświetlacz i Nano działają na 5V i nie ma kolizji.
@bambus94: Piny, które mogą pełnić kilka różnych funkcji, jak GPIO lub I2C, muszą być w pewnym stopniu "rekonfigurowalne" i potrafią się czasem dziwnie zachowywać. Żeby ogarnać, co dokładnie się stało, trzeba zaglądnąć do datasheeta i zrozumieć jak takie piny dokładnie działają. A ponieważ jest sobota wieczór, jakoś nie mam na to ochoty.
Najczęstszym przypadkiem jest zasilanie MCU za pomocą GPIO - https://www.microchip.com/forums/m619159.aspx Pamiętam że Dave Jones z EEVblog zrobił o tym
@groman43: To jeszcze raz ja. Gdyż problemów ciąg dalszy. Płytka z podpiętym zasilaniem, od A0 do A3 oraz pin D3 czyli INT1. Wsad to tylko pomiary z ADC i komunikacja do kompa.
Tak wygląda kawałek kodu co ma wyświetlić konsola, i jest to od razu za void loop ()

Serial.print("START");
Serial.println();
Serial.print("temp. ");
Serial.println(temperature);
Serial.print("HORNstate: ");
Serial.println(HORNstate);
Serial.print("Ttime");
Serial.println(Ttime);
Serial.print("frequency: ");
Serial.println(frequency);
Serial.print("RPM: ");
Serial.println(RPM);
Serial.print("StateOil: ");
Serial.println(stateOil);
Serial.print("StateCharging: ");
Serial.println(stateCharging);
bambus94 - @groman43: To jeszcze raz ja. Gdyż problemów ciąg dalszy. Płytka z podpięt...

źródło: comment_1657212720kNtBJbYwQ5BJimn7JS0aCt.jpg

Pobierz
No i w międzyczasie zanim okroiłem kod i ograniczyłem ilość podłączonych pinów sprawdziłem przebieg na SCK i SDA. Oba wyglądały podobnie, jak prostokąt z wypełnieniem ok 70%. na SCK bym się nie zdziwił ale SDA to raczej powinny być jakieś przerwy a nie ciągły prostokąt jak z NE555.
@groman43: Schematu nie dostaniesz gdyż nawet ja go nie mam. Robiłem to na żywca.
A z kodem próbuj, może coś zrozumiesz z moich wypocin posklejanych z 30 różnych tutoriali.
`
#include
#include
#include
#include
#include

/* Uncomment the initialize the I2C address , uncomment only one, If you get a totally blank screen try the other*/
#define i2cAddress 0x3c //initialize with the I2C addr 0x3C Typically eBay OLED's
//#define i2c
@bambus94: O panie Andrzeju!
1. Kod się wrzuca na pastebin albo inne tego typu wynalazki ( ͡° ͜ʖ ͡°)
2. Napisz nowy kawałek softu, w którym tylko inicjujesz seriala w void setup() a później próbujesz wysłać dane w void loop(), bez tych wszystkich innych dekoracji.
3. Sprawdź oscyloskopem czy jest jakaś aktywność po serialu.

Więcej zdalnie nie pomogę niestety.