[Bascom] Atmega8 prosty zegar LED - prośba


Witam i z góry chciałbym przeprosić jeśli na forum był już podobny temat, problem w tym że chciałbym prosić o prosty (na prawdę prosty) program zegara LED (6 cyfr) oparty na kwarcu 8MHz (możebyć wiecej, lecz nie posiadam 32768Hz). Posiadam kilka przykładów programu: "liczenie" czasu, multipleksowanie LED (tych aż za dużo) lecz nie potrafię sobie wyobrazić jak ma wyglądać ich sprawne połączenie w jedną całość... na elektrodzie jest wiele takich tematów lecz w żadnym nie znajduje się prosty plik .bas który pokazał by mi dobitnie jak to ma wyglądać. Podsumowywując proszę o kod źródłowy który zilustruje zamianę zmiennych (Sek, Min, Godz) na wartości wyświetlane na wyświetlaczu najlepiej z wykorzystaniem Case Select, rozumiem że dla niektórych może to być śmieszne, lecz ja nie wyobrażam sobie nauki bez sensownego przykładu który widnieć winień na kartce. Jeśli miałoby to ułatwić podam aliasy i dane do wyświetlacza:
W1 Alias Portc.5
W2 Alias Portc.4
W3 Alias Portc.3
W4 Alias Portc.2
W5 Alias Portc.1
W6 Alias Portc.0

Liczby:
Data &D00000010 , &D10011110 , &D00100100 , &D00001100 , &D10011000,
Data &D01001000 , &D01000000 , &D00011110 , &D00000000 , &D00001000




Portret użytkownika EDC

Odp. [Bascom] Atmega8 prosty zegar LED

Osobną rzeczą jest obliczenie wartości dla każdego z wyświetlaczy.
Najpierw musisz wiedzieć co to jest Modulo Mod
Jest to reszta z dzielenia przez wartość która stoi za wyrażeniem Mod
Przykład 1 : Wynik = 5 Mod 2 Wynikiem będzie jeden, bo pięć podzielone przez dwa to dwa, ale reszta to jeden.
Przykład 2 : Wynik = 12 Mod 10 Wynikiem będzie dwa, bo 12 podzielone przez dziesięć to jeden , ale reszta to dwa.

Tak więc jeśli masz godzinę 24h : 31m : 43s w trzech osobnych bajtach

Dim Cyfra_1 As Byte
Dim Cyfra_2 As Byte
Dim Cyfra_3 As Byte
Dim Cyfra_4 As Byte
Dim Cyfra_5 As Byte
Dim Cyfra_6 As Byte
 
 Cyfra_1 = Godzina / 10   'wynikiem jest 2
 Cyfra_2 = Godzina Mod 10 'wynikiem jest 4
 Cyfra_3 = Minuty /10     'wynikiem jest 3
 Cyfra_4 = Minuty Mod 10  'wynikiem jest 1
 Cyfra_5 = Sekundy / 10   'wynikiem jest 4
 Cyfra_6 = Sekundy Mod 10 'wynikiem jest 3

Kiedy masz obliczone wartości dla poszczególnych wyświetlaczy to używasz polecenia Lookup

Polecenie to odczytuje z tablicy dane znajdujące się na miejscu które wskazujesz.
W tablicy wiec umieszczasz wartości tak żeby pod danym numerem porządkowym znajdowała sie taka wartość która na wyświetlaczu będzie pokazywać cyfrę. Czyli na miejscu trzecim umieszczasz taką wartośc żeby uruchomiona na wyświetlaczu dała nam cyfrę trzy.

Jesli teraz odwołasz się do tablicy Ustaw_port = Lookup(3,Liczby) to program odczyta wartośc w tablicy spod trzeciego miejsca.
Jeśli jednak napiszesz tak Ustaw_port = (Cyfra_5, Liczby) to będzie czytać spod czwartego miejsca bo Cyfra_5 ma aktualnie wartość 4 i przechowuje wartość dla piątego wyswietlacza.

Jak to ogarniesz to możesz wszystko zautomatyzować bardziej :)

Teraz będziemy mieli zarezerwowane tez sześć bajtów ale nie będa się inaczej nazywały a będą miały numerek/index co pozwoli łatwiej się do nich odwoływać.

