logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[BASCOM]Pomoc w napisaniu programu - Zegar LCD Attiny2313

Krykkk 20 Sie 2007 11:49 4416 11
REKLAMA
  • #1 4196086
    Krykkk
    Poziom 13  
    Posty: 101
    Pomógł: 2
    Ocena: 6
    Jest to bardzo prosty program dla zegara, choć nie za bardzo dokładny.
    Proszę o pomoc w ulepszeniu kodu tak aby był bardziej dokładny, chodzi mi tu o użycie timerów .
    Jestem początkujący wiec proszę o odpowiedź.

    
    $regfile = "attiny2313.dat"
    $crystal = 4000000
    Config Portd = &B1111100                                    'dwa najmłodsze bity portu D jako wejścia
    Portd = &B1111111                                           'stan spoczynkowy portu D 1
    Config Portb = &B11111111                                   'port B jako wyjścia
    Portb = &B11111111
    
    Config Lcd = 16 * 1a                                        'konfiguracja wyświetlacza
    'piny ustawione w zakładce : Options-Compliler-LCD
    
    Dim G As Byte                                               'konfiguracja zmiennych
    Dim M As Byte
    Dim S As Byte
    
    G = 0
    M = 0
    S = 0
    
    Cls
    Cursor Off
    
    Lcd "zegarek "                                              'tylko przy włączaniu
    Lowerline
    Lcd "by Krys "
    
    Do                                                          'pętelka
    
    Wait 1
    Incr S
    If S = 59 Then
    S = 0
    Incr M
    End If
    
    If M = 59 Then
    M = 0
    Incr G
    End If
    
    If Pind.1 = 0 Then                                          'ustawianie godzin
    Incr G
    End If
    
    If Pind.0 = 0 Then                                          'ustawianie minut
    Incr M
    End If
    
    
    Cls                                                         'wyświetlanie czasu
    Cursor Off
    Lcd "zegarek "
    Lowerline
    Lcd G ; ":" ; M ; ":" ; S
    
    
    If G = 12 Then                                              'zerowanie
    S = 0
    M = 0
    G = 0
    End If
    Loop
    
    End
    
  • REKLAMA
  • #2 4196739
    Nostradamus
    Poziom 17  
    Posty: 233
    Pomógł: 14
    Ocena: 4
    
    $regfile = "attiny2313.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
    Config Timer0 = Timer , Prescale = 256
    Config Pind.0 = Input
    Config Pind.1 = Input
    Set Portd.0
    Set Portd.1
    Dim G As Byte                                               'konfiguracja zmiennych
    Dim M As Byte
    Dim S As Byte
    Dim Licz_8ms As Byte
    
    On Timer0 Odmierz_1s
    Enable Interrupts
    Enable Timer0
    Load Timer0 = 250
    
    
    G = 0
    M = 0
    S = 0
    
    Cls
    Cursor Off
    
    Lcd "ZEGAREK "                                              'tylko przy włączaniu
    Lowerline
    Lcd "by Krys "
    Wait 1
    
    Do
    If G < 10 Then
       If S < 10 Then
          If M < 10 Then
             Cls
             Locate 1 , 1
             Lcd "ZEGAREK"
             Locate 2 , 1
             Lcd "0" ; G ; ":" ; "0" ; M ; ":" ; "0" ; S
             Waitms 100
          End If
          If M > 9 Then
             Cls
             Locate 1 , 1
             Lcd "ZEGAREK"
             Locate 2 , 1
             Lcd "0" ; G ; ":" ; M ; ":" ; "0" ; S
             Waitms 100
          End If
       Else
          If M < 10 Then
             Cls
             Locate 1 , 1
             Lcd "ZEGAREK"
             Locate 2 , 1
             Lcd "0" ; G ; ":" ; "0" ; M ; ":" ; S
             Waitms 100
          End If
          If M > 9 Then
             Cls
             Locate 1 , 1
             Lcd "ZEGAREK"
             Locate 2 , 1
             Lcd "0" ; G ; ":" ; M ; ":" ; S
             Waitms 100
          End If
       End If
    Else
       If S < 10 Then
          If M < 10 Then
             Cls
             Locate 1 , 1
             Lcd "ZEGAREK"
             Locate 2 , 1
             Lcd G ; ":" ; "0" ; M ; ":" ; "0" ; S
             Waitms 100
          End If
          If M > 9 Then
             Cls
             Locate 1 , 1
             Lcd "ZEGAREK"
             Locate 2 , 1
             Lcd G ; ":" ; M ; ":" ; "0" ; S
             Waitms 100
          End If
       Else
          If M < 10 Then
             Cls
             Locate 1 , 1
             Lcd "ZEGAREK"
             Locate 2 , 1
             Lcd G ; ":" ; "0" ; M ; ":" ; S
             Waitms 100
          End If
          If M > 9 Then
             Cls
             Locate 1 , 1
             Lcd "ZEGAREK"
             Locate 2 , 1
             Lcd G ; ":" ; M ; ":" ; S
             Waitms 100
          End If
       End If
    End If
    
    If Pind.1 = 0 Then                                          'ustawianie godzin
       Waitms 25
       If Pind.1 = 0 Then
          Incr G
       End If
    End If
    
    If Pind.0 = 0 Then                                          'ustawianie minut
       Waitms 25
       If Pind.0 = 0 Then
          Incr M
       End If
    End If
    
    If S = 60 Then
    S = 0
    Incr M
    End If
    
    If M = 60 Then
    M = 0
    Incr G
    End If
    
    If G = 24 Then                                              'zerowanie
    S = 0
    M = 0
    G = 0
    End If
    Loop
    
    End
    
    Odmierz_1s:
       Load Timer0 = 250
       Incr Licz_8ms
       If Licz_8ms = 125 Then
          Licz_8ms = 0
          Incr S
       End If
    Return



    to mnie więcej tak by wyglądało.

    Dodano po 1 [minuty]:

    najlepiej jak byś podłączył zewnętrzny rezonator- będzie bardziej dokładny
  • REKLAMA
  • #3 4197045
    Krykkk
    Poziom 13  
    Posty: 101
    Pomógł: 2
    Ocena: 6
    Gdy załaduję ten program do procka to wyświetlacz robi się czarny. A gdy załaduje ten co sam napisałem to jest ok.
    Dlaczego nie che się nic wyświetlać?
  • #4 4197169
    Nostradamus
    Poziom 17  
    Posty: 233
    Pomógł: 14
    Ocena: 4
    bo zobacz sobie jak mam podpięty LCD. On jest skonfigurowany w programie a nie w opcjach Bascoma. Podłącz sobie tak jak ja mam w programie.
  • #5 4197453
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Nostradamus napisał:
    bo zobacz sobie jak mam podpięty LCD. On jest skonfigurowany w programie a nie w opcjach Bascoma. Podłącz sobie tak jak ja mam w programie.

    Przecież łatwiej zmienić przypisanie pinów kodzie , niż robić to lutownicą.
    A teraz , przyczepie się do Twojego kodu ;)
    Jest to typowy przykład , jak nie należy pisać programów w Basicu(Bascomie) i świadczy tylko , o Twojej nieznajomości tegoż narzędzia :(
    Przykro mi
    Piotrek
  • #6 4197511
    Nostradamus
    Poziom 17  
    Posty: 233
    Pomógł: 14
    Ocena: 4
    no jak się szybko pisze to tak jest, ale ważne że działa. Po 2 chciałem żeby jak najmniej ingerowac w program tegoż Pana. Mozna dać w przerwaniu od Timera żeby zwiększało sekundy, minuty i godziny. Tak sie powinno dać ale zrobiłem to na szybko.

    Mniej więcej tak by to wyglądało:
    
    $regfile = "attiny2313.dat"
    $crystal = 8000000
    Config Pind.0 = Input
    Config Pind.1 = Input
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
    Config Timer1 = Timer , Prescale = 256
    Declare Sub Czas
    On Timer1 Odmierz_1s
    Dim Sekunda As Byte
    Dim Minuta As Byte
    Dim Godzina As Byte
    Dim Nowa As Bit
    Dim Wart As Byte
    S2 Alias Pind.0
    S1 Alias Pind.1
    Enable Interrupts
    Enable Timer1
    Set Nowa
    Set Portd.0
    Set Portd.1
    
    Do
    
    Call Czas
    
    If S1 = 0 Then
       Waitms 25
       If S1 = 0 Then
          Incr Minuta
          Sekunda = 0
          If Minuta = 60 Then
             Minuta = 0
          End If
          Set Nowa
          Call Czas
          Waitms 100
       End If
    End If
    If S2 = 0 Then
       Waitms 25
       If S2 = 0 Then
          Incr Godzina
          If Godzina = 24 Then
             Godzina = 0
          End If
          Set Nowa
          Call Czas
          Waitms 100
       End If
    End If
    Loop
    End
    
    Sub Czas
       If Nowa = 1 Then
       Cls
       Wart = Makebcd(godzina)
       Lcd Bcd(wart) ; ":"
       Wart = Makebcd(minuta)
       Lcd Bcd(wart) ; ":"
       Wart = Makebcd(sekunda)
       Lcd Bcd(wart);
       Reset Nowa
       End If
    End Sub
    
    Odmierz_1s:
       Counter1 = Counter1 + 34286
       Incr Sekunda
       Set Nowa
       If Sekunda = 60 Then
          Sekunda = 0
          Incr Minuta
             If Minuta = 60 Then
                Minuta = 0
                Incr Godzina
                If Godzina = 24 Then
                   Godzina = 0
                End If
             End If
       End If
    Return
    
  • REKLAMA
  • #7 4197691
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Nostradamus napisał:
    no jak się szybko pisze to tak jest...

    Co znaczy szybko :?: To szybciej się napisze 73 linie w kodzie , od powiedzmy ... 10. Mi chodzi o sposób , w jaki formatujesz dane do wyświetlenia na LCD , bo jest to po prostu ... straszne ;)
    Nabierajmy dobrych nawyków :D

    Piotrek

    EDIT

    Nie trzeba było tak od razu ;)
  • #8 4225057
    Krykkk
    Poziom 13  
    Posty: 101
    Pomógł: 2
    Ocena: 6
    Dzięki wszystkim za chęci ,
    ale ktoś kilka dni temu ukradł mi płytkę testową wraz z wyświetlaczem LCD. :cry:
  • #9 4305880
    jacynka84
    Poziom 26  
    Posty: 1170
    Pomógł: 13
    Ocena: 29
    Jak to ukradł - w domu? czy może na uczelni czy coś?
    lCD 15zł , płytka dwustronna 4zł , Atmega32 13zł , kwarce 11059200 i
    zegarkowy jakieś 2zł , LM7805 1.50zł , gniazdko na zasilanie jakieś 1zł ,
    paczka 13zł = ok 55zł na wyrost , i masz podstawę do budowy zegarka ,
    jak i różnego testowania prostych programów z LCD.
    Zakładam że masz jakieś trafko małe i prostownik do zasilania.
    Policzyłem wg cen z seguro - wybaczcie za reklamę.
  • REKLAMA
  • #10 4307683
    Krykkk
    Poziom 13  
    Posty: 101
    Pomógł: 2
    Ocena: 6
    Normalnie zrobiłem sobie układzik i leżał na półce był wgrany program który po naciśnięciu zwiększał licznik i wyświetlał wartość na LCD.
    Pojechałem na dwa dni do rodziny , przyjeżdżam i po układzie ani widu ani słychu a na nowy nie mam ani kasy ani chęci.
  • #11 4309679
    jacynka84
    Poziom 26  
    Posty: 1170
    Pomógł: 13
    Ocena: 29
    Szkoda że tak łatwo się zniechęcasz.
    Ja mam taki problem z zegarkiem , że po podłączeniu kwarcu zegarkowego do XTAL w atmega8 zaczął chodzić dokładnie ...tylko 2 razy wolniej.
    Wie ktoś jak to naprawić ??

    Już wiem co jest nie tak chyba.
    Timer1 jest 16-bitowy >liczy do 65536 potem następuje przepełnienie.
    A kwarc zegarkowy "liczy" do połowy tego(32.768Khz).
    Chyba na tym polegał problem.
    Ale już sobie zrobiłem innym sposobem.

    Tu część kodu niezbędna do wyliczenia sekundy na kwarcu 11059200:
     
    $crystal = 11059200
    
     #if _xtal < 4000000
       Const Presc = 64
    #else
       Const Presc = 256
    #endif
    
    Const Maxval = _xtal / Presc -1 
    
    On Oc1a Sekunda
    Enable Oc1a
    Enable Interrupts 
    
    Pwm1a = Maxval
    
    #if Presc = 64
       Tccr1b = &B00001011
    #else
       Tccr1b = &B00001100
    #endif 
    
    Sekunda:
    Incr Sekunda
    Return
    


    No i do tego trzeba sobie już tylko dopisać kod samego zegarka.
    Uwaga! Jest to fragment kodu zdaje się kolegi Zumek z naszego forum - nie mój , podał go jak ja budowałem zegarek :)

    A ty Krykkk za bardzo roztrząsnąłeś ten kod :)
    Muszę nieskromnie powiedzieć że ja swój napisałem w prostszy sposób.
    Mam zegarek i budzik oraz 4 przyciski + przycisk dźwigniowy do włączenia funkcji budzika.
  • #12 4369452
    robolupo
    Poziom 12  
    Posty: 35
    Pomógł: 1
    Ocena: 5
    Witam. Może ktoś udostępnić schemat takiego zegarka? Żebym wiedział o co się zaczepić, od czego zacząć. Przeszukałem na forum mnóstwo postów , ale w każdym z tematów na pytanie "a jak to zrobić fizycznie?(schemat układu)" ktoś pisał "przejrzyj forum", bo wszyscy są już raczej na etapie zaawansowanym. I tak w koło... Znalazłem na różnych stronach kilka tego typu rzeczy - tutaj najlepszy chyba piórnik (polecam, niezłe) , ale im więcej przykładów tym lepiej - dobrze wiedzieć jak można to zrobić inaczej. Z góry dziękuję za odpowiedzi i przepraszam za męczenie, ale naprawdę schematów na forum jest jak na lekarstwo. Pozdrawiam.

