Tablica informacyjna -3x3 wyświetlacze 7segm.


Witam, potrzebuję stworzyć tablicę wyświetlającą wpisane trzy wartości trzycyfrowe, wpisywanie powinno odbywać się z pilota rc5. Ma to być coś w rodzaju tablicy z kantoru takiej z kursami walut, ale tylko trzy pozycje.
Narysowałem schemat blokowy i zastanawiam się w jaki sposób podłączyć wyświetlacze, czy wszystkie segmenty do CD4543 i z portów uP sterować anody czy ma ktoś inny pomysł na rozwiązanie.
Sterowanie myślę zrobić z pilota na zasadzie :
naciskam MENU -mruga(lub gaśnie) pierwszy wyświetlacz
wpisujemy numerycznie np.123
naciskam ponownie MENU-przechodzę do drugiego wyświetlacza
wpisujemy np.234
po wpisaniu trzeciego wyniku naciskamy kolejny raz menu i następuje zapis i wyjście.
Jaki zastosować procesor ?
Jak już będę wiedział co i jak połączyć wtedy wrzucę schemat i zabiorę się za program.

może coś takiego, w razie zastosowania większych wyświetlaczy zawsze można dołożyć ULN2003, PH w CD4543 podciągnąć do GND i bez zmiany kodu wszystko działa dalej.




Portret użytkownika EDC

Odp. Tablica informacyjna

Można męczyć procesor multipleksowaniem, ale jak czytam to dane będą dość statyczne bo wprowadzasz je rzadko pilotem.
Gdyby wyświetlaczy było tylko osiem to polecałbym układ który sam rozwiązuje sprawę multipleksowania MAX7219.
Wysyłasz mu dane dla tych ośmiu wyświetlaczy raz kiedy chcesz coś zmienić i potem on się sam zajmuje resztą.

Kiedy jednak wyświetlaczy jest 9 to dałbym pod kazdy jakiś tani rejestr przesuwny. Już robiłeś kiedyś projekt na tych matrycach LED. Dziewięć tanich rejestrów i wysyłasz dziewięć bajtów trzema przewodami. Wtedy taki projekt to nawet Tiny13 uciągnie :D

Wszystko zależy co chcesz osiągnać.
Mógłbyś pomyśleć o tym by ten moduł wyświetlaczy był uniwersalny czyli własnie z własnymi driverami.
Te 74HC595 to już trochę leciwe, ale proste.
Przyznam się że dostałem całą rolkę 74HC164 i je używam bo mam, ale sa też takie drivery ktore automatycznie regulują prąd diod i nie ma potrzeby montowania rezystorów go ograniczających.

Tak więc chciałbym podsumować. Mamy rok 2016 i już nie wszystko musi być robione partyzancko :D
Ceny części zmalały i warto używać specjalizowane układy.

Dla 9 wyświetlaczy pod kazdym dałbyś po jednym rejestrze przesuwnym za złotówkę i masz tylko 9 bajtów do wysłania trzema przewodami...

Prawdopodobnie są drivery 7segment LED o większej ilości obsługiwanych cyfr. Trzeba tylko poszukać.

-

BARTek
Moja strona

Portret użytkownika marekszy

Tablica informacyjna

Chyba zostanę przy swoim,obawmiam się że będę miał więcej problemów z ogarnięciem rejestrów niż z multpleksowaniem anod wyświetlaczy,a procesor i tak nie ma wiele do roboty ,także będzie miał się czym zająć .Układ nie musi być uniwersalny ,ma tylko to jedno przeznaczenie.Muszę to tylko złożyć (no niestety na styk?wce nie da rady) i wtedy powalczę z programem.

Portret użytkownika EDC

Odp. Tablica informacyjna

Okay. Pamiętaj że RC5 wykorzystuje Timer0
Jeśli przyjąć że na jeden wyświetlacz przyda się odświeżanie conajmniej 50Hz to przy dziewięciu sprawa dojdzie do 450-500Hz (przerwanie co taki period)
W razie czego mogę Ci na email wysłać kilka projektów z ośmioma multipleksowanymi wyświetlaczami :D

-

BARTek
Moja strona

Portret użytkownika marekszy

Tablica informacyjna

Super, to ja bym poprosił, będzie możliwość popatrzeć jak to powinno wyglądać fachowo.
Trochę mi zejdzie zanim zmontuję płytkę do testów ale już będę miał zarys w jaki sposób to ogarnąć.

Portret użytkownika marekszy

tablica informacyjna

witam, wstawiam już finalny schemat oraz wstępny program ,wyświetlanie działa prawidłowo ,mam na razie problem z dodaniem RC5 (wszystko zaczyna mrugać),ale pokombinuję chyba że macie jakiś gotowy pomysł.

'tablica inform.3 x 3 wyswietlacze LED
'2016-11-04
'A1-1 Pb.3 ,A1-2 Pb.4 ,A1-3 Pb.5 ,A2-1 Pb.0 ,A2-2 Pb.1 ,A2-3 Pb.2 ,A3-1 Pd.5 ,A3-2 Pd.6 ,A3-3 Pd.7
'buzer - Pd.1 ,RC5 - Pd.2 ,dp.-Pc.4
'CD4543 A-Pc.0 ,B-Pc.2 ,C-Pc.3 ,D-Pc.1
'wolne pin-y Pd.0 ,Pd.1 ,Pd.3 ,Pd.4
'wyswietlanie trzycyfrowych liczb dziala
$regfile = "m8def.dat."
$crystal = 16000000
'$hwstack = 64
'$swstack = 64
'$framesize = 64
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portc = &B11111111 : Portc = &B11111111
Config Portd = &B11111011 : Portd = &B11111111
 
