Elektroda.pl
Elektroda.pl
X
Mitronik
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Zegar a multiplexowy 7 segmentowy wyświetlacz LED

shadowman83 23 Lut 2010 23:26 2691 2
  • #1 23 Lut 2010 23:26
    shadowman83
    Poziom 10  

    Witam, dopiero zaczyna zabawę z mikro-kontrolerami i mam problem

    O tyle o ile nie mam problemu z napisaniem programu zegaru opartego o wysw. LCD czy to na Timerach czy też opartego o kwarc zegarkowy.

    To Z wyświetlaczem 7seg LED mam problem nie do rozgryzienia

    Widziałem, ściągnąłem i próbowałem stworzyć coś z projektów na elektrodzie ale
    nic mi nie wychodzi zresztą nawet jak się poszuka za pomocą opcji szukaj to i tak
    wyskakuje raptem parę tylko tematów.

    Ale do rzeczy...

    Proszę kolegów o pomoc i wyrozumiałość

    Czy ktoś ma napisany prosty program (BASCOM), do obsługi prostego zegarka led 7seg cztery cyfry bez sekundnika i innych udziwnień jak daty itd. najlepiej na Atmege16 ale inne też biorę pod uwagę

    Sam zegarek

    Jeśli ktoś zechce się podzielić swoim projektem i pomóc mnie i ewentualnie innym to z góry dziękuję

    0 2
  • Mitronik
  • #2 24 Lut 2010 00:44
    marco47
    Poziom 41  

    Chyba ciężko będzie znaleźć gotowy kod dla zegara na LED'ach .
    Zresztą to nie jest takie trudne , jeżeli miałeś już styczność ( napisałeś kod ) z zegarem na LCD .
    Jest naprawdę dużo literatury na ten temat , nie tylko na elektrodzie .

    0
  • Mitronik
  • #3 24 Lut 2010 12:22
    shadowman83
    Poziom 10  

    Mam Taki zegarek na LCD oparty o Timer1:

    Code:
    $regfile = "m16def.dat"
    
    $crystal = 16000000

    Config Portb = Output
    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pb.2 , Db5 = Pb.3 , Db6 = Pb.4 , Db7 = Pb.5 , E = Pb.1 , Rs = Pb.0
    Cursor Off
    Cls

    Config Timer1 = Timer , Prescale = 256
    Declare Sub Wysw_czas


    On Timer1 Odmierz_1s

    Dim S As Byte : Dim M As Byte : Dim G As Byte
    Dim Nowa_w As Bit
    Dim Wart_bcd As Byte

    'Dim X As Byte

    'Dim Wart As Byte

    S1 Alias Pind.6
    S2 Alias Pind.7

    Enable Interrupts


    Enable Timer1
    Counter1 = 3036

    Set Nowa_w

    Set Portd.6
    Set Portd.7


    Do

    Call Wysw_czas
       If S1 = 0 Then
       Waitms 25

       If S1 = 0 Then
       Incr M
       S = 0
       If M = 60 Then
       M = 0
       End If
       Set Nowa_w

       Call Wysw_czas
       Waitms 200

       End If
    End If

       If S2 = 0 Then
       Waitms 25

       If S2 = 0 Then
       Incr G
       If G = 24 Then
       G = 0
       End If
       Set Nowa_w

       Call Wysw_czas
       Waitms 200

       End If
    End If

    Loop

    End

    Sub Wysw_czas

       If Nowa_w = 1 Then

       Wart_bcd = Makebcd(g)
       Locate 1 , 1
       Lcd Bcd(wart_bcd) ; ":"

       Wart_bcd = Makebcd(m)
       Locate 1 , 4
       Lcd Bcd(wart_bcd) ; ":"
                                                          'end program
       Wart_bcd = Makebcd(s)
       Locate 1 , 7
       Lcd Bcd(wart_bcd) ;

       Reset Nowa_w
       End If

    End Sub



    Odmierz_1s:

    Counter1 = Counter1 + 3036

    Incr S

    Set Nowa_w

       If S = 60 Then
       S = 0

       Incr M
       If M = 60 Then
       M = 0

       Incr G
       If G = 24 Then
       G = 0

       End If
       End If
    End If


    Return


    Oraz program sterujący wyświetlaczami

    Code:
    $regfile = "m16def.dat"
    




    $crystal = 16000000

    Config Portc = Output
    Config Pina.1 = Output
    Config Pina.2 = Output
    Config Pina.3 = Output
    Config Pina.4 = Output
    Config Timer0 = Timer , Prescale = 256
    Declare Sub Pobr_znaku(cyfra As Byte)


    On Timer0 Mult_wysw

    Dim A As Byte
    Dim B As Byte
    Dim C As Byte
    Dim D As Byte

    'Dim X As Byte

    'Dim Wart As Byte
    Dim Nr_wysw As Byte

    W1 Alias Porta.4
    W2 Alias Porta.3
    W3 Alias Porta.2
    W4 Alias Porta.1


    Enable Interrupts

    Enable Timer0
    Load Timer0 , 125

    A = 1
    B = 9
    C = 8
    D = 3

    Do


    Loop

    End




    Sub Pobr_znaku(cyfra As Byte)
    Portc = Lookup(cyfra , Kody7seg)
    End Sub


    Mult_wysw:

    Load Timer0 , 150
    Set W1
    Set W2
    Set W3
    Set W4


    Select Case Nr_wysw

    Case 0:
    Call Pobr_znaku(a)
    Reset W1


    Case 1:
    Call Pobr_znaku(b)
    Reset W2

    Case 2:
    Call Pobr_znaku(c)
    Reset W3


    Case 3:
    Call Pobr_znaku(d)
    Reset W4

    End Select

    Incr Nr_wysw
    If Nr_wysw = 4 Then
    Nr_wysw = 0
    End If
    Return

    Kody7seg:
    Data &B00000011 , &B10011111 , &B00100101 , &B00001101 , &B10011001 ,
    Data &B01001001 , &B01000001 , &B00011111 , &B00000001 , &B00001001 ,


    Są to dwa oddzielne programy teraz jak te dwa programy zmieszać razem i zrobić z tego jeden.

    Trzeba jeszcze zmodyfikować program zegarka tak aby podstawiał odpowiednie liczby pod zmienne A,B,C,D.

    W programie do obsługi wys led zmienne A,B,C,D są teraz stałe tymczasowo.

    Dodano po 1 [godziny] 17 [minuty]:

    Udało mi się prubowałem zrobić tak żeby jednocześnie wyświetlał na LCD i na LED o tyle o ile na LED już działa o co mi chodziło to o tyle na LCD po zmieszaniu tych obu programów jest jeden błąd.

    Mianowicie na LCD wyświetla jest godzina np. 05:10:45 po czym wskakuje na 2 sek. 00:00:00
    i nastepnie pokazuje 05:10:48 czym jest spowodowany ten błąd i jak go naprawić?

    Code:
    $regfile = "m16def.dat"
    
    $crystal = 16000000

    Config Portb = Output
    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pb.2 , Db5 = Pb.3 , Db6 = Pb.4 , Db7 = Pb.5 , E = Pb.1 , Rs = Pb.0
    Cursor Off
    Cls

    Config Portc = Output
    Config Pina.1 = Output
    Config Pina.2 = Output
    Config Pina.3 = Output
    Config Pina.4 = Output
    Config Timer0 = Timer , Prescale = 256
    Declare Sub Pobr_znaku(cyfra As Byte)
    Config Timer1 = Timer , Prescale = 256
    Declare Sub Wysw_czas


    On Timer0 Mult_wysw
    On Timer1 Odmierz_1s

    Dim S As Byte : Dim M As Byte : Dim G As Byte
    Dim Nowa_w As Bit
    Dim Wart_bcd As Byte

    Dim A As Byte
    Dim B As Byte
    Dim C As Byte
    Dim D As Byte

    'Dim X As Byte

    'Dim Wart As Byte
    Dim Nr_wysw As Byte

    W1 Alias Porta.4
    W2 Alias Porta.3
    W3 Alias Porta.2
    W4 Alias Porta.1
    S1 Alias Pind.6
    S2 Alias Pind.7


    Enable Interrupts
    Enable Timer0
    Load Timer0 , 125

    Enable Timer1
    Counter1 = 3036

    Set Nowa_w

    Set Portd.6
    Set Portd.7


    Do
    Call Wysw_czas
       If S1 = 0 Then
       Waitms 25

       If S1 = 0 Then
       Incr M
       S = 0
       If M = 60 Then
       M = 0
       End If
       Set Nowa_w

       Call Wysw_czas
       Waitms 200

       End If
    End If

       If S2 = 0 Then
       Waitms 25

       If S2 = 0 Then
       Incr G
       If G = 24 Then
       G = 0
       End If
       Set Nowa_w

       Call Wysw_czas
       Waitms 200

       End If
    End If

    A = G / 10
    B = G Mod 10
    C = M / 10
    D = M Mod 10


    Loop

    End

    Sub Wysw_czas

       If Nowa_w = 1 Then

       Wart_bcd = Makebcd(g)
       Locate 1 , 1
       Lcd Bcd(wart_bcd) ; ":"

       Wart_bcd = Makebcd(m)
       Locate 1 , 4
       Lcd Bcd(wart_bcd) ; ":"
                                                          'end program
       Wart_bcd = Makebcd(s)
       Locate 1 , 7
       Lcd Bcd(wart_bcd) ;

       Reset Nowa_w
       End If

    End Sub



    Odmierz_1s:

    Counter1 = Counter1 + 3036

    Incr S

    Set Nowa_w

       If S = 60 Then
       S = 0

       Incr M
       If M = 60 Then
       M = 0

       Incr G
       If G = 24 Then
       G = 0

       End If
       End If
    End If
    Return



    Sub Pobr_znaku(cyfra As Byte)
    Portc = Lookup(cyfra , Kody7seg)
    End Sub


    Mult_wysw:

    Load Timer0 , 150
    Set W1
    Set W2
    Set W3
    Set W4


    Select Case Nr_wysw

    Case 0:
    Call Pobr_znaku(a)
    Reset W1


    Case 1:
    Call Pobr_znaku(b)
    Reset W2

    Case 2:
    Call Pobr_znaku(c)
    Reset W3


    Case 3:
    Call Pobr_znaku(d)
    Reset W4

    End Select

    Incr Nr_wysw
    If Nr_wysw = 4 Then
    Nr_wysw = 0
    End If
    Return

    Kody7seg:
    Data &B00000011 , &B10011111 , &B00100101 , &B00001101 , &B10011001 ,
    Data &B01001001 , &B01000001 , &B00011111 , &B00000001 , &B00001001 ,


    Za pomoc z góry dzięki

    0