Podsumowanie tematu

✨ Dyskusja dotyczy poprawy dokładności prostego zegara LCD opartego na mikrokontrolerze Attiny2313 i języku BASCOM. Głównym problemem jest niedokładność pomiaru czasu, którą użytkownik chce rozwiązać poprzez wykorzystanie timerów. W odpowiedziach zaproponowano konfigurację timerów (Timer0, Timer1) z preskalerem oraz obsługę przerwań do precyzyjnego odmierzania sekund, minut i godzin. Podkreślono konieczność prawidłowej konfiguracji pinów LCD w kodzie zamiast w opcjach BASCOM, co wpływa na poprawne wyświetlanie danych. Zwrócono uwagę na dobre praktyki programistyczne w BASCOM, w tym czytelne formatowanie wyświetlanych danych. Wskazano także na problemy z użyciem kwarcu zegarkowego 32.768 kHz w mikrokontrolerach 8-bitowych i konieczność odpowiedniego ustawienia timerów 16-bitowych. Zaprezentowano fragmenty kodu z wykorzystaniem przerwań i konfiguracji timerów dla różnych częstotliwości kryształu (4 MHz, 8 MHz, 11.0592 MHz). Wątek uzupełniono dyskusją o schematach układów zegarów LCD oraz kosztach komponentów do budowy prostego zegarka. Autor zgłosił również problem z kradzieżą płytki testowej, co wpłynęło na dalsze prace.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA