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

[attiny2313] [bascom] Uniwersalny układ czasowy

12 Maj 2009 20:37 2182 6
REKLAMA
  • #1 6522257
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #2 6522369
    wader_669
    Poziom 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)
  • REKLAMA
  • #3 6522482
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #4 6523293
    Dr.Vee
    VIP Zasłużony dla elektroda
    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
  • REKLAMA
  • #5 6523301
    wader_669
    Poziom 28  
    prosze bardzo pobawilem sie troche i poprawilem troche kod nadal jest tam duzo zle, ale nie napisze go calego za ciebie

    
    $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 6523378
    Konto nie istnieje
    Konto nie istnieje  
  • #7 6523467
    wader_669
    Poziom 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 .
REKLAMA