Skocz do zawartości

Odświeżanie wyświetlaczy 7-segmentowych


Mabo

Pomocna odpowiedź

Witam!

Mam problem z powyższym - chciałem podpiąć 5 1 i 2-sekcyjnych wyświetlaczy ale powyżej 2-3 zaczynają migotać. Zakładam że to odświeżanie - czy można coś na to poradzić?

Mój projekt zakłada export danych z symulatora lotu DCS A-10C stąd biblioteka DCS-BIOS.

#define DCSBIOS_IRQ_SERIAL
#include <SevenSeg.h>
#include <DcsBios.h>

SevenSeg disp1(2, 3, 4, 5, 6, 7, 8);
SevenSeg disp2(2, 3, 4, 5, 6, 7, 8);
SevenSeg disp3(2, 3, 4, 5, 6, 7, 8);
SevenSeg disp4(2, 3, 4, 5, 6, 7, 8);
SevenSeg disp5(2, 3, 4, 5, 6, 7, 8);

 const int numOfDigits1 = 2;   
 const int numOfDigits2 = 1;   
 const int numOfDigits3 = 1;   
 const int numOfDigits4 = 2;   
 const int numOfDigits5 = 2;   

 int digitPins1[] = {A0,A1};
 int digitPins2[] = {A2};
 int digitPins3[] = {A3};
 int digitPins4[] = {A4,A6};
 int digitPins5[] = {12,11};

DcsBios::StringBuffer<2> vhfamFreq1StrBuffer(0x1190, NULL);
DcsBios::StringBuffer<1> vhfamFreq2StrBuffer(0x118e, NULL);
DcsBios::StringBuffer<1> vhfamFreq3StrBuffer(0x118e, NULL);
DcsBios::StringBuffer<2> vhfamFreq4StrBuffer(0x1192, NULL);
DcsBios::StringBuffer<2> vhfamPresetStrBuffer(0x118a, NULL);


void setup() {
   DcsBios::setup();
  disp1.setDigitPins(numOfDigits1, digitPins1); 
  disp2.setDigitPins(numOfDigits2, digitPins2); 
  disp3.setDigitPins(numOfDigits3, digitPins3); 
  disp4.setDigitPins(numOfDigits4, digitPins4); 
  disp5.setDigitPins(numOfDigits5, digitPins5); 
   }

void loop() {
   DcsBios::loop();
       disp1.write(vhfamFreq1StrBuffer.getData());
       disp1.clearDisp();
       disp2.write(vhfamFreq2StrBuffer.getData());
       disp2.clearDisp();
       disp3.write(vhfamFreq3StrBuffer.getData());
       disp3.clearDisp();
       disp4.write(vhfamFreq4StrBuffer.getData());
       disp4.clearDisp();
       disp5.write(vhfamPresetStrBuffer.getData());
       disp5.clearDisp();
      }
Link do komentarza
Share on other sites

Generalnie to chyba nie jest polecany sposób używania biblioteki SevenSeg. W poniższym dokumencie:

http://sim.marebakken.com/SevenSeg.pdf

(czytałeś, prawda?) na stronach 9/10 jest opis sposobu podłączenia wyświetlacza 4 i 2-cyfrowego, ale zaczyna to działać kulawo i trzeba ręcznie wpisać opóźnienia (patrz funkcja Setup i wywołania setDigitDelay). Jeżeli ręcznie ustawisz to na 1250us, powinieneś mieć utrzymane 100Hz dla multipleksowania 8 cyfrowego.

Moim zdaniem powinieneś zrobić to jako jeden wyświetlacz 8-cyfrowy sterowany przez jedną instancję biblioteki SevenSeg i "ręcznie" wpisywać cyfry do odpowiednich pól.

Link do komentarza
Share on other sites

To ręczne wpisywanie mi jakoś nie wychodzi - cyfry nakładają się na siebie.

Co robię źle?

#define DCSBIOS_IRQ_SERIAL
#include <SevenSeg.h>
#include <DcsBios.h>

SevenSeg disp(2, 3, 4, 5, 6, 7, 8);

 const int numOfDigits = 6;   

 int digitPins1[] = {A0,A1};
 int digitPins2[] = {A2};
 int digitPins3[] = {A3};
 int digitPins4[] = {A4,A5};


DcsBios::StringBuffer<2> vhfamFreq1StrBuffer(0x1190, NULL);
DcsBios::IntegerBuffer vhfamFreq2Buffer(0x118e, 0x00f0, 4, NULL);
DcsBios::IntegerBuffer vhfamFreq3Buffer(0x118e, 0x0f00, 8, NULL);
DcsBios::StringBuffer<2> vhfamFreq4StrBuffer(0x1192, NULL);

void setup() {
   DcsBios::setup();
  disp1.setDigitPins(numOfDigits, digitPins1); 
  disp2.setDigitPins(numOfDigits, digitPins2); 
  disp3.setDigitPins(numOfDigits, digitPins3); 
  disp4.setDigitPins(numOfDigits, digitPins4); 
   }

void loop() {
   DcsBios::loop();
       disp1.write(vhfamFreq1StrBuffer.getData());
       disp1.clearDisp();
       disp2.write(vhfamFreq2Buffer.getData());
       disp2.clearDisp();
       disp3.write(vhfamFreq3Buffer.getData());
       disp3.clearDisp();
       disp4.write(vhfamFreq4StrBuffer.getData());
       disp4.clearDisp();
   }
