Sterownik kościelnego wyświetlacza z RS485, klawiaturą i wyświetlaczem na ATtiny2313


Witam. Chciałbym pokazać ciekawe rozwiązanie które "oszczędza" wyprowadzenia małego ATtiny.
Projekt wykonany na podstawie programów wcześniej napisanych przez Pana Mirleja, więc tutaj go przedstawię.
20 nóżek obsługuje klawiaturę, trzy siedmiosegmentowe wyświetlacze i transmisję po RS485 do drugiego wyświetlacza na kilkadzieści metrów dwoma przewodami.
Dostałem to do naprawy po wyładowaniach atmosferycznych. W środku był AT89C2051 ..usmażony.
Producent nieznany więc przyszło napisać program od podstaw. Oczywiście wybór padł na AVR ze względu na kompatybilność i dodatkowo możliwość ISP.
Pokazuję to jako "ciekawostkę" bo pokazuje jak w BASCOM zrealizowałem multipleksowanie i odczyt klawiatury w jednej procedurze. Może się komuś przyda.
Wyświetlacze są trzy i tak samo kolumny klawiatury. Gdy wysterowywujemy tranzystor by zapalić jeden wyswietlacz, podajemy masę na jedną z kolumn klawiatury.
Schemat to mój pierwszy wykonany w programie DesignSpark więc proszę o wyrozumiałość :D

Działanie z punktu widzenia organisty który to obsługuje:
1.Po włączeniu uruchamia się test segmentów wyświetlacza
2.Urządzenie nie pozwala wpisać zera jako pierwszego (estetyka wyświetlania drugiego dużego wyświetlacza
nad ambona)
3."*" gwiazdka kasuje wyswietlacz do "000" i migają kropki pod cyframi
4.Wysłanie "#" hashem samych zer na wyświetlacz wyłacza go całkowicie (w nadajniku swiecą tylko kropki)
5.Wpisanie jakiejkolwiek liczby 1-3 cyfrowej powoduje miganie kropek informujac że nie wysłano na drugi wyswietlacz.
6.Wysłanie hashem wyłącza kropki. Wpisanie kolejnej liczby możliwe dopiero po nacisnięciu gwiazdki.

'****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 4000000
$baud = 9600
 
Config Portb = &B10000111 : Portb = &B11111111              '7-kropka,6-3 klaw,2-0 klaw+anody
Config Portd = &B11111111 : Portd = &B11111111              '6-4 BCD
Config Porta = &B00000000 : Porta = &B11111111
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwanie0
'****************************
'      Zmienne
'****************************
Dim Licznik As Byte                                         'ilosc cyfr z blokada do 3
Dim Dziel As Byte                                           'pomocnicza czasu (100ms)
Dim Cyfra As Byte                                           'cyfra z klawiatury
Dim Mux As Byte                                             'kolejne wyswietlacze / multipleksowanie
Dim C1 As Byte                                              'wyswietlacz jednosci
Dim C2 As Byte                                              'wyswietlacz dziesiatek
Dim C3 As Byte                                              'wyswietlacz setek
Dim F4ms As Bit                                             'flaga,czas na multipeksowanie
Dim F100ms As Bit                                           'flaga migania (wprowadzanie)
Dim Ustaw As Bit                                            'flaga gaszenia migania (wysłano na wysiwtlacz)
Dim Licz_help As Byte
Dim Send As Byte                                            'pomocnicza zmienna RS232
'***************************
' Inicjalizacja i test wyświetlaczy
'***************************
Do
Portb = &B00000000
For Licznik = 0 To 9
Portd = Lookup(licznik , Tabela)
Waitms 400
Next Licznik
If Licznik = 10 Then
Exit Do
End If
Loop
 
Licznik = 0
Portb = &B11111111
Portd = &B11111111
 
'****************************
' Wartości początkowe
'****************************
C1 = 0
C2 = 0
C3 = 0
Reset Ustaw
Enable Interrupts
'****************************
      'Petla glowna
'****************************
Do
 If F4ms = 1 Then                                           'jesli flaga to mineło 4ms i
  Reset F4ms
  Gosub Wyswietl                                            'skok do obslugi wyswietlaczy i klawiatury
 End If                                                     'jesli wysłano na wyswietlacz to
 If Ustaw = 1 Then                                          'zgas miganie
 Set Portb.7
 End If
 If C1 = 10 And C2 = 10 And C3 = 10 Then                    'chyba ze wylaczony wyswietlacz to
 Reset Portb.7                                              'włącz diody na stałe
 End If
Loop
End
'****************************
      'Liczba