Dim Cyfra(6) As Byte
 
 Cyfra(1) = Godzina / 10   'wynikiem jest 2
 Cyfra(2) = Godzina Mod 10 'wynikiem jest 4
 Cyfra(3) = Minuty /10     'wynikiem jest 3
 Cyfra(4) = Minuty Mod 10  'wynikiem jest 1
 Cyfra(5) = Sekundy / 10   'wynikiem jest 4
 Cyfra(6) = Sekundy Mod 10 'wynikiem jest 3

Teraz trzeba przypomniec sobie ze ludzkie oko widzi bezwładnie przy zmianie obrazu szybszym niż 50 klatek na sekundę.
Co w drugą stronę oznacza że potrafi dostrzec mruganie jeśli coś się dzieje wolniej...
Tak więc masz tylko jeden port którym ustawiasz to co dzieje się na wyświetlaczach a musisz każdy z nich odświeżyć minimum 50 razy na sekundę. Trzeba więc to wszystko robić sześć razy szybciej.
50Hz x 6 = 300Hz . Wychodzi na to że przydało by się to robić co 3,3ms...
Można szybciej ale bez szaleństw, tak żeby program miał jeszcze czas na inne sprawy.
Teraz piszesz sobie obsługę tych wyświetlaczy. Sprawa jest nieskomplikowana.
Trzeba wiedzieć ż epo starcie programu wszystkie zmienne, dopóki coś w nich nie zapiszesz, mają wartość zero i to się przyda. Możesz bowiem zaraz po wejściu do procedury obsługi wyświetlaczy zwiększyć wartośc zmiennej odpowiadającej za to który akurat wyświetlacz bierzemy pod uwagę. Czyli z zera zrobi się jeden.
Rozważmy jeszcze sytuacje że jesteśmy tu siódmy raz i zmienna ma wiecej niż mamy wyświetlaczy. Sprowadzamy ją więc znów do parteru :P
Potem już bułka z masłem. W zalezności który aktualnie wyświetlacz obsługujemy to nim się zajmujemy poprzez Select Case gasimy poprzedni, ustawiamy port wartością nowego wyświetlacza i zapalamy go po czym opuszczamy podprogram.

Incr Numer_wyswietlacza
If Numer_wyswietlacza >= 7 Then Numer_wyswietlacza = 1
 
 Select Case Numer_wyswietlacza
 
    Case 1
     Reset Wyswietlacz.poprzedni ' (tutaj będzie to szósty )
      Port_wyswietlaczy = Lookup(Cyfra(Numer_wyswietlacza),Liczby)
     Set   Wyswietlacz.numer_wyswietlacza  'tu wszystko zależnie od tego gdzie i co masz podłaczone
    case 2
     ..itd
 
  End Select
Return

Pisałeś że masz tych kodów wiecej więc nie będę sie rozpisywał

Czasem potrzebne są zmienne pomocnicze bo nie można zbyt wiele działań wykonywać w jednej linii.
Na przykład trzeba czasem odczytać wartość z tablicy do zmiennej i dopiero nią ustawiać wyświetlacze. to się tyczy wielu innych przeliczeń.
Nie można dzielić Word przez Byte. Trzeba je najpierw sprowadzić do tego samego typu.

Dim Zmienna1 As Word
Dim Zmienna2 As Byte
Dim Pomocnicza As Word
 
 Zmienna1 / Zmienna2 = Prawdopodobnie zły wynik
 
 Pomocnicza = Zmienna2
 Zmienna1 / Pomocnicza = Wynik będzie poprawny
 
 'Podobnie pomocniczych możesz użyć do odczytu danych z tablicy
 
  Help_byte = Cyfra(numer_wyswietlacza)
  Port_wyswietlaczy = Lookup(Help_byte ,Liczby) 'pozbyłeś się drugiego nawiasu

-

BARTek
Moja strona

Portret użytkownika Tomasz0723

Odp. [Bascom] Atmega8 prosty zegar LED

Witam i serdecznie dziękuję za pomoc właśnie o takie coś mi chodziło prosto i na temat, teraz już wiem co z czym i gdzie połączyć :)

Portret użytkownika gosc

Witam, też chciałbym to

Witam, też chciałbym to ogarnąć, ale mi nie idzie... ;)
Tomasz0723 czy mógłbyś mi podesłać jakiś przykład działającego programu na którym mógłbym się nieco oprzeć przy pisaniu swojego?

Portret użytkownika EDC

Odp. [Bascom] Atmega8 prosty zegar LED

Zaloguj się i wrzuć schemat to Ci go oprogramuję z opisem co, jak i dlaczego i od razu będzie działać z Twoim sprzętem, wiec będziesz miał okazję potestować.

-

BARTek
Moja strona