Link do komentarza
Share on other sites

Chyba nie za bardzo rozumiesz co robisz. Teraz masz 4 wyświetlacze każdy po 6 cyfr - to bez sensu. Przy każdym wywołaniu setDigitPins mówisz, że masz 6 cyfr a wskazujesz tablicę opisującą tylko jedną lub dwie cyfry. Nic dziwnego, że zrobił się bałagan.

Może zacznij od czegoś prostszego bo nie ma nic gorszego niż walka z kilkoma problemami na raz. Wywal na razie to całe wczytywanie danych przez dcsBios bo nawet nie wiesz co z tamtąd przychodzi. Zrób prosty kod jak w przykładzie na stronie 5 tylko zamiast czterech skonfiguruj to na 8 cyfr i wyświetl jakąś dużą liczbę np. 8-cyfrową lub string 8-znakowy złożony z 8 cyfr. Tylko wtedy gdy to zadziała, idź dalej. Powoli, nic na skróty. Musisz rozumieć co robi każda linia Twojego kodu i po co wywołujesz poszczególne funkcje. Masz dokumentację, przeczytaj opisy używanych funkcji i zrozum je, bo inaczej będziesz skazany na zgadywanie i bezradne rozkładanie rąk.

A jak już nabierzesz biegłości w pokazywaniu na jednym dużym wyświetlaczu różnych danych numerycznych i tekstowych, podziel swoje LEDy na kilka pól i na każdym wyświetl liczbę którą znasz i wiesz jaka powinna być. I dopiero wtedy możesz spróbować wczytywać dane z samolotu. Najpierw wypisz je sobie na konsoli szeregowej żebyś wiedział czy w ogóle mają sens a dopiero później skieruj je na wyświetlacz.

Metodą małych kroków zajdziesz do celu dużo szybciej niż próbując od razu zgadywać końcowe rozwiązanie.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

A jak to się ma do wyświetlacza z 3 cyframi (wspólna anoda) ? chciałbym wyświetlać 3 różne znaki np aba, bab, cdc, (pokazałem to na przykładzie liter)

chodzi mi o takie cos

Link do komentarza
Share on other sites

A znasz język angielski?

W opisie masz

I used a shift register (74HC595 on the left side) to save a few outputs of the Arduino device.

3 outputs control the segments using the shift register and 3 outputs directly select the digit to control. Only one digit is active at any moment but this is not visible to the eye.

Mówi Ci to coś czy nie bardzo?

Link do komentarza
Share on other sites

No ale przecież kombinacje zapalanych segmentów nie biorą się z powietrza tylko są zaszyte w kodzie. Nie wiemy jak wygląda Twój program i jakiej biblioteki używasz. Nie ma jednego słusznego sposobu ani podłączenia ani obsługi wyświetlacza LED więc co, mamy wróżyć z fusów? W zależności od API jakie udostępnia biblioteka masz do dyspozycji różne funkcje. Jak rozumiem jedna z nich wyświetla przekazaną w argumencie liczbę i to już opanowałeś, brawo. Sprawdź teraz (w dokumentacji biblioteki) czy istnieje funkcja, która umożliwia pokazanie na wyświetlaczu dowolnej kombinacji segmentów - to zapewni swobodę wyglądu symboli. Jeżeli nie, może jest choć taka której przekazujesz kod znaku (np. 8-bitowy ASCII lub 4-bitowy BCD). Nie wszystkie litery ASCII dadzą się pokazać, ale wiele można. Także w kodowaniu BCD masz aż 6 (kody 0xA-0xF) kodów niezajętych przez cyfry dziesiętne. Tam mogą być albo cyfry szesnastkowe (A, b, C, d, E, F) albo jakieś inne symbole.

Generalnie jest tak: jeśli piszesz kod od zera samodzielnie, panujesz nad całością i możesz zrobić wszystko. Jeśli korzystasz gotowej biblioteki, możesz z robić tylko to ona oferuje. Coś za coś.

Link do komentarza
Share on other sites

oto mój kod

#include <SevenSeg.h>

SevenSeg disp(11,7,3,5,6,10,2); //podłączenie segmentów A-F do pinów Arduino
const int numOfDigits=3; //liczba cyfr, które nasz wyświetlacz może wyświetlić
int digitPins[numOfDigits]={12,4,8}; //deklaracja pinów sterujących wyświetlaczem (anoda)



void setup(){

disp.setDigitPins(numOfDigits,digitPins);
disp.setTimer(2); //ustawienie Timera2
disp.startTimer(); //uruchomienie timera

}

void loop(){
      disp.write(random(999)); //wyświetl losowa liczbę
    delay(1000); //poczekaj 1000ms
  }

}

ISR(TIMER2_COMPA_vect){
 disp.interruptAction();
}

przerobiony kod ze strony http://akademia.nettigo.pl/

Link do komentarza
Share on other sites

Sprawdzałem ale nie bardzo co sie z czym je. Będę w domu podłączę układ i będę sprawdzać metodą prób i błędów. 😉

Może znasz jakąś inna bibliotekę łatwą w uzyciu ??

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.