'****************************
Numer:                                                      'wpisywanie kolejnych cyfr na wyswietlacze
If F100ms = 1 And Licznik = 0 Then                          'zabezpieczenie styków przez 100ms
 C1 = Cyfra
 C2 = 10                                                    'ukrywanie zera wiodacego
 C3 = 10                                                    'ukrywanie zera wiodacego
 Incr Licznik                                               'ilosc cyfr (dodano pierwszą)
 Reset F100ms
 End If
 
 
If F100ms = 1 And Licznik = 1 Then
 C2 = C1                                                    'przesuwa cyfrę 1 na wyswietlaczu
 C1 = Cyfra
 C3 = 10                                                    'ukrywanie zera wiodacego
 Incr Licznik                                               'dodano drugą cyfrę
 Reset F100ms
 End If
 
If F100ms = 1 And Licznik = 2 Then
 C3 = C2                                                    'przesuwa cyfrę 1
 C2 = C1                                                    'przesuwa cyfrę 2
 C1 = Cyfra
 Incr Licznik                                               'dodaje trzecia cyfre
 Reset F100ms                                               'jesli tu zwiekszy do 4 to blokuje wpisywanie
 End If
Return
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 130                                                'laduje timer i zostaje 55 do przepełnienia
   Set F4ms                                                 'ustawia flagę (podstawowa jednostka czasu)
   Incr Dziel
   If Dziel = 120 Then
    Dziel = 0                                               'jesli 250 przepelnien to 100ms i ustaw flagę
    Set F100ms
    If Ustaw = 0 Then                                       'jesli  wpisywanie cyfr to migaj
    Portb.7 = Not Portb.7                                   'migajace kropki przy niezatwierdzonych
    End If
   End If
Return
'****************************
      'wyswietlanie
'****************************
Wyswietl:
  Incr Mux                                                  'kolejne wyswietlacze i czesci klawiatury
  If Mux = 3 Then Mux = 0
 
  Select Case Mux
 
    Case 0:
      Set Portb.0                                           'zgas wyswietlacz 1
      Portd = Lookup(c3 , Tabela)                           'ustaw port w BCD dla wysw.3
      Reset Portb.2
      Waitms 1                                              'deelay potrzebny naustawienie sie portu
  If Pinb.3 = 0 Then                                        'odczyt klawiatury
  Cyfra = 1
  Gosub Numer                                               'skok do wprowadzania liczby (1-3 cyfrowej)
  End If
  If Pinb.4 = 0 Then
  Cyfra = 4
  Gosub Numer
  End If
  If Pinb.5 = 0 Then
  Cyfra = 7
  Gosub Numer
  End If
  If Pinb.6 = 0 Then                                        'kasuje wyswietlacz i umozliwia nowy wpis bo licznik=0
  C1 = 0
  C2 = 0
  C3 = 0
    Licznik = 0
    Cyfra = 0
    Reset Ustaw                                             'włącza miganie
  End If
 
    Case 1:
     Set Portb.2
     Portd = Lookup(c2 , Tabela)
     Reset Portb.1
     Waitms 1
  If Pinb.3 = 0 Then
  Cyfra = 2
  Gosub Numer
  End If
  If Pinb.4 = 0 Then
  Cyfra = 5
  Gosub Numer
  End If
  If Pinb.5 = 0 Then
  Cyfra = 8
  Gosub Numer
  End If
  If Licznik > 0 Then                                       'nie pozwala wpisac zera jako pierwszego
   If Pinb.6 = 0 Then
    Cyfra = 0
    Gosub Numer
   End If
  End If
 
    Case 2:
     Set Portb.1
     Portd = Lookup(c1 , Tabela)
     Reset Portb.0
     Waitms 1
  If Pinb.3 = 0 Then
  Cyfra = 3
  Gosub Numer
  End If
  If Pinb.4 = 0 Then
  Cyfra = 6
  Gosub Numer
  End If
  If Pinb.5 = 0 Then
  Cyfra = 9
  Gosub Numer
  End If
  If Pinb.6 = 0 Then                                        'jesli nacisniety #
   Set Ustaw                                                'wylacz miganie
 
   Gosub Rs_wyslij                                          'wyslij wartosci kolejnych cyfr
 
   Licznik = 4                                              'nie pozwol wpisywac cyfr do skasowania licznika
   If C1 = 0 And C2 = 0 And C3 = 0 Then                     'jesli trzy zera i # to gas wyswietlacze
   C1 = 10
   C2 = 10
   C3 = 10
   End If
  End If
 End Select
