Skocz do zawartości

ttmdear

Użytkownicy
  • Zawartość

    11
  • Rejestracja

  • Ostatnio

Reputacja

1 Neutralna

O ttmdear

  • Ranga
    2/10
  1. @marek1707 dzięki za odpowiedź. Wiem, że mój układ nie jest idealny, pracuje nad tym. Bardziej mi chodzi o to aby się czegoś nauczyć. Raz podłącze tak, raz inaczej, zobaczę co się dzieje itp. Poproszę o pomoc na forum, doczytam coś z książki. Aby do przodu :) Dzięki za porady, wprowadzę je układzie. Zważyłem, że w samym programie np. niepotrzebnie za każdym razem przeliczałem jakie segmenty mają się zapalić dla konkretnej cyfry. Wystarczyło, że te dane zapisałem do zmiennej i była widoczna poprawa.
  2. @marek1707 mój ostatni wpis był rozpaczliwym wołaniem o pomoc po 5 godzinach siedzenia nad płytką prototypową (oraz 8 siedzenia w pracy) i zastanawiania się czemu to nie działa. Mam nadzieje, że to mnie trochę usprawiedliwia Takie podejście jest optymalne, zgadzam się w 100%. Ok, dzisiaj mam świeży umysł. @marek1707 przeczytałem twoją wiadomość nic nie zignorowałem ! Wrzucam schemat, ogólnie zauważyłem, że po podpięciu PNP na wyświetlaczu świecą sie wszystkie segmenty i wszystkie cyfry. Zmierzyłem napięcie na bazie na jednym z tranzystorów od segmentów, wyszło mi ok. 30mV przy stanie wysokim i około 0V przy stanie niskim. Wydaje mi się, że to napięcie jest za małe, aby tranzystor PNP przestał przepuszczać. Chciałbym się również doradzi, jakie polecacie (książki, publikacje) gdzie obliczanie układów zostało wytłumaczone tak dla laika. Mam problem z obliczaniem np. napięcia w danych punktach układu no i tym samym dopieranie odpowiednich oporników etc.
  3. Zmontowałem układ na tranzystorach PNP i wszystkie segmenty zaczęły świecić. Zmierzyłem napięcie na wyściach z rejestru ok 0.30 V. Wydaje mi się, że jest to za mało aby PNP przestał przepuszczać. To 0.30V było pewnie dla NPN i też pewnie nie przepuszczał do końca. Układ zasilam zasilaczem 5V. W wolnej chwili narysuje schemat i wrzucę. Zastanawiam się tylko, czemu na wyjściach rejestru przesuwanego przy stanie wysokim jest 0.30 V. Czy ogólnie napięcie 5V jest za małe aby zasilić cały układ wyświetlacz/rejestry/mikrokontroler ?
  4. @Treker Dzięki Wprowadzę zmiany w schemacie, przetestuje i dam znać. @marek1707 Dzięki Zapoznałem się i spróbuje wprowadzić zmiany.
  5. Cześć, Mam wyświetlacz składający się z 4 znaków 7 segmnetowych. Metodą prób i błędów doszedłem do tego, że segment zapala się przez zwarcie do masy, a cała cyfra przez połączenie z plusem Stworzyłem układ z dwoma rejestrami przesuwanymi 74HC595. Na pierwszym ustawiam które segmenty maja się zapalić. Robię to przez tranzystor. Na drugim rejestrze przesuwanym ustawiam która cyferka ma się zapalić. Napisałem programik na Arduino obsługujący to wszystko. Sam program działa poprawnie, problem jest z wyświetlaniem cyferek. Jedna ostatnia cyferka jest jaśniejsza niż pozostałe. Jak naprawiłem problem i wszystkie cyferki wyświetlają się tak samo, to wszystkie ogólnie wyświetlają się dość słabo. Od razu piszę, że cały czas się uczę i elektronika jest moim hobby Więc proszę o wyrozumiałość. Zastanawiam się również nad tym, czy w dobry sposób połączyłem rejestr przesuwny z wyświetlaczem. Czy jest konieczny tranzystor aby połączyć się z masą. Poniżej wstawiam cały kod. Jest tam wariant (zakomentowany) w pętli wsuwam bity do rejestrów. W takim wariancie zawsze ostatnia cyferka świeci sie jaśniej niż pozostałe. W drugim wariancie staram się wsuwać bity tak aby na każdą cyferkę funkcja display() kończyła na każdej cyfrze. Schemat nie musi być zgodny z programem. # define R_DS 8 // Wejście danych # define R_OUTPUT_ENABLE 9 // Przenosi z na OUTPUT # define R_ST_CP 10 // Przenosi z na OUTPUT # define R_SH_CP 11 // SH_CP Wsuwa bity a R_DS # define R_MR 12 // Resetuje bity # define TEMPERATURE_INPUT A0 class DiodesDisplay { int pinDS; int pinOutputEnable; int pinSTCP; int pinSHCP; int pinMR; int lastMethod = 0; byte segmentsCharMaps[10] = { B11010111, B01010000, B11100110, B11110100, B01110001, B10110101, B10110111, B11010000, B11110111, B11110101, }; public: DiodesDisplay(int pinDS, int pinOutputEnable, int pinSTCP, int pinSHCP, int pinMR) { this->pinDS = pinDS; this->pinOutputEnable = pinOutputEnable; this->pinSTCP = pinSTCP; this->pinSHCP = pinSHCP; this->pinMR = pinMR; } // void setLevel(int level) { // digitalWrite(pinMR, HIGH); // digitalWrite(pinOutputEnable, LOW); // // 00000000 - 0 // // 10000000 - 1 // // 11000000 - 3 // // 11100000 - 7 // // 11110000 - 15 // // 11111000 - 31 // // 11111100 - 63 // // 11111110 - 127 // // 11111111 - 255 // digitalWrite(R_ST_CP, LOW); // Serial.println(level); // if (level <= 0) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 0); // } else if (level <= 5) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 1); // } else if (level <= 10) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 3); // } else if (level <= 15) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 7); // } else if (level <= 20) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 15); // } else if (level <= 25) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 31); // } else if (level <= 30) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 63); // } else if (level <= 35) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 127); // } else if (level > 35) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 255); // } // digitalWrite(R_ST_CP, HIGH); // } byte getBytesSequenceForNumber(int number, bool zeroAsNo = 0, bool dot = 0) { byte data = B00000000; if (number == 0) { if (zeroAsNo) { data = B00000000; } else { data = B11010111; } } else if (number == 1) { data = B01010000; } else if (number == 2) { data = B11100110; } else if (number == 3) { data = B11110100; } else if (number == 4) { data = B01110001; } else if (number == 5) { data = B10110101; } else if (number == 6) { data = B10110111; } else if (number == 7) { data = B11010000; } else if (number == 8) { data = B11110111; } else if (number == 9) { data = B11110101; } if (dot) { data = data | B00001000; } return data; } void display(float value) { Serial.println("display"); byte data; int valueInteger = 100 * value; Serial.println(valueInteger); int a = valueInteger % 10; int b = (valueInteger - a) % 100; int c = (valueInteger - a - b) % 1000; int d = (valueInteger - a - b - d) % 10000; // a = a / 10; b = b / 10; c = c / 100; d = d / 1000; int toSlide[4] = {d, c, b, a}; digitalWrite(pinMR, HIGH); digitalWrite(pinOutputEnable, LOW); int dd = 0; if (lastMethod == 0) { digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B10000000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[d]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B01000000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[c]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B00100000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[b]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B00010000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[a]); digitalWrite(R_ST_CP, HIGH); delay(dd); lastMethod++; } else if (lastMethod == 1) { digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B01000000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[c]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B00100000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[b]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B00010000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[a]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B10000000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[d]); digitalWrite(R_ST_CP, HIGH); delay(dd); lastMethod++; } else if (lastMethod == 2) { digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B00100000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[b]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B00010000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[a]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B10000000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[d]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B01000000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[c]); digitalWrite(R_ST_CP, HIGH); delay(dd); lastMethod++; } else if (lastMethod == 3) { digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B00010000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[a]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B01000000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[c]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B00100000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[b]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B10000000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[d]); digitalWrite(R_ST_CP, HIGH); delay(dd); lastMethod = 0; } // for(int i = 0; i < 4; i++) { // digitalWrite(R_ST_CP, LOW); // if (i == 0) { // shiftOut(pinDS, pinSHCP, LSBFIRST, B10000000); // shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[toSlide[i]]); // // shiftOut(pinDS, pinSHCP, LSBFIRST, getBytesSequenceForNumber(toSlide[i], 1)); // } else if (i == 1) { // shiftOut(pinDS, pinSHCP, LSBFIRST, B01000000); // shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[toSlide[i]]); // // shiftOut(pinDS, pinSHCP, LSBFIRST, getBytesSequenceForNumber(toSlide[i], 0, 1)); // } else if (i == 2) { // shiftOut(pinDS, pinSHCP, LSBFIRST, B00100000); // shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[toSlide[i]]); // // shiftOut(pinDS, pinSHCP, LSBFIRST, getBytesSequenceForNumber(toSlide[i])); // } else if (i == 3) { // shiftOut(pinDS, pinSHCP, LSBFIRST, B00010000); // shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[toSlide[i]]); // // shiftOut(pinDS, pinSHCP, LSBFIRST, getBytesSequenceForNumber(toSlide[i])); // } // digitalWrite(R_ST_CP, HIGH); // // digitalWrite(R_ST_CP, LOW); // // shiftOut(pinDS, pinSHCP, LSBFIRST, B00000000); // // shiftOut(pinDS, pinSHCP, LSBFIRST, B00000000); // // digitalWrite(R_ST_CP, HIGH); // } } }; // void setup() { Serial.begin(9600); pinMode(R_DS, OUTPUT); pinMode(R_SH_CP, OUTPUT); pinMode(R_MR, OUTPUT); pinMode(R_ST_CP, OUTPUT); pinMode(R_OUTPUT_ENABLE, OUTPUT); pinMode(TEMPERATURE_INPUT, INPUT); } DiodesDisplay* diodesDisplay = new DiodesDisplay(R_DS, R_OUTPUT_ENABLE, R_ST_CP, R_SH_CP, R_MR); double lastC = 0; void loop() { Serial.println("loop"); double v = analogRead(TEMPERATURE_INPUT) * 0.0048; double c = v * 100; if (abs(lastC - c) > 0.5) { diodesDisplay->display(c); lastC = c; } else { diodesDisplay->display(lastC); } }
  6. Po zmontowaniu, układ działał, ale pozostawiał wiele do życzenia. Np. przy MR(HIGH), DS(LOW) i przy zwarciu STCP, pierwsza dioda gasła, czasami gasły dwie na raz, albo wszystkie. Rozumiem, że jest to spowodowane tym, że sygnał na STCP może mieć jedno wzgórze (co jest ok), lub kilka co powoduje, że tych przesunięć jest więcej (to jest źle, to trzeba usunąć). Analogiczna sytuacja jest gdy na DS mam HIGH. Wtedy zapalała się jedna dioda lub kilka na raz. Aby zaradzić powyżej sytuacji dodałem dwa tranzystory na STCP i SHCP. Po dodaniu sytuacja się poprawiła, ale nie jest idealna. Nie udało mi się przetestować przypadku gdy wprowadzam zmiany tylko we wewnętrznym rejestrze, a potem za pomocą SHCP i STCP przenosimy je na wyjście. W dokumentacji doczytałem, że aby przenieść z rejestru przesuwnego na rejestr wyjściowy trzeba na SHCP i STCP dać wzgórze. Domyślam się, że to nie zadziałało ponieważ te wzgórza pojawiły się w złym czasie względem siebie (ale to są moje domysły). Drugi problem to przyciski, te typu TACT zamieniłem taką listwę przełączników (na zdjęciach nie jest podpięta, ale działa). Sytuacja jest poprawiła, ale też nie jest idealna. Zastanawiam się, czy przełącznik dźwigniowy np. NINIGI TS-19. Dzięki za info, zapoznam się z tematem Wrzuciłem kilka zdjęć poniżej.
  7. To dobrze, fajnie to usłyszeć Ok, dobrze wiedzieć To jest moje przeoczenie Wyszedłem z błędnego założenia, że po lewej stronie mam wyjścia a po prawej wejścia. Dlatego tego Q0 nie zauważyłem. Taki układ, jak na moje potrzeby na ten moment mnie zadowala. Myślę, że gdzieś następnym krokiem będzie właśnie ulepszenie tych elementów. Myślę, że to pomysł na kolejny projekt. Myślę, że mnie zachęciłeś, im trudniej tym więcej satysfakcji jak się ten rozgryzie Wniosków jest pełno, za to jestem wdzięczny Aktualnie, czekam na "kwant wolnego czasu". Jaki taki zdobędę to zrealizuje układ i wrzucę na forum wyniki.
  8. @marek1707 Szacunek, dzięki że poświęciłeś czasu, aby to tak opis. Przeczytałem, mam nadzieje, że dobrze to zrozumiałem, jeśli nie to wybacz mi
  9. Cześć, poniżej wrzuciłem Jak ten układ zmontowałem w pierwszej wersji to nic nie działało tak jak bym się spodziewał. Nawet zauważyłem, że nie muszę przyciskać przycisków aby jakieś tam napięcie się pojawiało. Nie wiem czy jest to możliwe ale tak to wyglądało. Próbowałem, zwierać bezpośrednio, efekt był taki sam. @marek1707, zgadzam się z tobą, że nie zachowałem się kulturalnie nie odnosząc się do każdej z odpowiedzi. Przeanalizowałem twoje rady i naniosłem zmiany na schemat. Schemat wrzuciłem, jeśli jest OK to przeniosę go na płytkę prototypową. Opornik R11 to 1K. Dzięki @atMegaTona za naniesione poprawki Rozumiem, że Q0 i Q7 po prawej i po lewe stronie sto te same wyjścia ?
  10. Cześć, Dzięki za odpowiedzi. Mam wrażenie, że ten układ mi się spalił. Po podłączeniu diody migały przez chwilę, a teraz palą się wszystkie lub żadna.
  11. Zrobiłem układ z wykorzystaniem rejestru przesuwnego 74HC595. W układzie nie użyłem Arduino tylko zwykłe przyciski. Ogólnie nie działa to poprawnie, świecą się wszystkie diody, albo migają. Jaka może być przyczyna ?
×
×
  • Utwórz nowe...