Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[attiny2313] [bascom] Uniwersalny układ czasowy

12 May 2009 20:37 2080 6
  • #1
    User removed account
    User removed account  
  • #2
    wader_669
    Level 28  
    hmmm.... hahahaha ale masakra. Kod jest totalnie do d**y.
    1 blad pusta petla
    szkoda wymieniac bo jest ich troche.

    Poczytaj lepiej helpa, zrozum wszystkie funkcje jakie uzyles.

    (jeszcze dodam, ze sam pisalem tak samo kiepskie kody i nawet jeszcze gdzies strasza na elektrodzie)
  • #3
    User removed account
    User removed account  
  • #4
    Dr.Vee
    VIP Meritorious for electroda.pl
    Oczywiście, że pomieszałeś, bo pod PD3 jednocześnie masz podłączone sterowanie anodą wyświetlacza i przycisk - jak wciśniesz przycisk, to odpowiednia cyfra wyświetlacza będzie zawsze aktywna...

    Użyj Timer1 w trybie CTC do odmierzania 0.01s - przy F_CPU = 1MHz chcesz mieć przerwanie z f=100Hz czyli odliczasz do 10000-1. To będzie za mała częstotliwość do wysterowania 4 wyświetlaczy, bo wyjdzie Ci odświeżanie całości z f = 25Hz. Możesz użyć Timer0 do generacji f multipleksowania i w tym przerwaniu obsłużyć wyświetlacz.

    W pętli głównej czekasz na przerwanie od Timera0 i sprawdzasz stan przycisków uwzględniając drganie styków. Wykonujesz odpowiednie akcje, uruchamiasz/resetujesz/zatrzymujesz timer1 itd.

    Pozdrawiam,
    Dr.Vee
  • #5
    wader_669
    Level 28  
    prosze bardzo pobawilem sie troche i poprawilem troche kod nadal jest tam duzo zle, ale nie napisze go calego za ciebie

    Code:

    $regfile = "attiny2313.dat"
    $crystal = 1000000


    Dim Sekundy As Byte , Sekundydzies As Byte , Minuty As Byte , Setnesekundy As Byte
    Dim 1s As Byte , Wyborled As Byte , Licznik As Bit

    Declare Sub Stoper
    Declare Sub Tajmer
    Declare Sub Zerowanie

    Config Portb = 255
    Portb = &B11111111

    Config Portd = &B1110000
    Portd = &B1111111

    Config Timer0 = Timer , Prescale = 64
    On Timer0 Przerwanie
    Enable Interrupts
    Enable Timer0
    Sekundy = 0
    Sekundydzies = 0
    Minuty = 0
    Setnesekundy = 0



    Do

    If Pind.2 = 0 Then
       Waitms 45
          If Pind.2 = 0 Then
          Call Stoper
          End If
    Elseif Pind.2 = 1 Then
       Waitms 45
          If Pind.2 = 1 Then
          Call Zerowanie
          End If
    End If

    If Pind.3 = 0 Then
       Waitms 45
          If Pind.3 = 0 Then
          Call Tajmer
          End If
    Elseif Pind.3 = 1 Then
       Waitms 45
          If Pind.3 = 1 Then
          Call Zerowanie
          End If
    End If

    Loop
    End


    Sub Tajmer
    If Pind.0 = 0 Then Licznik = 1       'S1 nacisniety -> start
    If Pind.1 = 0 Then Licznik = 0       'S2 nacisniety -> stop

    If Licznik = 1 Then
       Incr 1s
       If 1s = 255 Then
          1s = 0             'metoda prob i bledow, zwiekszanie licznika co 1s
          Decr Setnesekundy
          If Setnesekundy = 255 Then
             Setnesekundy = 9
             Decr Sekundy
             If Sekundy = 255 Then
             Sekundy = 9
             Decr Sekundydzies
             If Sekundydzies = 255 Then
                Sekundydzies = 5
                Decr Minuty
                   If Minuty = 255 Then
                      Minuty = 9
                End If       '9 minut i 59 sekund
          End If
          End If
       End If
       End If
    End If

    End Sub

    Sub Stoper
    If Pind.0 = 0 Then Licznik = 1       'S1 nacisniety -> start
    If Pind.1 = 0 Then Licznik = 0                              'S2 nacisniety -> stop
    End Sub


    Sub Zerowanie

    Zerowanie:
    Sekundy = 0
    Sekundydzies = 0
    Minuty = 0
    Setnesekundy = 0

    End Sub


    Przerwanie:
    Timer0 = 6
    Incr Wyborled
    If Wyborled = 4 Then Wyborled = 0       'cykl: 0...3
    Portd = &B1111111        ' led wylaczone
    Select Case Wyborled
    Case 0:
       Portb = Lookup(setnesekundy , Tabela)
       Portd.3 = 0
    Case 1:
       Portb = Lookup(sekundy , Tabela)
       Portd.4 = 0
       Portb.7 = 0
    Case 2:
       Portb = Lookup(sekundydzies , Tabela)
       Portd.5 = 0
    Case 3:
       Portb = Lookup(minuty , Tabela)
       Portb.7 = 0
       Portd.6 = 0
    End Select

    Return


    Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144


    a to ze wczesniejszy kod ci dziala to moim zdaniem cud.

    Tak jak mowie ten nie jest caly poprawiony, ale jak zrozumiesz co i dlaczego zmienilem. to sobie napewno pozniej poradzisz.

    Dodano po 2 [minuty]:

    A w sumie nie poprawilem go calego bo jest mi do konca nie zrozumiale jak ten kod ma dzialac. Dlatego skoncentruj sie jak zrobilem suby dlaczego, co jest w petli glownej, dlaczego w przyciskach jest 2 razy if i wait, dlaczego jest elseif itd.
  • #6
    User removed account
    User removed account  
  • #7
    wader_669
    Level 28  
    waita i drugie ifa sie wstawia po to by ten czas przeczekac, kiedy wcisniesz przycisk i sa wachania. Wiec czeka i pozniej jeszcze raz sprawdza czy nadal jest taki stan jak wczesniej i dopiero wtedy wykonuje instrukcje.

    Jeszcze jedno info:
    w pind.3 mozesz uzyc elseif .