Return
 
 
'**********  Wysylanie RS *********
Rs_wyslij:
Set Portd.2
 Send = 10 + C1                                             'dodaj 10 co znaczy jednosci
   Printbin Send
 Send = 20 + C2                                             'dodaj 20 co znaczy dziesiatki
 If Licznik = 1 Then
 Send = Send - 10                                           'odejmuje 10 dodane przez licznik by zgasic pierwszy
 End If
   Printbin Send
 Send = 30 + C3                                             ' dodaj 30   co znaczy setki
 If Licznik = 1 Or Licznik = 2 Then
 Send = Send - 10
 End If
   Printbin Send
 Reset Portd.2
Return
'**********  Wysylanie RS koniec *********
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 0 , 8 , 16 , 24 , 32 , 40 , 48 , 56 , 64 , 73 , 255
'znak:    0   1   2    3    4    5    6    7    8    9    10  PortD ->kod BCD dla UCY7447

Jak widać na schemacie użyto też dekodera kodu BCD UCY 7447 CEMI

Całość działa w kościele już od jakiegoś czasu. Zrobię zdjęcia to dołożę.
W drugim wyświetlaczu też ten sam procesor z układem konwertera SN75176BP (MAX485)
Po RS wysyłane sa trzy bajty a kodowanie jest proste: dziesiątki w dwucyfrowej liczbie odpowiadają za pozycję na wyświetlaczu cyfry która w liczbie jest "jednościa" Dla przykładu wysłanie na drugi wyświetlacz liczby 483 to wysłanie 34,28,13 a wysłanie 926 to 39,22,16. Działa, myślałem nad sumą kontrolną ale ..bez przesady :D Jeśli będzie zainteresowanie to moge schemat odbiornika i kod źródłowy dołozyć.

Aha..Układ działał na wewnętrznym kwarcu bezproblemowo(dlatego oszczedziłem sobie na schemacie)..ale był już kwarc w oryginale więc dla pewności transmisji po RS przerabiając układ resetu podmieniłem kwarc na 4MHz.




Portret użytkownika RelefNW

Jestem zainteresowany odbiornikiem

Witam . Chciałbym wykorzystać ten wspaniały projekt do mojego pieca CO . Mam kotłownie oddaloną około 10 m i jest utrudniony sposób kontroli nastaw i odczyt w domu . Ten projekt idealnie by mi "pasił" oczywiście z wprowadzonymi zmianami . Proszę kolegę o źródło i schemat odbiornika .

Portret użytkownika EDC

Proszę bardzo..

Akurat wczoraj miałem czas by dalej "trenować" rysowanie schematów w DesignSpark i mam gotowca :D
Jako że rysowałem z pamięci i tylko dla nabrania wprawy, na schemacie mogą się niezgadzać wyprowadzenia do poszczególnych segmentów LED. To specyficzny sprzęt kościelny :D Ma za zadanie wyświetlać numer pieśni na DUŻYM wyświetlaczu tak by był widoczny na cały kościół. Dlatego diody w odbiorniku sa połączone szeregowo i zasilane 14V. Ich sterowaniem zajmuje się ULN 2003, a +14V na każdy wyświetlacz posyłane jest przez 2 tranzystory. Dałbym tam np. BS108 , ale jak napisałem wcześniej miałem to tylko naprawić. Poniżej moje wczorajsze wypociny, czyli cały schemat.

Tu króciutki kod odbiornika.

                              '****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 4000000
$baud = 9600
 
Config Portb = &B11111111 : Portb = &B00000000
Config Portd = &B11111111 : Portd = &B00000000
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Wyswietlacz
Enable Interrupts
 
 
'****************************
      'Zmienne
'****************************
Dim Mux As Byte                                             'zmienna pomocnicza do multipleksowania wyswietlaczy
Dim Send As Byte                                            'bajt z zakodowana wartoscia i miejscem na wyswietlaczu
Dim C1 As Byte                                              'cyfry na wyswietlaczach
Dim C2 As Byte
Dim C3 As Byte
 
'****************************
      'Petla glowna
'****************************
'W przeslanym bajcie starsza czesc odpowiada z miejsce w liczbie
'mlodsza to wartosc
'tak wiec cyfra na wyswietlaczu 456 to w przeslanych bajtach
' 456= 34, 25, 16
Do
 
Reset Portd.3                                               'ustawianie MAX485 na odbior
 
 Send = Inkey()
   If Send > 9 And Send <= 19 Then                          'jesli odebrany bajt pomiedzy 9 a 19 (10-19)
   C1 = Send Mod 10                                         'ustawiamy wtedy jednosci (dzielimy/10 i reszta to wartosc)
   End If
 If Send > 19 And Send <= 29 Then
 C2 = Send Mod 10                                           'ustawiamy dziesietne
 End If
   If Send > 29 And Send <= 39 Then
   C3 = Send Mod 10                                         'ustawiamy setne
   End If