Config Timer1 = Timer , Prescale = 64
Enable Timer1 : On Timer1 Prztimer1
 
Config Rc5 = Pind.2
 
Enable Interrupts
 
 
 
 
'********************************deklarcje podprogramów********************************
 
 
 
Declare Sub Kody_cyfr
 
 
'********************************przypisanie aliasow***********************************
 
 
 
A1_1 Alias Portb.3
A1_2 Alias Portb.4
A1_3 Alias Portb.5
A2_1 Alias Portb.0
A2_2 Alias Portb.1
A2_3 Alias Portb.2
A3_1 Alias Portd.5
A3_2 Alias Portd.6
A3_3 Alias Portd.7
kropka Alias portc.4
Buzer Alias portd.1
 
 
 
'**************************************Zmienne****************************************
 
Dim flaga_2ms as bit , Flaga_4ms As Bit , Flaga_100ms As Bit , Flaga_1s As Bit
Dim Dzielnik As Byte , dzielnik_1 as byte , Dzielnik2 As Byte
dim liczba_1 as Byte,liczba_2 as Byte,liczba_3 as Byte,liczba_4 as Byte,liczba_5 as Byte
dim liczba_6 as Byte,liczba_7 as Byte,liczba_8 as Byte,liczba_9 as Byte
Dim Mux As Byte
Dim liczba_x As Word , Liczba As byte
 
Dim S_1 As word , D_1 As word , J_1 As word , X_1 As word ,Y_1 As Word
Dim S_2 As word , D_2 As word , J_2 As word , X_2 As word ,Y_2 As Word
Dim S_3 As word , D_3 As word , J_3 As word , X_3 As word ,Y_3 As Word
 
dim liczba_01 as Word , liczba_02 as Word , liczba_03 as Word
Dim Komenda As Byte , Adres As Byte
 
 
'***************************************************************************************
 
Liczba_01 = 042
liczba_02 = 089
liczba_03 = 725
 
liczba_1 = 1
liczba_2 = 2
liczba_3 = 3
liczba_4 = 4
liczba_5 = 5
liczba_6 = 6
liczba_7 = 7
liczba_8 = 8
liczba_9 = 9
 
 
'*****************************petla glowna************************************
Do
 
 
  If Flaga_2ms = 1 Then       'co 2ms
     Flaga_2ms = 0
     Gosub Wyswietlanie
     gosub przelicz
 
  End If
 
   if flaga_4ms = 1 then      'co 4ms
      flaga_4ms = 0
 
   end if
 
   If Flaga_100ms = 1 Then    ' co 100ms
      Flaga_100ms = 0
 
   End If
 
   If Flaga_1s = 1 Then       'co 1s
       Flaga_1s = 0
 
   End If
 Loop
End
'****************************petla glowna koniec******************************
 
'******************************przerwanie timer1******************************
Prztimer1:
 Timer1 = 65036
 flaga_2ms = 1                '2ms
 incr dzielnik
 if dzielnik = 2 then         '2*2ms = 4ms
   dzielnik = 0
   Flaga_4ms = 1
  Incr Dzielnik_1
  If Dzielnik_1 = 25 Then     '25*4ms = 100ms
   Dzielnik_1 = 0
   Flaga_100ms = 1
    Incr Dzielnik2
    If Dzielnik2 = 10 Then    '10*100ms=1s'
     Dzielnik2 = 0
     Flaga_1s = 1
    End If
  end if
 End If
Return
 
'******************************************************************************
 
 
 
 
'******************************************************************************
Przelicz:                     'stosujemy tylko gdy uzywamy liczb trzycyfrowych
                              'dzieli liczbe trzycyfrowa na pojedyncze cyfry
S_1 = Liczba_01 / 100
D_1 = Liczba_01 / 10          'liczba pierwsza (Liczba_01)
X_1 = S_1 * 10                'S_1 setki liczby pierwszej
D_1 = D_1 - X_1               'D_1 dziesiatki liczby pierwszej
Y_1 = X_1 + D_1               'J_1 jednosci liczby pierwszej
Y_1 = Y_1 * 10
J_1 = Liczba_01 - Y_1
 
S_2 = Liczba_02 / 100         'liczba druga (Liczba_02)
D_2 = Liczba_02 / 10
X_2 = S_2 * 10
D_2 = D_2 - X_2
Y_2 = X_2 + D_2
Y_2 = Y_2 * 10
J_2 = Liczba_02 - Y_2
 
S_3 = Liczba_03 / 100         'liczba trzecia (Liczba_03)
D_3 = Liczba_03 / 10
X_3 = S_3 * 10
D_3 = D_3 - X_3
Y_3 = X_3 + D_3
Y_3 = Y_3 * 10
J_3 = Liczba_03 - Y_3
 
