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

Jak używać waitms z przerwaniami w Bascom dla wyświetlacza LED?

JarekPrzybyl 28 Sie 2007 10:30 1715 4
REKLAMA
  • #1 4223561
    JarekPrzybyl
    Poziom 15  
    Posty: 422
    Pomógł: 3
    Ocena: 216
    Wybaczcie początkującemu, bo pytam zapewne o jakąś strasznie trywialną sprawę, ale póki co nie mogę sobie z nią poradzić, więc szukam pomocy.

    Piszę sobie cośtam. Cośtam ma multipleksowo obsługiwany wyświetlacz LED, multipleksowanie jest załatwiane podprogramem uruchamianym z przerwania od T0. Tyle napisałem i tu wszystko działa pięknie.
    Dalej, przed pisaniem reszty właściwego programu były zabawy samym wyświetlaniem i najprostszy pomysł: pętla odliczająca kolejne liczby i ich wyświetlanie. Popełniłem pętlę for-next, wewnątrz niej komenda wait 1 i było świetnie, tylko wolno. Zamieniłem więc oczywiście wait 1 na waitms 250. I dupa.
    Żeby nie przedłużać, wyszło mi, że o ile wait z działającym timerem wywołującym przerwanie działa dobrze, tak waitms całkowicie rozkłada działanie programu i to w dodatku w sposób dla mnie niezrozumiały. Z helpa wyczytałem, że przerwania "mogą znacznie wydłużyć czas odmierzany przez instrukcję waitms", ale to nie byłby problem, tak dobralbym po prostu wartość, żeby było dobrze. Tymczasem o ile przy wait miałem wyświetlacz pokazujący w kółko kolejne liczby od 000 do 255, tak przy użyciu waitms, w zasadzie niezależnie od wartości dalej wstawionej (próbowałem i z 50ms i z 1000) mam na wyświetlaczu z lekka migające same zera.
    Dodatkowo dopisałem tam uruchamianie na moment podpiętego do któregoś z portów piszczka w momencie przepełniania wartości zliczanej. Czas działania piszczka równiez jest ograniczony przez waitms 250. I owszem, piszczek odzywa się w miarę miarowo, raz na kilka sekund, co wskazywałoby, że wartość wyświetlana jest odliczana prawidłowo, dlaczego jednak nie jest już prawidłowo wyświetlana, skoro jedyne, co zmieniłem, to podmiana wait na waitms? Dodatkowy efekt: ten czas włączenia piszczka jest zmienny i wynosi od na oko poprawnych 1/4 sekundy do nawet kilku sekund. A tam jest po prostu:
    set porta.2
    waitms 250
    reset porta.2

    Taki opis problemu wystarczy? Czy wrzucić listing?

    J.
  • REKLAMA
  • #2 4223663
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    waitms zdaje się korzysta właśnie z tego timera więc dlatego może masz ten problem. Spróbuj sobie wrzucić obsługę wyświetlacza w timer1 i wtedy waitms będzie może działał dobrze

    pozdrówka
  • REKLAMA
  • #3 4223748
    JarekPrzybyl
    Poziom 15  
    Posty: 422
    Pomógł: 3
    Ocena: 216
    mirekk36 napisał:
    waitms zdaje się korzysta właśnie z tego timera więc dlatego może masz ten problem. Spróbuj sobie wrzucić obsługę wyświetlacza w timer1 i wtedy waitms będzie może działał dobrze

    pozdrówka


    Robię to na Attiny 26L, wg pdfa on ma dwa timery. Być może ten drugi jest jakiś specjalny, póki co w programie po prostu pozmieniałem "timer0" na "timer1" i niestety przy kompilacji wywala błąd 202: EQU not found, probably using functions, that are nbot supported by the selected chip. Błąd ten wyskakuje konkretnie w linijce load timer1 , 8

    Zmieniłem tą linijkę na tcnt1=248, skompilowało się, działa inaczej, ale też źle. Konkretnie: piszczek odzywa się tak, jak powinien, czyli na 1/4 sekundy, przerwy między pipnięciami też są miarowe i sensowne, na wyświetlaczu zaś przez ileś cykli mam dość przypadkowo się zmieniające trzy takie same cyfry, a po iluś cyklach wyświetlacz zamiera z tylko jedną wyświetlaną cyfrą (konkretnie 0).
    Sama procedura wyświetlania przy wait działa poprawnie - przypominam.

    Może jednak zamieszczę listing, ale proszę się nie śmiać, ja się uczę! :D

    $regfile = "at26def.dat"
    $crystal = 1000000
    
    'pomijam deklaracje zmiennych (wszystkie BYTE, konfiguracje portów itp
    
    Config Timer1 = Timer , Prescale = 8
    On Timer1 Mult_wysw
    
    Declare Sub Zapis_cyfry(cyfra As Byte)
    Declare Sub Wyswietl_liczbe(byval Liczba As Byte)
    
    W1 Alias Porta.4       'kolejne wyświetlacze
    W2 Alias Porta.5
    W3 Alias Porta.6
    Ledy Alias Porta.7
    Beep Alias Porta.2    'piszczek
    Ia Alias Portb.3        ' linie sterujące dekodera BCD/7segm
    Ib Alias Portb.2
    Ic Alias Portb.1
    Id Alias Portb.0
    
    
    Enable Interrupts
    Enable Timer1
    'Load Timer1 , 8
    Tcnt1 = 240
    
    'tu właśnie pętla mająca za zadanie wyświetlać kolejne liczby od 0 do 220 ze skokiem co 5
    Do 
       Call Wyswietl_liczbe(aaa)
       Aaa = Aaa + 5
       Waitms 250
       If Aaa >= 220 Then
          Aaa = 0
          Reset Beep
          Waitms 50
          Set Beep
       End If
    Loop
    
    Sub Wyswietl_liczbe(byval Liczba As Byte)
       Cyfra_w1 = Liczba \ 100
       Liczba = Liczba Mod 100
       Cyfra_w2 = Liczba \ 10
       Cyfra_w3 = Liczba Mod 10
       If Cyfra_w1 = 0 Then Cyfra_w1 = 10
    End Sub
    
    
    Sub Zapis_cyfry(cyfra As Byte)
    'po wariacku robiony, ale na płytce za diabła nie mogłem zrobić podpięcia dekodera "wprost" do kolejnych linii portu
       Select Case Cyfra
          Case 0:
             Reset Ia : Reset Ib : Reset Ic : Reset Id
          Case 1:
             Set Ia : Reset Ib : Reset Ic : Reset Id
          Case 2:
             Reset Ia : Set Ib : Reset Ic : Reset Id
          Case 3:
             Set Ia : Set Ib : Reset Ic : Reset Id
          Case 4:
             Reset Ia : Reset Ib : Set Ic : Reset Id
          Case 5:
             Set Ia : Reset Ib : Set Ic : Reset Id
          Case 6:
             Reset Ia : Set Ib : Set Ic : Reset Id
          Case 7:
             Set Ia : Set Ib : Set Ic : Reset Id
          Case 8:
             Reset Ia : Reset Ib : Reset Ic : Set Id
          Case 9:
             Set Ia : Reset Ib : Reset Ic : Set Id
          Case 10:
             Set Ia : Set Ib : Set Ic : Set Id
          End Select
    End Sub
    
    Mult_wysw:
    
       Set W1
       Set W2
       Set W3
       Set Ledy
       Select Case Nr_wysw
          Case 0:
             Call Zapis_cyfry(cyfra_w1)
             Reset W1
    
          Case 1:
             Call Zapis_cyfry(cyfra_w2)
             Reset W2
    
          Case 2:
             Call Zapis_cyfry(cyfra_w3)
             Reset W3
    
          Case 3:
             Call Zapis_cyfry(cyfra_led)
             Reset Ledy
    
          End Select
    
          Incr Nr_wysw
    
          If Nr_wysw = 4 Then
             Nr_wysw = 0
          End If
    
    Return


    J.
  • REKLAMA
  • #4 4224190
    yakuza_2000
    Poziom 21  
    Posty: 291
    Pomógł: 48
    Ocena: 10
    mirekk36 napisał:
    waitms zdaje się korzysta właśnie z tego timera więc dlatego może masz ten problem.

    Nie zgodzę się z tobą, zobacz do helpa Bascoma.

    Pozdrawaim Yakuza
  • #5 4224201
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    yakuza_2000 napisał:

    Nie zgodzę się z tobą, zobacz do helpa Bascoma.

    Pozdrawaim Yakuza


    ja pisałem że może - gdyż sam dopiero się uczę Bascoma i tak mi się gdzieś obiło o uszy że tak jest jak mówiłem ale nie w tym problem tylko jak pomóc autorowi ;)


    pozdr
REKLAMA