If C3 = 0 And C2 = 0 Then                                   'jesli cyfra jednocyfrowa to gas drugi wyswietlacz
C2 = 11
End If
  If C3 = 0 And C2 = 11 And C1 = 0 Then                     'gaszenie calego wyswietlacza
  C2 = 11
  C1 = 11                                                   'gdy same zera
  End If
 
Loop
End
 
'****************************
      'wyswietlanie
'****************************
 
Wyswietlacz:
 
Timer0 = 130
 
  Incr Mux
  If Mux = 3 Then Mux = 0
 
  Select Case Mux
    Case 0:
      Reset Portd.4                                         'kolejny wyswietlacz (gaszenie)
      Portb = Lookup(c3 , Tabela)                           'ustawiamy segmenty
      If C3 = 0 Then Portb = 0                              'stale wygaszenie jesli liczba mniejsza od 100
      Set Portd.6                                           'wlaczamy wyswietlacz 3 (setne)
 
    Case 1:
     Reset Portd.6                                          'kolejny wyswietlacz (gaszenie)
     Portb = Lookup(c1 , Tabela)
     Set Portd.5
 
    Case 2:
     Reset Portd.5                                          'kolejny wyswietlacz (gaszenie)
     Portb = Lookup(c2 , Tabela)
     Set Portd.4
 
   End Select
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 126 , 48 , 109 , 121 , 51 , 91 , 95 , 112 , 127 , 123 , 0
'znak:    0     1     2     3    4    5    6     7     8     9  ciemny

Teraz kilka słów o transmisji po RS485. Nic o niej wcześniej nie wiedziałem więc musiałem doczytać.
Jesli masz tylko dwie kostki do skomunikowania to nie trzeba się martwić żadnym adresowaniem. Łaczy się tak samo jak MAX323 z tą różnica że nadając ustawia się wysoki stan na nóżce odpowiadającej za nadawanie. Jeśli odbiornik ma tylko odbierać i wyswietlac to pewnie można ja do masy na stałe połączyć. W odbiorniku i nadajniku pomiedzy przewodami linii A i B znajdują się rezystory (zakończenia linii). W Twoim więc przypadku może po prostu skorzystać z projektu wyświetlacza na RS232 i zamiast MAX232 wsadzić SN75176BP (odpowiednik MAX485) i przy nadawaniu tylko dołożyc jeden port procesora w procedurze Rs_wyslij.
Ten projekt przedstawiłem jako ciekawostkę oszczędności wyprowadzeń procesora. Mając na celu zdalny odczyt parametrów napisałbym to inaczej. Chyba że kolega chce sterować piecem z daleka :D
Ten projek może być wstępem do jakiegoś wyświetlacza na hali sportowej ..

-

BARTek
Moja strona

Portret użytkownika gosc

Dziękuję za całość

Bardzo dziękuję koledze za poświęcenie czasu i przesłanie strony odbiorczej . W domu ma być tylko wyświetlacz kontrolny informujący o nastawach i pracy kotła. Pod koniec miesiąca mam trochę wolnego czasu i zabieram się za pracę . Jako wyświetlacz chcę mieć LCD bo więcej można wyświetlić informacji .

Portret użytkownika gosc

Rewelacja!

W końcu trafiłem we właściwe miejsce. Ponieważ znajomy prosił mnie o zrobienie takiego sterownika (i to właśnie do kościoła!), a specjalnie nie mam aż takiej wiedzy w programowaniu, postanowiłem poszukać i... znalazłem!
Pytanie tylko mam takie, czy jest to duży kłopot z dostosowaniem kodu pod Arduino (wolałbym iść w tym kierunku)?? Elektronicznie dałbym radę.
Pozdrawiam.

Portret użytkownika EDC

Odp. Sterownik kościelnego wyświetlacza

Projektem bawiłem się dość dawno i może teraz kilka rzeczy napisałbym inaczej :D
Co do Arduino, nie mam czasu by to przepisać, ale może ktoś Ci to przepisze.
W sumie Demo Bascom kompiluje kod do 4kB a Tiny2313 ma tylko 2kB :D
Ściągasz Demo, kompilujesz, wgrywasz do Tiny i gotowe. Ewentualnie mogę Ci to skompilować i załączyć gotowe pliki HEX

-

BARTek
Moja strona