Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Tablica wyników sportowych - pomysły, sugestie...

26 Wrz 2006 19:56 2852 9
  • Poziom 12  
    Proszę wszystkich znających się na rzeczy o podpowiedzi, sugestie, gotowe rozwiązania itp....
    W mojej szkole jest tablica wyników sportowych wykonana kilka lat temu przez uczniów na pracę dyplomową. I największym problemem jest to że obecnie jest zepsuta. Jest to rozwiązanie oparte w zupełności na układach cyfrowych bez mikroprocesora. Posiada zegar czasu rzeczywistego, licznik czasu spotkania (naprzemienne wyświetlanie RTC i licznika czasu na 4 wyświetlaczach 7-segmentowych + 2 kropki) oraz dwa liczniki punktów do 199. Wszystkie wyświetlacze są typu JUMBO, czyli kilka LEDek na segment. Całość sterowana z pilota RC5. W torze podczerwieni pracują układy SAA3049 i SAA3010. I układ będący odbiornikiem/dekoderem kodu RC5 uległ uszkodzeniu. Do tej tablicy nie ma żadnej dokumentacji, bo zaginęła. W sumie jest tam około 20 "cyfrowych scalaczków". Wyświetlacze posiadają dekodery BCD.
    Mam za zadanie sprawić, by tablica ożyła i znowu zaczęła pełnić swoją funkcję. Koszty nie grają roli. Dowiedziałem się jednak że układ który wymieniłem wyżej nie jest już produkowany, jest trudno dostępny i drogi, więc naprawa obecnego sterownika jest nieopłacalna.Podsumowując: Ze starej tablicy pozostają tylko zasilacz, wyświetlacze z dekoderami BCD i pilot zdalnego sterowania. Cały układ sterowania muszę wykonać od nowa, czyli RTC, licznik czasu, dwa liczniki punktów i komunikację poprzez RC5. Oczywiście najprostszym rozwiązaniem według mnie jest jakiś mikroprocesor, najlepiej AVR. Tylko że ja nie umiem programować. Znalazłem też opis licznika meczowego i zegaru meczowego w EdW 5/97 i 8/97. Czy coś takiego dało by się sterować za pomocą dodatkowego mikrokontrolera i pilota RC5?
    Dodam jeszcze że rozwiązanie na zwykłych licznikach chyba nie jest najlepsze, bo punkty mają być liczone w górę i w dół oraz ma być możliwość ustawiania zegara z pilota i przełączania RTC-licznik czasu.
    Wszystkich, którzy mają jakiś pomysł na sprzętowe rozwiązanie problemu proszę o pomoc. Mile widziany też schemat połączeń mikrokontrolera z wyświetlaczami. Ewentualnie jeśli ktoś pomógł by mi w napisaniu programu byłbym bardzo wdzięczny.
    Pozdrawiam i czekam na propozycje.
  • Poziom 12  
    Pomysł z tablicą za 2100zł to chyba nie najlepszy pomysł dla kolegi z forum. ;)
    Jak konstruujesz taki sterownik to musisz mieć na uwadze ile linii portów będziesz mieć zajęte. Każde urządzenie zewnętrzne to kolejny pin/port w zależności od tego jak podłączone i dodatkowo odbiornik IR (1 linia na przerwaniu). Dobrze było by gdybyś zrobił najpierw układ sterowany na kilku prymitywnych przełącznikach i zobaczył ile elementów tej tablicy tak na prawdę działa. Oprócz tego miałbyś już działający szkielet programu. Sterowanie z pilota zostawiłbym sobie na koniec. Co do programu to najłatwiej Bascom na AVR.. można szybko się nauczyć, widać efekty, ale nie jest zbyt ekonomiczny jeśli chodzi o zajmowane miejsce. :)
    Możesz spróbować np. na AT90S8515. Duży, ale jak będziesz multipleksowo włączał te (10 ?) cyferek x 7 segmentów to i klawiaturke podepniesz i z programem się zmieścisz. :)
    Poza tym możesz wypróbować połączenie z zatrzaskami na te 199 x2, bo one i tak są przełączane w momencie zmiany punktów a multipleksowanie zostawiasz na zegarek tylko. :)
    Daj znać co zdziałałeś.
  • Poziom 12  
    Sprawa ma się tak:
    Sterowanie zrobię na mikroprocesorze AVR, program w Bascomie. Odnośnie programu będe miał jeszcze dużo pytań, ale to później. Narazie zacząłem pisać program do wyświetlania czasu. Nie wiem jednak czy cały program zmieści się do jednego mikrokontrolera. Pozatym Bascom demo ma ograniczenie do 4kB kodu. Zastanawiam się czy licznik wyników sterować przez multipleksowanie czy za pomocą kodów BCD? W wyświetlaczach JUMBO są już dekodery kodu BCD z zatrzaskami, czyli procesor wysyłałby tylko dane wtedy gdzy zmienia się wynik. A podczas normalnej pracy dane były by w zatrzaskach. Czy dobrze rozumuję? I w jaki sposów wysyłć liczby w kodzie BCD z portów mikrokontrolera? Jeśli ktoś ma gotowy sposób na odbiertanie kodów RC5 z pilota to bardzo prosiłbym o podanie listingu lub pomoc.
    Z góry dziękuję za zainteresowanie.
  • Poziom 41  
    Witam
    Jeśli koszta nie grają roli to w pierwszej kolejności kup pełną wersję BASKOMa bo na pewno przekroczysz limit objętości programu. Kod BCD jest zwykłym kodem binarnym 4 bitowym gdzie dozwolone są wartości od 0 do 9.
  • Poziom 12  
    Koszta nie grają roli jeśli chodzi o elementy użyte do budowy sterownika. A przecież szkołe nie kupi dla mnie pełnej wersji Bascoma tylko po to żeby naprawić tą tablicę. Zastanawiam się też nad zastosowaniem dwóch mikroprocesorów - jeden obsługujący zegar czasu rzeczywistego i licznik czasu meczu, a drugi do obsługi licznika zdobytych punktów. Rozwiązanie może nie jest zbyt eleganckie ale w takim przypadku programy napewno zmieszczą się do pamięci.
  • Poziom 12  
    Z programem powinieneś sie zmieścić, ja w 2kb dosyć pokaźny program zmieściłem wraz z napisami wyświetlanymi na LCD. :) Zacznij pisać to zobaczysz, że nie jest aż tak źle. Jeśli masz już zatrzaski to tym lepiej, ale i tak nie podłączysz wszystkich na raz i będziesz musiał przełączać. Możliwe, że mają gdzieś nogę EN - enable, abo Select i w ten sposób możesz zezwolić na zmianę konkretnego stanu zatrzasku. Napisz co tam jest. jak na razie będzie użyte 4 nogi na BCD (wszystkie podłączone do tych samych 4 nóg) i najłatwiej po nodze na każdy zatrzask (cyfre) + przyciski - sterowanie jakieś. :)
  • Poziom 12  
    Zacząłem pisać licznik zdobytych punktów, a raczej pozmieniałem program znaleziony w internecie. Licznik działa poprawnie z dwoma przyciskami i jest ok.

    Listing programu licznika:

    Code:
    Dim Jednostki As Byte , Dziesiatki As Byte , Setki As Byte
    
    Dim Ktorywysw As Byte , S2a As Bit , S2b As Bit , S1a As Bit , S1b As Bit
    Config Portb = 255 : Portb = &B11111111       'wyjścia wygaszone
    Config Portd = &B1111100 : Portd = &B1111111       'dwie wejścia
    Setki = 0 : Dziesiatki = 0 : Jednostki = 0       'zerujemy
    S2a = 0 : S2b = 0 : S1a = 0 : S1b = 0       'na wszelki wypadek
    Do                       'pętla główna
    Waitms 5                 'opóźnienie o 5ms
    Incr Ktorywysw           'następny wyświetlacz co około 5ms
    If Ktorywysw = 3 Then    'co około 20ms
       Ktorywysw = 0         'skróć cykl
       If Pind.1 = 0 Then    'jeśli przyciśnięty S2
          S2a = 1            'ustaw bit pomocniczy
          If S2a = 1 And S2b = 0 Then       'jeśli po 20ms nadal wciśnięty
             Gosub Zwieksz   'zwiększ licznik
             S2b = 1         'zablokuj dalsze zmiany do czasu zwolnienia S2
          End If
       Else                  'po zwolnieniu S2
          S2a = 0 : S2b = 0  'zeruj oba bity pomocnicze
       End If
       If Pind.0 = 0 Then    'jeśli przyciśnięty S1
          S1a = 1            'ustaw bit pomocniczy
          If S1a = 1 And S1b = 0 Then       'jeśli po 20ms nadal wciśnięty
             Gosub Zmniejsz  'zmniejsz licznik
             S1b = 1         'zablokuj dalsze zmiany do czasu zwolnienia S1
          End If
       Else                  'po zwolnieniu S1
          S1a = 0 : S1b = 0  'zeruj oba bity pomocnicze
       End If
    End If
    Portd = &B1111111        'najpierw gasimy  wyświetlacze
    Select Case Ktorywysw
    Case 0:                  'wyświetl zawartość licznika jednostek
       Portb = Lookup(jednostki , Tabela1)       'najpierw przepisz do PortB kody
       Portd.3 = 0           'potem włącz T3 - wyświetlacz jednostek
    Case 1:                  'wyświetl zawartość licznika dziesiątek
       If Setki = 0 Then
       Portb = Lookup(dziesiatki , Tabela)       'najpierw przepisz do PortB kody
       Else
       Portb = Lookup(dziesiatki , Tabela1)       'najpierw przepisz do PortB kody
       End If
       Portd.4 = 0           'potem włącz T4 - wyświetlacz dziesiątek
    Case 2:                  'wyświetl zawartość licznika setek
       Portb = Lookup(setki , Tabela)       'przepisz do PortB kody
       Portd.5 = 0           'włącz T5 - wyświetlacz setek
    End Select
    Loop                     'koniec pętli
    End                      'koniec programu głównego

    Zwieksz:
    Incr Jednostki
    If Jednostki = 10 Then
       Jednostki = 0
        Incr Dziesiatki
       If Dziesiatki = 10 Then
          Dziesiatki = 0
          Incr Setki
             If Setki = 2 Then
                Setki = 0

               End If
                End If
    End If
    Return

    Zmniejsz:
    Decr Jednostki
    If Jednostki = 255 Then
       Jednostki = 9
       Decr Dziesiatki
       If Dziesiatki = 255 Then
          Dziesiatki = 9
          Decr Setki
             If Setki = 255 Then
                Setki = 1
                        End If

       End If
    End If
    Return

    Tabela1:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
    Tabela:
    Data 255 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144



    Następnie znalazłem program do obsługi pilotów RC5 i również go pozmieniałem. Kody wyświetlane są na wyświetlaczu LCD. I ten program również działa poprawnie.

    Listing programu do obsługi pilota:

    Code:
    Config Int0 = Low Level  'konfigurowanie przerwania Int0,
    
           'które będzie wywoływane niskim
           'poziomem na wejściu INT0
    Config Rc5 = Pind.2      'konfiguracja linii, do której
           'dołączono odbiornik
           'podczerwieni
    On Int0 Pobr_rc5         'po wystąpieniu przerwania Int0
           'nastąpi skok do podprogramu
           'Pobr_rc5
    Dim Address As Byte , Command As Byte
           'definicje zmiennych dla
           'instrukcji Getrc5
    Dim Odebr_kod As Bit     'flaga wskazująca na odebranie
           'kodu danych w kodzie RC5
    Enable Interrupts        'odblokowanie przerwań
           'globalnych
    Enable Int0              'odblokowanie przerwania Int0

    Set Odebr_kod            'ustawienie flagi Odebr_kod

    Do                       'początek nieskończonej pętli
     If Odebr_kod = 1 Then   'jeśli odebrano kod RC5, to
      Cls                    'czyszczenie LCD
      Lcd "Adres: " ; Address       'wyświetlenie w pierwszej linii
           'LCD otrzymanego adresu po
           'napisie Adres:
      Lowerline              'kursor do drugiej linii LCD
      Lcd "Komenda:" ; Command       'wyświetlenie w drugiej linii
           'LCD otrzymanego numeru komendy
           'po napisie Komenda:
      Reset Odebr_kod        'wyzerowanie flagi Odebr_kod
      Enable Int0            'odblokowanie przerwania Int0
     End If
    Loop
    End                      'koniec programu

    Pobr_rc5:                'podprogram przerwania Int0
     Disable Int0            'zablokowanie przerwania Int0
     Enable Interrupts       'odblokowanie przerwań
           'globalnych
     Getrc5(address , Command)       'pobranie adresu oraz komendy
           'nadanej z pilota podczerwieni
     Command = Command And &B01111111       'wyzerowanie najbardziej
           'znaczącego bitu otrzymanej
           'komendy
     Set Odebr_kod           'ustawienie flagi odebrania kodu
           'RC5
    Return                   'powrót z przerwania


    I ja teraz chcę aby mój licznik liczył po odebraniu komendy z pilota a nie po naciśnięciu przycisku. i do tego żeby reagował na konkretny kod pilota. Za pomocą powyższego programu z obsługą LCD zczytałem kody z pilota. Do zwiększania licznika chcę użyć kodu o adresie "1" i komendzie "6" , a do zmniejszania kodu o adresie "1" i komendzie "32". Teoretycznie wim jak to zrobić ale gorzej z praktyką. Po połączeniu tych dwóch programów licznik nie zlicza.

    Bardzo proszę osoby, które znają się na rzeczy, aby połączyły dla mnie te dwa powyższe listingi. Z tym że teraz wyświetlacz LCD jest już zbędny. Chodzi tylko o to żeby licznik liczył po odebraniu właściwej komendy z pilota.

    Dodano po 11 [minuty]:

    Dodam jeszcze że te programy uruchamiam na płytce testowej AVT3500 na Attiny2313. Prosiłbym też moderatora o przeniesienie tematu do działu programowanie. Może tam więcej osób będzie w stanie mi pomóc.
  • Poziom 12  
    Już sobie poradziłem ze scaleniem tych dwóch programów. Listing zamieszczam poniżej. A może ktoś ma lepszy sposób niż ten który ja zastosowałem? Czy nie ma w tym programie jakiegoś błędu niezauważonego przeze mnie i przez kompilator? Program działa poprawnie na AVT-3500 z podpiętym odbiornikiem podczerwieni. Dodatkowo doszedłem do wniosku że cała tablica będzie sterowana dwoma mikroprocesorami. Jeden będzie obsługiwał liczniki a drugi zegar i licznik czasu. Na moim obecnym poziomie wiedzy dotyczącym programowania nie poradzę sobie z obsługą tego wszystkiego za pomocą tylko jednego mikroprocesora. Napewno będe miał jeszcze dużo pytań odnośnie programowania w Bascomie i liczę na pomoc Elektrodowiczów.

    Code:
    Dim Jednostki As Byte , Dziesiatki As Byte , Setki As Byte
    
    Dim Ktorywysw As Byte , Ktorakomenda As Byte
    Config Portb = 255 : Portb = &B11111111       'wyj�cia wygaszone
    Config Portd = &B1111011 : Portd = &B1110111       'dwie wej�cia
    Setki = 0 : Dziesiatki = 4 : Jednostki = 0       'zerujemy
    Config Int0 = Low Level  'konfigurowanie przerwania Int0,
           'które będzie wywoływane niskim
           'poziomem na wej�ciu INT0
    Config Rc5 = Pind.2      'konfiguracja linii, do której
           'dołšczono odbiornik
           'podczerwieni
    On Int0 Pobr_rc5         'po wystšpieniu przerwania Int0
           'nastšpi skok do podprogramu
           'Pobr_rc5
    Dim Address As Byte , Command As Byte
           'definicje zmiennych dla
           'instrukcji Getrc5
    Dim Odebr_kod As Bit     'flaga wskazujšca na odebranie
           'kodu danych w kodzie RC5
    Enable Interrupts        'odblokowanie przerwań
           'globalnych
    Enable Int0              'odblokowanie przerwania Int0
    Set Odebr_kod            'ustawienie flagi Odebr_kod
    Do                       'pętla główna
     Ktorakomenda = 0
      If Odebr_kod = 1 Then
      Ktorakomenda = Command
    Select Case Ktorakomenda
    Case 6:
       Gosub Zwieksz
       Reset Odebr_kod       'wyzerowanie flagi Odebr_kod
       Enable Int0           'odblokowanie przerwania Int0
    Case 32:
       Gosub Zmniejsz
       Reset Odebr_kod       'wyzerowanie flagi Odebr_kod
       Enable Int0           'odblokowanie przerwania Int0
    Case 19:
       Gosub Zeruj
       Reset Odebr_kod       'wyzerowanie flagi Odebr_kod
       Enable Int0           'odblokowanie przerwania Int0
    End Select
       Reset Odebr_kod       'wyzerowanie flagi Odebr_kod
       Enable Int0           'odblokowanie przerwania Int0
       End If
    Waitms 1                 'opó�nienie o 1ms
    Incr Ktorywysw           'następny wy�wietlacz co około 1ms
    If Ktorywysw = 3 Then    'co około 3ms
       Ktorywysw = 0         'skróć cykl
    End If
    Portd = &B1111111        'najpierw gasimy  wy�wietlacze
    Select Case Ktorywysw
    Case 0:                  'wy�wietl zawarto�ć licznika jednostek
       Portb = Lookup(jednostki , Tabela1)       'najpierw przepisz do PortB kody
       Portd.3 = 0           'potem włšcz T3 - wy�wietlacz jednostek
    Case 1:                  'wy�wietl zawarto�ć licznika dziesištek
       If Setki = 0 Then
       Portb = Lookup(dziesiatki , Tabela)       'najpierw przepisz do PortB kody
       Else
       Portb = Lookup(dziesiatki , Tabela1)       'najpierw przepisz do PortB kody
       End If
       Portd.4 = 0           'potem włšcz T4 - wy�wietlacz dziesištek
    Case 2:                  'wy�wietl zawarto�ć licznika setek
       Portb = Lookup(setki , Tabela)       'przepisz do PortB kody
       Portd.5 = 0           'włšcz T5 - wy�wietlacz setek
    End Select
    Loop                     'koniec pętli
    End                      'koniec programu głównego
    Zwieksz:
    Incr Jednostki
    If Jednostki = 10 Then
       Jednostki = 0
        Incr Dziesiatki
       If Dziesiatki = 10 Then
          Dziesiatki = 0
          Incr Setki
             If Setki = 2 Then
                Setki = 0
               End If
                End If
    End If
    Return
    Zmniejsz:
    If Jednostki > 0 Or Dziesiatki > 0 Or Setki > 0 Then
    Decr Jednostki
    End If
    If Jednostki = 255 Then
       Jednostki = 9
       Decr Dziesiatki
       If Dziesiatki = 255 Then
          Dziesiatki = 9
          Decr Setki
             If Setki = 255 Then
                Setki = 1
                        End If
       End If
    End If
    Return
    Zeruj:
       Jednostki = 0
       Dziesiatki = 0
       Setki = 0
    Return
    Tabela1:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
    Tabela:
    Data 255 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
    Pobr_rc5:                'podprogram przerwania Int0
     Disable Int0            'zablokowanie przerwania Int0
     Enable Interrupts       'odblokowanie przerwań
           'globalnych
     Getrc5(address , Command)       'pobranie adresu oraz komendy
           'nadanej z pilota podczerwieni
     Command = Command And &B01111111       'wyzerowanie najbardziej
           'znaczšcego bitu otrzymanej
           'komendy
      Set Odebr_kod          'ustawienie flagi odebrania kodu
           'RC5
            Return           'powrót z przerwania
  • Poziom 2  
    Witam
    szukam osoby która zrobi mi tablice 24sek - proszę o szybką odpowiedz
    nr tel. 608887284