Return
'*******************************obsluga wyswietlaczy*****************************
Wyswietlanie:
 
 
Incr Mux
  If Mux = 9 Then Mux = 0
  Select Case Mux
    Case 0:
      Set A3_3
      liczba = s_1            'gdy uzywamy pojedynczych cyfr "liczba = liczba_1"
       Gosub Kody_cyfr
      Reset A1_1              'zal.wyswietlacza A1_1
    Case 1:
      set A1_1
     liczba = d_1
      Gosub Kody_cyfr
      Reset A1_2              'zal.wyswietlacza A1_2
    Case 2:
      Set A1_2
       liczba = j_1
       Gosub Kody_cyfr
      Reset A1_3              'zal.wyswietlacza A1_3
    Case 3:
      Set A1_3
      Liczba = s_2
       Gosub Kody_cyfr
      Reset A2_1              'zal.wyswietlacza A2_1
    Case 4:
      Set A2_1
      Liczba = d_2
       Gosub Kody_cyfr
      Reset A2_2              'zal.wyswietlacza A2_2
    Case 5:
      Set A2_2
      Liczba = j_2
       Gosub Kody_cyfr
      Reset A2_3              'zal.wyswietlacza A2_3
    Case 6:
      Set A2_3
      Liczba = s_3
       Gosub Kody_cyfr
      Reset A3_1              'zal.wyswietlacza A3_1
    Case 7:
      Set A3_1
      Liczba = d_3
       Gosub Kody_cyfr
      Reset A3_2              'zal.wyswietlacza A3_2
    Case 8:
      Set A3_2
      Liczba = j_3
       Gosub Kody_cyfr
      Reset A3_3              'zal.wyswietlacza A3_3
 
   End Select
Return
'************************podprogram generujący kod BCD dla cyfr****************************
Kody_cyfr:
 
 Select Case Liczba           'początek instrukcji
 
  Case 0:                     ' kod BCD dla 0
   Portc.1 = 0
   Portc.3 = 0
   Portc.2 = 0
   Portc.0 = 0
 
  Case 1:                     ' kod BCD dla 1
   Portc.1 = 0
   Portc.3 = 0
   Portc.2 = 0
   Portc.0 = 1
 
  Case 2:                     ' kod BCD dla 2
   Portc.1 = 0
   Portc.3 = 0
   Portc.2 = 1
   Portc.0 = 0
 
  Case 3:                     ' kod BCD dla 3
   Portc.1 = 0
   Portc.3 = 0
   Portc.2 = 1
   Portc.0 = 1
 
  Case 4:                     ' kod BCD dla 4
   Portc.1 = 0
   Portc.3 = 1
   Portc.2 = 0
   Portc.0 = 0
 
  Case 5:                     ' kod BCD dla 5
   Portc.1 = 0
   Portc.3 = 1
   Portc.2 = 0
   Portc.0 = 1
 
  Case 6:                     ' kod BCD dla 6
   Portc.1 = 0
   Portc.3 = 1
   Portc.2 = 1
   Portc.0 = 0
 
  Case 7:                     ' kod BCD dla 7
   Portc.1 = 0
   Portc.3 = 1
   Portc.2 = 1
   Portc.0 = 1
 
  Case 8:                     ' kod BCD dla 8
   Portc.1 = 1
   Portc.3 = 0
   Portc.2 = 0
   Portc.0 = 0
 
  Case 9:                     ' kod BCD dla 9
   Portc.1 = 1
   Portc.3 = 0
   Portc.2 = 0
   Portc.0 = 1
 
 End Select                    'koniec instrukcji
Return                         'powrót

Całość RC5 ma działać na zasadzie ,że wciskamy w pilocie np. MENU i ustawiamy przyciskami numerycznymi Liczba_01 (trzycyfrowa),następnie MENU Liczba_02 , MENU Liczba_03 i wyjście z zapisem.
I teraz pytanie - czy to się tak da za pomocą pilota.

Portret użytkownika matrix

Re: tablica informacyjna

Zrób osobny podprogram gdzie po naciśnięciu pilota wejdziesz, zapętlisz i nie wyjdziesz póki nie skończysz wprowadzać danych.

Portret użytkownika marekszy

Re: tablica informacyjna

Tak też zamierzam to zrobić ale na razie próbuję dodać prawidłowo odbieranie RC5.Coś mi wiesza wyświetlacze po naciśnięciu pilota.

Portret użytkownika matrix

Re: tablica informacyjna

No dobra, tylko ja u Ciebie nie widzę miejsca gdzie występuje procedura

GETRC5

Portret użytkownika marekszy

tablica informacyjna

Właśnie to ćwiczę, ale coś słabo mi to hula. Muszę jeszcze zbudować na szybko czytnik do RC5 bo nie mam pewności co nadaje mi pilot.
Jutro wrzucę co mam.

Portret użytkownika marekszy

tablica informacyjna

To jest kod z obsługą RC5,przy nadawaniu pilotem wyświetlacze mrugają ,także coś tam odbiera jednak nic się nie wykonuje

'TEST RC5 V2
$regfile = "m8def.dat."
$crystal = 16000000
'$hwstack = 64
'$swstack = 64
'$framesize = 64
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portc = &B11111111 : Portc = &B11111111
Config Portd = &B11111011 : Portd = &B11111111
 
