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] Zwiększanie szybkości włączania diody

xamrex 10 Paź 2010 17:31 1371 3
REKLAMA
  • #1 8604035
    xamrex
    Poziom 28  
    Witam,
    Podłączyłem sobie Wyświetlacz LED 7-segmentowy do mojego procka.
    I program wyświetla z 0,5sek opóźnieniem kolejne cyfry.

    Chciałbym aby gdy Pind.0 przyjmie wartość 0 (jeśli zewrze go z masą), cyfry szybciej się zmieniały (np. co 0,3sek)

    napisałem coś takiego:
    
    
    $regfile = "attiny2313.dat"                                 'najpierw określamy typ proca
    $crystal = 1000000
    Config Portb = Output                                       ' ustawienie całego Portu B jako wyjscia
           Portb = &B11111111                                   ' stan spoczynkowy wszystkich wyjsć ustawiony na 1
    Config Portd = Input
           Portd = &B1111111                                    ' stan spoczynkowy wszystkich bitów ustawiony na 1
    
    Dim Czas As Integer
    Czas = 500
    
    Do
    If Pind.0 = 0 then
    Czas = Czas - 200
    End If
    Gosub Zero
    Waitms Czas
    Gosub Jeden
    Waitms Czas
    Gosub Dwa
    Waitms Czas
    Gosub Trzy
    Waitms Czas
    Gosub Cztery
    Waitms Czas
    Gosub Piec
    Waitms Czas
    Gosub Szesc
    Waitms Czas
    Gosub Siedem
    Waitms Czas
    Gosub Osiem
    Waitms Czas
    Gosub Dziewiec
    Waitms Czas
    Loop
    
    End
    'Cyferki
    Zero:
    Portb = &B11000000
    Return
    
    Jeden:
    Portb = &B11111001
    Return
    
    Dwa:
    Portb = &B10100100
    Return
    
    Trzy:
    Portb = &B10110000
    Return
    
    Cztery:
    Portb = &B10011001
    Return
    
    Piec:
    Portb = &B10010010
    Return
    
    Szesc:
    Portb = &B10000010
    Return
    
    Siedem:
    Portb = &B11111000
    Return
    
    Osiem:
    Portb = &B10000000
    Return
    
    Dziewiec:
    Portb = &B10010000
    Return
    


    Ale jak widać jeśli Pind.0 zewrze z masą na chwilkę przy np. cyfrze 4, to nic się nie stanie, gdyż program leci w dół, a dopiero na samej gorzę (czyli po cyfrze 9) sprawdza czy nie jest Pind.0 zwarty z masą,
    Więc teraz jeśli chcę, aby cyfry szybciej przeskakiwały, to muszę mieć pind.0 zwarty w czasie kiedy liczba 9, zamienia się na 0

    Chcę zrobić tak, żeby szybkość zmiany diody była płynna (żebym w dowolnym momencie jeśli zewerzę pind.0 do masy prędkość wyświetlania liczb się zmieniła)
    W jaki sposób to zrobić?


    //Wiem, że mogę dać ten warunek
    If Pind.0 = 0 then
    Czas = Czas - 200
    End If
    po każdym
    , ale i tak to nie będzie płynne...
    Jak udoskonalić ten kod?
  • REKLAMA
  • #2 8604238
    gregoorr
    Poziom 17  
    Po co Ci tyle tych gosub. W jednej linijce możesz pobierać kody dla wyświetlacza i wyświetlić. Coś około tego:

    
    Sprawdzić przycisk
    
    Call Pobr_znaku(a)
    
    Tu wyświetlić 
    poczekać 200 lub 500
    zwiększyć a o 1
    koniec pętli.
    
    
    Kody7seg:
    
    Data &B11000000 , &B11111001 , &B10100100 , &B10110000 , &B10011001,
    Data &B10010010 , &B10000010 , &B11111000 , &B10000000 , &B10010000
  • REKLAMA
  • #3 8609797
    Konto nie istnieje
    Poziom 1  
  • #4 8609948
    xamrex
    Poziom 28  
    Emarcus, widzę, że wiesz o co mi chodzi....
    Właśnie gdy użyje waitms, to tak choćby "zablokuję procesor" i wtedy gdy procesor odlicza np. te 0,5 sek i ja zewrzę pind.0 do masy to się nic nie stanie.

    Chcę aby na początku była wyświetlona cyfra 0, po 0,5 sekudzie cyfra 1 , po następnej 0,5 sekundy cyfra 2 itd..

    A jeśli zewrze pind.2 (bo tam jest INT) do masy, to chcę aby prędkość zmiany cyfr rosła,
    Czyli, aby zmiana cyfry z 0 na 1 nie nastąpiła po upływie 0,5sek a po upływie 0,45 sek..

    Zrobiłem już coś takiego:
    
    
    $regfile = "attiny2313.dat"                                 'najpierw określamy typ proca
    $crystal = 1000000
    Config Portb = Output                                       ' ustawienie całego Portu B jako wyjscia
           Portb = &B11111111                                   ' stan spoczynkowy wszystkich wyjsć ustawiony na 1
    Config Portd = Input
           Portd = &B1111111                                    ' stan spoczynkowy wszystkich bitów ustawiony na 1
    
    Dim Czas As Integer
    Czas = 500
    
    On Int0 Czas
    Enable Interrupts
    Enable Int0
    
    Do
    
    Gosub Zero
    Waitms Czas
    Gosub Jeden
    Waitms Czas
    Gosub Dwa
    Waitms Czas
    Gosub Trzy
    Waitms Czas
    Gosub Cztery
    Waitms Czas
    Gosub Piec
    Waitms Czas
    Gosub Szesc
    Waitms Czas
    Gosub Siedem
    Waitms Czas
    Gosub Osiem
    Waitms Czas
    Gosub Dziewiec
    Waitms Czas
    Loop
    
    
    
    
    Czas:                                                       ' jesli INT0 zewrze do masy wykonuje sie to:
    If Czas > 80 Then                                           ' zablokowanie mniejszej szybkosci ni 80ms gdyz jesli jest ponizej 80ms nie widac ze zmieniaja sie liczby
    Czas = Czas - 1                                             ' gdy INT0 jest zwarty maleje czas o 1ms
    Waitms 10
    End If
    Return
    End
    
    
    'Cyferki
    Zero:
    Portb = &B11000000
    Return
    
    Jeden:
    Portb = &B11111001
    Return
    
    Dwa:
    Portb = &B10100100
    Return
    
    Trzy:
    Portb = &B10110000
    Return
    
    Cztery:
    Portb = &B10011001
    Return
    
    Piec:
    Portb = &B10010010
    Return
    
    Szesc:
    Portb = &B10000010
    Return
    
    Siedem:
    Portb = &B11111000
    Return
    
    Osiem:
    Portb = &B10000000
    Return
    
    Dziewiec:
    Portb = &B10010000
    Return
    


    Już jest prawie cacy...
    Opisze jak to działa..
    Lecą sobie cyferki z 0,5sek opóźnieniem...
    Gdy zewrze INT0 do masy to na wyświetlaczu zatrzymuje się jakaś cyfra, i gdy puszczę INT0, to leci od tej samej cyfry na której się zatrzymało tyle, że szybciej..

    Niby cacy, ale chciałbym, że jeśli zewrze INT0 do masy, to aby cyferki dalej leciały (szybciej), a nie się zatrzymywały..

    Dam film, aby było wiadomo o co mi chodzi:


REKLAMA