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

mega8 bascom 4 wyswietlacze led i niedziałająca komena waitms

Kubaand 21 Maj 2011 10:59 1154 3
REKLAMA
  • #1 9529063
    Kubaand
    Poziom 10  
    Witam mam problem z komendą waitms w bascomie . Napisałem krótki programik dla testu który liczy od 0 do 9-ciu i z komendą wait wszystko jest ok a gdzy zmienie na waitms wyświetlacze pokazują mi tylko zera ? Przeryłem trochę forum i nikt nic konkretnie nie napisał na ten temat. z helpa wynika ze przy użyciu timer czasy mogą się wydłużyć a u mnie tak wygląda jakby procek zwis.
    oto programik:
    
    '$sim
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    
    Config Pinc.0 = Input
    Config Pinc.1 = Input
    Config Pinc.2 = Input
    Config Pinc.3 = Input
    
    'Config Pinc.5 = Output
    
    Config Pinb.0 = Output                                      'w1
    Config Pinb.1 = Output                                      'w2
    Config Pinb.2 = Output                                      'w3
    Config Pinb.3 = Output                                      'w4
    Config Pinb.4 = Output
    
    Config Portd = Output                                       '7seg+kropka
    
    Dim A As Byte
    Dim B As Byte
    Dim C As Byte
    Dim D As Byte
    Dim E As Byte
    
    
    Dim Nr_wysw As Byte
    Dim Kr1 As Bit
    Dim Kr2 As Bit
    Dim Kr3 As Bit
    Dim Kr4 As Bit
    Dim Kr5 As Bit
    
    Dim X As Byte
    
    W1 Alias Portb.0
    W2 Alias Portb.1
    W3 Alias Portb.2
    W4 Alias Portb.3
    W5 Alias Portb.4
    Declare Sub Pobr_znaku(cyfra As Byte)
    
    Config Timer0 = Timer , Prescale = 256
    On Timer0 Mult_wysw
    Enable Interrupts
    Enable Timer0
    Load Timer0 , 125
    
    
    
    Set Kr1
    Set Kr2
    Set Kr3
    Set Kr4
    Set Kr5
    
    Do
    
    For X = 0 To 9
    A = X
    B = X
    C = X
    D = X
    E = 2
    Wait 1
    Next X
    Loop
    End
    
    Sub Pobr_znaku(cyfra As Byte)
    If Cyfra < 15 Then
    Portd = Lookup(cyfra , Kody7seg)
    Else
    Portd = 0
    End If
    End Sub
    
    
    Mult_wysw:
    Load Timer0 , 125
    Set W1
    Set W2
    Set W3
    Set W4
    Set W5
    
    Select Case Nr_wysw
    Case 0:
    Call Pobr_znaku(a)
    Portd.7 = Kr1
    Reset W1
    
    Case 1:
    Call Pobr_znaku(b)
    Portd.7 = Kr2
    Reset W2
    
    Case 2:
    Call Pobr_znaku(c)
    Portd.7 = Kr3
    Reset W3
    
    Case 3:
    Call Pobr_znaku(d)
    Portd.7 = Kr4
    Reset W4
    
    Case 4:
    Call Pobr_znaku(e)
    Portd.7 = Kr5
    Reset W5
    
    End Select
    Incr Nr_wysw
    If Nr_wysw = 5 Then
    Nr_wysw = 0
    End If
    Return
    
    
    
    Kody7seg:
    Data &B11000000 , &B11111001 , &B10100100 , &B10110000 , &B10011001,
    Data &B10010010 , &B10000010 , &B11111000 , &B10000000 , &B10010000,
    Data &B10000110 , &B11111111 , &B01000110 , &B01111001
    
  • REKLAMA
  • #2 9529247
    Kuniarz
    Moderator Projektowanie
    Waitms + przerwania = pewne kłopoty.
    Zamień Waity jakimiś pustymi pętlami, albo jeśli chcesz zrobić to w bardziej elegancki sposób to dodaj zmienną zwiększającą się w przerwaniu i na podstawie zliczania tej zmiennej masz dokładne odliczanie zwłoki.
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • Pomocny post
    #3 9531002
    slawko_k
    Poziom 35  
    Cytat:
    Witam mam problem z komendą waitms w bascomie

    to nie z instrukcja masz problem tylko z programem. Instrukcji waitms używa tysiące ludzi i im działa.

    No problem ciekawy.
    Zacząłbym od obserwacji przy jakim tym czasie zaczynają sie problemy bo tgo nie napisałeś. Czy jeżeli zmienisz wait 1 na waitms 999to już jest problem??

    Wywal ten podprogram Pobr_znaku. tu akurat bascom kuleje i bez zwiększenia stosu nigdy podprogramy dobrze mi ni chodziły.
    zamiast

    Case 0:
    Call Pobr_znaku(a)


    daj
    Case 0:
    Portd = Lookup(a , Kody7seg)


    w przerwaniu używasz case a zaraz if. ja bym tylko na ifach zrobił.
    if nr_wysw=0 then
      Portd = Lookup(a , Kody7seg)
      portb=&b11111110
    end if
    if nr_wysw=1 then
      Portd = Lookup(b , Kody7seg)
      portb=&b11111101
    end if
    .
    .
    if nr_wysw=4 then
      Portd = Lookup(e , Kody7seg)
      portb=&b11101111
      nr_wysw=0
    end if
  • #4 9539551
    Kubaand
    Poziom 10  
    witam
    problem rozwiązany kolega slawko_k miał racje problem tkwił w programie . Zmieniłem program multi wyświetlania i na :
    
    Mult_wysw:
    Load Timer0 , 125
    Set W1
    Set W2
    Set W3
    Set W4
    Set W5
    
    If Nr_wysw = 0 Then
      Portd = Lookup(a , Kody7seg)
     Portd.7 = Kr1
      Portb = &B11111110
    End If
    
    If Nr_wysw = 1 Then
      Portd = Lookup(b , Kody7seg)
      portd.7=kr2
      Portb = &B11111101
    End If
    If Nr_wysw = 2 Then
      Portd = Lookup(c , Kody7seg)
      Portd.7 = Kr3
      Portb = &B11111011
    End If
    If Nr_wysw = 3 Then
      Portd = Lookup(d , Kody7seg)
      Portd.7 = Kr4
      Portb = &B11110111
    End If
    If Nr_wysw = 4 Then
      Portd = Lookup(e , Kody7seg)
      Portd.7 = Kr5
      Portb = &B11101111
    End If
    
    Incr Nr_wysw
    If Nr_wysw = 5 Then
    Nr_wysw = 0
    End If
    
    Return

    i wszystko działa jak należy.
    Temat zamykam .Pozdrawiam
REKLAMA