Config Timer1 = Timer , Prescale = 64
Enable Timer1 : On Timer1 Prztimer1
 
Config Rc5 = Pind.2                                                      ' , wait = 2000
Config Int0 = Low Level                                                  'reaguje na zbocze narastajace
On Int0 Pobr_rc5
Enable Int0
 
 
Enable Interrupts
 
 
 
 
'********************************deklarcje podprogramów********************************
 
 
 
Declare Sub Kody_cyfr
 
 
'********************************przypisanie aliasow***********************************
 
 
 
A1_1 Alias Portb.3
A1_2 Alias Portb.4
A1_3 Alias Portb.5
A2_1 Alias Portb.0
A2_2 Alias Portb.1
A2_3 Alias Portb.2
A3_1 Alias Portd.5
A3_2 Alias Portd.6
A3_3 Alias Portd.7
kropka Alias portc.4
Buzer Alias portd.1
 
 
 
'**************************************Zmienne****************************************
 
Dim flaga_2ms as bit , Flaga_4ms As Bit , Flaga_100ms As Bit , Flaga_1s As Bit
Dim Dzielnik As Byte , dzielnik_1 as byte , Dzielnik2 As Byte
dim liczba_1 as Byte,liczba_2 as Byte,liczba_3 as Byte,liczba_4 as Byte,liczba_5 as Byte
dim liczba_6 as Byte,liczba_7 as Byte,liczba_8 as Byte,liczba_9 as Byte
Dim Mux As Byte
Dim liczba_x As Word , Liczba As byte
 
Dim S_1 As word , D_1 As word , J_1 As word , X_1 As word ,Y_1 As Word
Dim S_2 As word , D_2 As word , J_2 As word , X_2 As word ,Y_2 As Word
Dim S_3 As word , D_3 As word , J_3 As word , X_3 As word ,Y_3 As Word
 
dim liczba_01 as Word , liczba_02 as Word , liczba_03 as Word
 
dim address as byte, command as Byte
dim odebr_kod as bit
 
 
 
'***************************************************************************************
 
Liczba_01 = 042
liczba_02 = 089
liczba_03 = 725
 
liczba_1 = 1
liczba_2 = 2
liczba_3 = 3
liczba_4 = 4
liczba_5 = 5
liczba_6 = 6
liczba_7 = 7
liczba_8 = 8
liczba_9 = 9
 
 
'*****************************petla glowna************************************
Do
 
 
 
  if address = 0 then
       if command = 16 then '16 vol+
         toggle kropka
       end if
 
       if command = 17 then '17 vol-
         toggle buzer
       end if
  end if
enable Int0
 
 
 
 
 
 
  If Flaga_2ms = 1 Then       'co 2ms
     Flaga_2ms = 0
     Gosub Wyswietlanie
     gosub przelicz
     'gosub wyk_RC5
  End If
 
   if flaga_4ms = 1 then      'co 4ms
      flaga_4ms = 0
 
   end if
 
   If Flaga_100ms = 1 Then    ' co 100ms
      Flaga_100ms = 0
 
   End If
 
   If Flaga_1s = 1 Then       'co 1s
       Flaga_1s = 0
 
   End If
 Loop
End
'****************************petla glowna koniec******************************
 
'******************************przerwanie timer1******************************
Prztimer1:
 Timer1 = 65036
 flaga_2ms = 1                '2ms
 incr dzielnik
 if dzielnik = 2 then         '2*2ms = 4ms
   dzielnik = 0
   Flaga_4ms = 1
  Incr Dzielnik_1
  If Dzielnik_1 = 25 Then     '25*4ms = 100ms
   Dzielnik_1 = 0
   Flaga_100ms = 1
    Incr Dzielnik2
    If Dzielnik2 = 10 Then    '10*100ms=1s'
     Dzielnik2 = 0
     Flaga_1s = 1
    End If
  end if
 End If
Return
 
'******************************************************************************
 
Pobr_rc5:
 disable Int0
  enable interrupts
 
Getrc5(Address , Command)
Command = Command and &B01111111         'zerowanie bitu 5
Return
 
wyk_rc5:
 
 
 
'******************************************************************************
Przelicz:                     'stosujemy tylko gdy uzywamy liczb trzycyfrowych
                              'dzieli liczbe trzycyfrowa na pojedyncze cyfry
S_1 = Liczba_01 / 100
D_1 = Liczba_01 / 10          'liczba pierwsza (Liczba_01)
X_1 = S_1 * 10                'S_1 setki liczby pierwszej
D_1 = D_1 - X_1               'D_1 dziesiatki liczby pierwszej
Y_1 = X_1 + D_1               'J_1 jednosci liczby pierwszej
Y_1 = Y_1 * 10
J_1 = Liczba_01 - Y_1
 
S_2 = Liczba_02 / 100         'liczba druga (Liczba_02)
D_2 = Liczba_02 / 10
X_2 = S_2 * 10
D_2 = D_2 - X_2
Y_2 = X_2 + D_2
Y_2 = Y_2 * 10
J_2 = Liczba_02 - Y_2
 
