Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[BASCOM]Pomoc w napisaniu programu - Zegar LCD Attiny2313

Krykkk 20 Aug 2007 11:49 4290 11
  • #1
    Krykkk
    Level 13  
    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
    
  • #2
    Nostradamus
    Level 17  
    
    $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
  • #3
    Krykkk
    Level 13  
    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
    Nostradamus
    Level 17  
    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
    zumek
    Level 39  
    Nostradamus wrote:
    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
    Nostradamus
    Level 17  
    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
    
  • #7
    zumek
    Level 39  
    Nostradamus wrote:
    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
    Krykkk
    Level 13  
    Dzięki wszystkim za chęci ,
    ale ktoś kilka dni temu ukradł mi płytkę testową wraz z wyświetlaczem LCD. :cry:
  • #9
    jacynka84
    Level 26  
    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ę.
  • #10
    Krykkk
    Level 13  
    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
    jacynka84
    Level 26  
    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
    robolupo
    Level 12  
    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.