S_3 = Liczba_03 / 100         'liczba trzecia (Liczba_03)
D_3 = Liczba_03 / 10
X_3 = S_3 * 10
D_3 = D_3 - X_3
Y_3 = X_3 + D_3
Y_3 = Y_3 * 10
J_3 = Liczba_03 - Y_3
 
Return
'*******************************obsluga wyswietlaczy*****************************
Wyswietlanie:
 
 
Incr Mux
  If Mux = 9 Then Mux = 0
  Select Case Mux
    Case 0:
      Set A3_3
      liczba = s_1            'gdy uzywamy pojedynczych cyfr "liczba = liczba_1"
       Gosub Kody_cyfr
      Reset A1_1              'zal.wyswietlacza A1_1
    Case 1:
      set A1_1
     liczba = d_1
      Gosub Kody_cyfr
      Reset A1_2              'zal.wyswietlacza A1_2
    Case 2:
      Set A1_2
       liczba = j_1
       Gosub Kody_cyfr
      Reset A1_3              'zal.wyswietlacza A1_3
    Case 3:
      Set A1_3
      Liczba = s_2
       Gosub Kody_cyfr
      Reset A2_1              'zal.wyswietlacza A2_1
    Case 4:
      Set A2_1
      Liczba = d_2
       Gosub Kody_cyfr
      Reset A2_2              'zal.wyswietlacza A2_2
    Case 5:
      Set A2_2
      Liczba = j_2
       Gosub Kody_cyfr
      Reset A2_3              'zal.wyswietlacza A2_3
    Case 6:
      Set A2_3
      Liczba = s_3
       Gosub Kody_cyfr
      Reset A3_1              'zal.wyswietlacza A3_1
    Case 7:
      Set A3_1
      Liczba = d_3
       Gosub Kody_cyfr
      Reset A3_2              'zal.wyswietlacza A3_2
    Case 8:
      Set A3_2
      Liczba = j_3
       Gosub Kody_cyfr
      Reset A3_3              'zal.wyswietlacza A3_3
 
   End Select
Return
'************************podprogram generujący kod BCD dla cyfr****************************
Kody_cyfr:
 
 Select Case Liczba           'początek instrukcji
 
  Case 0:                     ' kod BCD dla 0
   Portc.1 = 0
   Portc.3 = 0
   Portc.2 = 0
   Portc.0 = 0
 
  Case 1:                     ' kod BCD dla 1
   Portc.1 = 0
   Portc.3 = 0
   Portc.2 = 0
   Portc.0 = 1
 
  Case 2:                     ' kod BCD dla 2
   Portc.1 = 0
   Portc.3 = 0
   Portc.2 = 1
   Portc.0 = 0
 
  Case 3:                     ' kod BCD dla 3
   Portc.1 = 0
   Portc.3 = 0
   Portc.2 = 1
   Portc.0 = 1
 
  Case 4:                     ' kod BCD dla 4
   Portc.1 = 0
   Portc.3 = 1
   Portc.2 = 0
   Portc.0 = 0
 
  Case 5:                     ' kod BCD dla 5
   Portc.1 = 0
   Portc.3 = 1
   Portc.2 = 0
   Portc.0 = 1
 
  Case 6:                     ' kod BCD dla 6
   Portc.1 = 0
   Portc.3 = 1
   Portc.2 = 1
   Portc.0 = 0
 
  Case 7:                     ' kod BCD dla 7
   Portc.1 = 0
   Portc.3 = 1
   Portc.2 = 1
   Portc.0 = 1
 
  Case 8:                     ' kod BCD dla 8
   Portc.1 = 1
   Portc.3 = 0
   Portc.2 = 0
   Portc.0 = 0
 
  Case 9:                     ' kod BCD dla 9
   Portc.1 = 1
   Portc.3 = 0
   Portc.2 = 0
   Portc.0 = 1
 
 End Select                    'koniec instrukcji
Return                         'powrót

Portret użytkownika EDC

Odp. Tablica informacyjna

Proszę.
Wpisywanie inicjuje się naciskając Vol+ lub Vol- Wtedy pierwszy wyświetlacz gaśnie.
Kiedy wpiszesz trzy cyfry to zgaśnie następny ;)
Można by tu jeszcze kilka rzeczy poprawić, ale nie wiem co Ci się przyda a co nie.
Niemniej IR działa bezbłędnie ;)

Życzę udanego wieczoru

$regfile = "m8def.dat."
$crystal = 16000000
$hwstack = 64
$swstack = 16
$framesize = 64
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portc = &B00111111 : Portc = &B11111111
Config Portd = &B11111011 : Portd = &B11111111
 
 
Config Timer2 = Timer , Prescale = 256 , Compare = Disconnect , Clear Timer = 1
Enable Compare2 : On Compare2 Timer2_isr : Compare2 = 137   '450Hz @16MHz/256
 
Config Rc5 = Pind.2 , Wait = 2000
 Dim Address As Byte , Command As Byte , Odbierz As Byte
 
Config Int0 = Falling
 Enable Int0 : On Int0 Int0_isr
 
A1_1 Alias Portb.3
A1_2 Alias Portb.4
A1_3 Alias Portb.5
 
A2_1 Alias Portb.0
A2_2 Alias Portb.1
A2_3 Alias Portb.2
 
A3_1 Alias Portd.5
A3_2 Alias Portd.6
A3_3 Alias Portd.7
 
Kropka Alias Portc.4
Buzer Alias portd.1
 
Dim Mux As Byte
 
Dim Liczba(3) As Word , Helpw As Word , Copyw As Word
Dim Cyfra(9) As Byte , Helpb As Byte , N As Byte , I As Byte
Dim Displ As Byte
 
Liczba(1) = 042
Liczba(2) = 089
Liczba(3) = 725
 
 Gosub Przelicz_wszystkie
 
Enable Interrupts
 
 
Do
 
 If Odbierz > 0 Then
 
  Getrc5(address , Command)
   Command = Command And &B01111111
  Odbierz = 0
   Enable Int0
 
  If Address = 0 Then                                       'TV only
   'cmd 16 vol+
   'cmd 17 vol-
 
   Select Case Command
    Case 0 To 9
 
     If Displ < 9 Then
      Cyfra(displ) = Lookup(command , Bcd_tab)
       Incr Displ
        If Displ = 4 Then Gosub Clear_displ
        If Displ = 7 Then Gosub Clear_displ
     End If
 
    Case 16 To 17
     Displ = 1
      Gosub Clear_displ
 
   End Select
 
  End If
 
 End If
 
 Loop
End
 
Clear_displ:
 Helpb = Displ + 2
 For N = Displ To Helpb
  Cyfra(n) = Lookup(10 , Bcd_tab)
 Next
Return
 
Int0_isr:
 Disable Int0
  Odbierz = 1
Return
 
Przelicz_wszystkie:
  Helpb = 9
For I = 3 To 1 Step - 1
    Copyw = Liczba(i)
    Helpw = Copyw Mod 10
    Cyfra(helpb) = Lookup(helpw , Bcd_tab)
   Decr Helpb
    Copyw = Copyw / 10
    Helpw = Copyw Mod 10
    Cyfra(helpb) = Lookup(helpw , Bcd_tab)
   Decr Helpb
    Helpw = Copyw / 10
    Cyfra(helpb) = Lookup(helpw , Bcd_tab)
   Decr Helpb
Next
Return
 
Timer2_isr:
 
Incr Mux
 If Mux > 9 Then Mux = 1
 
  Select Case Mux
    Case 1:
      Set A3_3
       Portc = Cyfra(mux)
      Reset A1_1              'zal.wyswietlacza A1_1
    Case 2:
      Set A1_1
       Portc = Cyfra(mux)
      Reset A1_2              'zal.wyswietlacza A1_2
    Case 3:
      Set A1_2
       Portc = Cyfra(mux)
      Reset A1_3              'zal.wyswietlacza A1_3
    Case 4:
      Set A1_3
       Portc = Cyfra(mux)
      Reset A2_1              'zal.wyswietlacza A2_1
    Case 5:
      Set A2_1
       Portc = Cyfra(mux)
      Reset A2_2              'zal.wyswietlacza A2_2
    Case 6:
      Set A2_2
       Portc = Cyfra(mux)
      Reset A2_3              'zal.wyswietlacza A2_3
    Case 7:
      Set A2_3
       Portc = Cyfra(mux)
      Reset A3_1              'zal.wyswietlacza A3_1
    Case 8:
      Set A3_1
       Portc = Cyfra(mux)
      Reset A3_2                                            'zal.wyswietlacza A3_2
    Case 9:
      Set A3_2
       Portc = Cyfra(mux)
      Reset A3_3              'zal.wyswietlacza A3_3
  End Select
   Set Kropka
Return
 
Bcd_tab:
 Data 0 , 1 , 4 , 5 , 8 , 9 , 12 , 13 , 2 , 3 , 15
                                                 'pusty

-

BARTek
Moja strona

Portret użytkownika marekszy

Tablica informacyjna

Naprawdę jestem pod wrażeniem Twoich programów , jest się od kogo uczyć.
Program działa prawie bezbłędnie, problem jest z ostatnią dziewiątą cyfrą ,nie wpisuje nic (pozostaje ciemna). Musiałem kombinować z pilotami bo te co mam w domu nadają coś innego ,ale i tak muszę zrobić czytnik RC5 to sobie z nimi poradzę. Mam jeszcze pytanie gdzie dodać zapis cyfr do eeprom po wpisaniu ostatniej cyfry. Na dzisiaj starczy, dopiero niedawno wróciłem, zostawię to sobie na wolne dni, mam jeszcze parę pytań ale to już na spokojnie, najpierw dobrze przyjrzę się temu co mi tu dałeś.
Dzięki

Portret użytkownika EDC

Odp. Tablica informacyjna

Heheh :D To tak zawsze jest i błąd sie ukryje jak nie sprawdzisz a miałem tylko sześć wyświetlaczy to tylko sześć podłączyłem.
Myślę, że błąd jest w zapisie "If Displ < 9 Then" i wystarczy napisać "If Displ <= 9 Then"

-

BARTek
Moja strona

Portret użytkownika marekszy

Tablica informacyjna

"If Displ <= 9 Then" załatwiło problem z dziewiątą cyfrą i działa wg opisu.
Jak zrobić aby wpisanie kolejnej cyfry odbywało się dopiero po puszczeniu przycisku i kolejnym wciśnięciu, w tej chwili jak trzymam przycisk to to wpisuje wszystkie wyświetlacze po kolei?

Portret użytkownika EDC

Odp. Tablica informacyjna

Zobacz tak. Może to załatwi sprawę ;) Nie mam teraz jak sprawdzić :D
Liczę na to że nawet po puszczeniu przycisku dokonywany jest jeszcze jeden odczyt, ale to nie musi się sprawdzić :D
Dodałem też początkowa wartość dla zmiennej Displ - taki odkryty bug :D

Dim Lock As Byte
 Displ = 10 'trzeba zablokować możliwość zmian przed wciśnięciem VOL+ lub VOL- (czy tam MENU)
Do
 
 If Odbierz > 0 Then
 
  Getrc5(address , Command)
   Command = Command And &B01111111
  Odbierz = 0
   Enable Int0
 
  If Address = 0 Then                                       'TV only
 
   If Lock = 0 Then                                         '
 
      Select Case Command
       Case 0 To 9
 
        If Displ <= 9 Then
         Cyfra(displ) = Lookup(command , Bcd_tab)
          Incr Displ
           If Displ = 4 Then Gosub Clear_displ
           If Displ = 7 Then Gosub Clear_displ
        End If
 
       Case 16 To 17
        Displ = 1
         Gosub Clear_displ
 
      End Select
 
      Lock = 1                                              'zablokuj do momentu puszczenia przycisku
 
   End If
 
  Else
   Lock = 0                                                 'odblokuj
  End If
 
 End If
 
 Loop
End

-

BARTek
Moja strona

Portret użytkownika marekszy

Tablica informacyjna

No i znowu działa ,jest super, jutro postaram się dodać zapisy i odczyty cyfr. Jak jeszcze wpadnie mi coś do głowy to napiszę .
Z ciekawości możesz napisać mi czy przerobiłeś u siebie odbiór i komendy tych pilotów NEC po około 6 pln z allegro do arduino?
Tak na przyszłość ,jestem ciekawy czy można by go podmienić w sterowniku Mirka.
Dzięki

Portret użytkownika marekszy

Tablica informacyjna

Witam, jednak nie jestem w stanie zrobić zapisu, to co jest wyświetlane za pomocą pilota nie jest modyfikacją

Liczba(1) = 042
Liczba(2) = 089
Liczba(3) = 725

i niestety nie mogę tego wyodrębnić do zapisu.
próbowałem robić zapis za pomocą przycisku Menu (case 59), czy to przy takim wpisywaniu cyft da radę zrobić?

Portret użytkownika EDC

Odp. Tablica informacyjna

Jest wiele sposobów żeby to zrobić.
Najprościej w momencie kiedy wyświetlacz gaśnie..
Liczba(1) = Command * 100
W następnym kroku Pomocnicza_zmienna = Command * 10 : Liczba(1) = Liczba(1) + Pomocnicza_zmienna.
Na końcu Liczba(1) = Liczba(1) + Command

Dla przykładu 042 byłoby to 0x100 + 4x10 + 2

Oczywiście to tylko jedna z możliwości a nazw zmiennych użyłem takich żeby było wiadomo o co mi chodzi.

-

BARTek
Moja strona

Portret użytkownika marekszy

Tablica informacyjna

No niby to jest jasne , ale po wielu kombinacjach i tak nie ogarnąłem ,nawet nie jestem pewny gdzie to dopisać.

Portret użytkownika EDC

Odp. Tablica informacyjna

No to łap.
Możliwe, że gdybym od początku myślał o zapisie w Eeprom to może dałby się to zrobić bardziej elegancko ;)
Teraz to dopisałem to do istniejącego kodu.
Przy okazji chciałem pokazać, że dla większej ilości wyświetlaczy polubiłem dedykowane układy.
Nie sa skomplikowane w obsłudze a same multipleksują wyjścia. Max7219 potrafi multipleksować 8 na raz,
a HT16K33 do 16 na raz :P Takie rozwiązanie odciąża procesor i możesz sobie robić inne rzeczy.
Ten projekt oczywiście tego nie wymaga, ale możesz zobaczyć co namodziłem niedawno :D Link do filmu

Kod z zapamietywaniem w Eeprom - not tested.

$regfile = "m8def.dat."
$crystal = 16000000
$hwstack = 64
$swstack = 16
$framesize = 64
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portc = &B00111111 : Portc = &B11111111
Config Portd = &B11111011 : Portd = &B11111111
 
 
Config Timer2 = Timer , Prescale = 256 , Compare = Disconnect , Clear Timer = 1
Enable Compare2 : On Compare2 Timer2_isr : Compare2 = 137   '450Hz @16MHz/256
 
Config Rc5 = Pind.2 , Wait = 2000
 Dim Address As Byte , Command As Byte , Odbierz As Byte
 
Config Int0 = Falling
 Enable Int0 : On Int0 Int0_isr
 
A1_1 Alias Portb.3 : A2_1 Alias Portb.0 : A3_1 Alias Portd.5
A1_2 Alias Portb.4 : A2_2 Alias Portb.1 : A3_2 Alias Portd.6
A1_3 Alias Portb.5 : A2_3 Alias Portb.2 : A3_3 Alias Portd.7
 
Kropka Alias Portc.4 : Buzer Alias Portd.1
 
Dim Mux As Byte , N As Byte , I As Byte
Dim Helpw As Word , Copyw As Word
Dim Cyfra(9) As Byte , Helpb As Byte
Dim Displ As Byte , Lock As Byte
 
Dim Liczba(3) As Word , Liczba_ee(3) As Eram Word
Dim Ee_check As Eram Byte : Const Ee_mem = &H10
 
'programowanie eeprom przy pierwszysm użyciu
 Helpb = Ee_check
 If Helpb <> Ee_mem Then
  Ee_check = Ee_mem                                         'zapisz do eeprom
    Liczba_ee(1) = 123                                      'wartosci domyslne
    Liczba_ee(2) = 456
    Liczba_ee(3) = 789
  End If
'koniec programowania eeproma
 
'odczyt eeproma
 For N = 1 To 3
  Liczba(n) = Liczba_ee(n)
 Next
 
Gosub Przelicz_wszystkie
 
 Enable Interrupts
 
Do
 
 If Odbierz > 0 Then
 
  Getrc5(address , Command)
   Command = Command And &B01111111
  Odbierz = 0
   Enable Int0
 
  If Address = 0 Then                                       'TV only
 
   If Lock = 0 Then                                         '
 
      Select Case Command
       Case 0 To 9
 
        If Displ <= 9 Then
         Cyfra(displ) = Lookup(command , Bcd_tab)
          Incr Displ : Incr N
           Select Case N
            Case 1 : Copyw = Command * 100
            Case 2 : Helpw = Command * 10
             Copyw = Copyw + Helpw
            Case 3 : Copyw = Copyw + Command
             Incr I : Liczba_ee(i) = Copyw                  'I powinno mieć kolejno 1,2 i 3
           End Select                                       'i tutaj co trzy kliki zapis do Eeprom
           If Displ = 4 Then Gosub Clear_displ
           If Displ = 7 Then Gosub Clear_displ
        End If
 
       Case 16 To 17
        Displ = 1 : I = 0
         Gosub Clear_displ
 
      End Select
 
      Lock = 1                                              'zablokuj do momentu puszczenia przycisku
 
   End If
 
  Else
   Lock = 0                                                 'odblokuj
  End If
 
 End If
 
 Loop
End
 
Clear_displ:
 Helpb = Displ + 2
 For N = Displ To Helpb
  Cyfra(n) = Lookup(10 , Bcd_tab)
 Next
  N = 0
Return
 
Int0_isr:
 Disable Int0
  Odbierz = 1
Return
 
Przelicz_wszystkie:
  Helpb = 9
For I = 3 To 1 Step - 1
    Copyw = Liczba(i)
    Helpw = Copyw Mod 10
    Cyfra(helpb) = Lookup(helpw , Bcd_tab)
   Decr Helpb
    Copyw = Copyw / 10
    Helpw = Copyw Mod 10
    Cyfra(helpb) = Lookup(helpw , Bcd_tab)
   Decr Helpb
    Helpw = Copyw / 10
    Cyfra(helpb) = Lookup(helpw , Bcd_tab)
   Decr Helpb
Next
 Displ = 10                                                 'zablokuj wpisy
Return
 
Timer2_isr:
 
Incr Mux
 If Mux > 9 Then Mux = 1
 
  Select Case Mux
    Case 1:
      Set A3_3
       Portc = Cyfra(mux)
      Reset A1_1                                            'zal.wyswietlacza A1_1
    Case 2:
      Set A1_1
       Portc = Cyfra(mux)
      Reset A1_2                                            'zal.wyswietlacza A1_2
    Case 3:
      Set A1_2
       Portc = Cyfra(mux)
      Reset A1_3                                            'zal.wyswietlacza A1_3
    Case 4:
      Set A1_3
       Portc = Cyfra(mux)
      Reset A2_1                                            'zal.wyswietlacza A2_1
    Case 5:
      Set A2_1
       Portc = Cyfra(mux)
      Reset A2_2                                            'zal.wyswietlacza A2_2
    Case 6:
      Set A2_2
       Portc = Cyfra(mux)
      Reset A2_3                                            'zal.wyswietlacza A2_3
    Case 7:
      Set A2_3
       Portc = Cyfra(mux)
      Reset A3_1                                            'zal.wyswietlacza A3_1
    Case 8:
      Set A3_1
       Portc = Cyfra(mux)
      Reset A3_2                                            'zal.wyswietlacza A3_2
    Case 9:
      Set A3_2
       Portc = Cyfra(mux)
      Reset A3_3                                            'zal.wyswietlacza A3_3
  End Select
   Set Kropka
Return
 
Bcd_tab:
 Data 0 , 1 , 4 , 5 , 8 , 9 , 12 , 13 , 2 , 3 , 15
                                                 'pusty

-

BARTek
Moja strona

Portret użytkownika marekszy

Tablica informacyjna

No powiem szczerze ,nigdy bym tego nie dopisał tak aby ten zapis zadziałał. W Twoim wykonaniu jest wszystko ok.
Obejrzałem filmik i jestem pod wrażeniem jak to fajnie działa. Podeślesz schemat i program, czy też na chwilę obecną za świeży temat , z chęcią bym to sobie poćwiczył.
Dzięki za pomoc.