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

[BASCOM][M8] Program ma problemy z Waitms

mkpl 16 Paź 2010 21:55 2055 21
  • #1 8628209
    mkpl
    Poziom 37  
    Problem polega na tym że program działa tylko i wyłącznie jeśli użyję Wait. Jeśli gdziekolwiek użyję Waitms to wiesza się w tym miejscu. Totalnie nie wiem co skopałem a jest mi to bardo potrzebne do obsługi SAA1057 :|
    Jeśli mógł by ktoś rzucić okiem na kod i coś podpowiedzieć byłbym wdzięczny :D

    Druga sprawa. Jak napisać aby przyciśnięcie naraz obu przycisków na Pinc.5 i Pinc4 wywołało przejście do obsługi SAA1057 ? Aktualnie jest to zrobione na Pinc.3 ale też za bardzo nie działa (w docelowym urządzeniu mam do dyspozycji tylko 2 przyciski)

    
     "sterownik SAA1057 z wyświetlaczem led"
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Portd = Output
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    
    
    ' ustawiam porty do saa1057
    Dat Alias Portd.13
    Ena Alias Portd.12
    Clk Alias Portd.11
    
    
    'przyciski
    Ddrc = &B1111_1111
    Portc = &B1111_1111
    
    
    Config Timer0 = Timer , Prescale = 8
    
    Declare Sub Pobr_znaku(cyfra As Word)
    
    On Timer0 Mult_wysw
    
    Dim A As Word
    Dim B As Word
    Dim C As Word
    Dim D As Word
    Dim Wart As Word
    Dim X As Byte
    Dim Nr_wysw As Byte
    Dim Wpis As Word
    
    
    
    W1 Alias Portb.0
    W2 Alias Portb.1
    W3 Alias Portb.2
    W4 Alias Portb.3
    
    
    Reset W1
    Reset W2
    Reset W3
    Reset W4
    
    
    Enable Interrupts
    Enable Timer0
    
    Wpis = &B1100100111000101                                   ' prekonfig
    Wpis = 8750                                                 ' częstotliwość początkowa
    Gosub Saa
    Wart = 875
    
    Do
          If Pinc.5 = 0 And Pinc.4 = 1 Then
          Wart = Wart - 1
          End If
          If Pinc.5 = 1 And Pinc.4 = 0 Then
          Wart = Wart + 1
          End If
    
            If Pinc.3 = 0 Then
    
          Wpis = Wart * 10
          wait 2
          Gosub Saa
          End If
    
    
    
          If Wart < 875 Then Wart = 1085
          If Wart > 1085 Then Wart = 875
    
    
    
          D = Wart Mod 10
          C = Wart \ 10
          C = C Mod 10
          B = Wart \ 100
          B = B Mod 10
          A = Wart \ 1000
          A = A Mod 10
          If A = 0 Then A = 10
    
    
         Wait 1
    
    Loop
    
    
    
    Saa:
    Dat = 0
    Ena = 0
    Clk = 0
    Waitms 5
    Ena = 1
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    For X = 15 To 0 Step -1
    
       Dat = Wpis.x                                             'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    
       Waitms 5
       Clk = 1
       Waitms 5
       Clk = 0
       Waitms 5
    Next X
    
    Ena = 0
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    Ena = 1
    Waitms 5
    Dat = 1
    Clk = 1
    Waitms 100
    Return
    
    End
    
    
    '-------------------------------------------------------------------------------
    Sub Pobr_znaku(cyfra As Word)
    Portd = Lookup(cyfra , Kody7seg)
    End Sub
    
    Mult_wysw:
    
    Load Timer0 , 150
    Reset W1
    Reset W2
    Reset W3
    Reset W4
    
    Select Case Nr_wysw
    
    Case 0:
    Call Pobr_znaku(a)
    Set W1
    
    Case 1:
    Call Pobr_znaku(b)
    Set W2
    
    Case 2:
    Call Pobr_znaku(c)
    Set W3
    
    Case 3:
    Call Pobr_znaku(d)
    Set W4
    End Select
    
    Incr Nr_wysw
    If Nr_wysw = 4 Then
    Nr_wysw = 0
    End If
    Return
    
    Kody7seg:
    Data &B01000000 , &B01111001 , &B00100100 , &B00110000 , &B00011001
    Data &B00010010 , &B00000010 , &B01111000 , &B00000000 , &B00010000
    Data &B11111111                                             ' kaswanie cyfry
    
  • #2 8628468
    xury
    Specjalista automatyka domowa
    
    Dat Alias Portd.13 
    Ena Alias Portd.12 
    Clk Alias Portd.11
    

    Nie wiedziałem, że Mega8 ma trzynaście końcówek na porcie D :)
    
    Wpis = &B1100100111000101                                   ' prekonfig 
    Wpis = 8750                                                 ' częstotliwość początkowa 
    


    Po co najpierw zmienna Wpis zawiera liczbę 51653 by zaraz wartość zamienić na 8750 ?

    
    Ddrc = &B1111_1111 
    Portc = &B1111_1111
    

    Jak ty chcesz sterować przyciskami poprzeż WYJŚCIA ?

     Wpis = Wart * 10 

    Zmienna typu Word może mieć maksymalną wartość 65535

    Na razie tyle co do poprawności.
  • #3 8628539
    mkpl
    Poziom 37  
    Z tym portem D to wiem ze nie ma 13 końcówek literówka którą przekopiowałem. W skompilowanym programie ustawione jest już ok.

    Jakimś cudem działa z tą konfiguracją portów ale poprawie :)

    
    Wpis = &B1100100111000101                                   ' prekonfig 
    Wpis = 8750  
    


    generalnie w tym chodziło o to aby wpierw wpisał ciąg bitów który konfiguruje scalak Saa1057 a następnie podaje ciąg bitów odpowiedzialnych za częstotliwość.

    
     Wpis = Wart * 10
    

    tutaj znowu chodziło o to że mam zmienną wart którą zwiększam i zmniejszam i wyświetlam niestety synteza nie przyjmie 875 tylko 8750 dlatego przemnożyłem x10
  • #4 8628613
    M. S.
    Poziom 34  
    Cytat:
    generalnie w tym chodziło o to aby wpierw wpisał ciąg bitów który konfiguruje scalak Saa1057 a następnie podaje ciąg bitów odpowiedzialnych za częstotliwość.

    Tyle, że zapomniałeś konfigurację wysłać do syntezy poprzez Gosub Saa.
    Cytat:
    dlatego przemnożyłem x10

    A wiesz dla czego przemnożyłeś?
  • #5 8628743
    mkpl
    Poziom 37  
    Tak bo na wyświetlaczach i ogólnej zmiennej którą zwiększam lub zmniejszam mam wartości w zakresie 875 do 1805 (czyli 87.5 do 108.5) a synteza potrzebuje dodatkowo zera bo krok jest ustawiony na 10kHz czyli chcąc ustawić 108.5MHz muszę wpisać do scalaka 10850 x10kHz (krok syntezy) co mi da 108.5MHz ale mniejsza już o to.

    Program się sypie jeśli zastosuje gdziekolwiek Waitms działają tylko Wait a niestety nie mogę sobie pozwolić na tak długie czasy. Co z tym fantem zrobić?
  • Pomocny post
    #6 8629381
    M. S.
    Poziom 34  
    Spróbuj:
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 32
    $swstack = 8
    $framesize = 24
    
    Config Portd = Output
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    
    ' ustawiam porty do saa1057
    Dat Alias Portd.3 'SPRAWDŹ CZY DOBRZE ZDEFINIOWAŁEM
    Ena Alias Portd.2
    Clk Alias Portd.1
    
    'przyciski
    Ddrc = &B00000000
    Portc = &B11111111
    
    Config Timer0 = Timer , Prescale = 8
    
    Declare Sub Pobr_znaku(cyfra As Word)
    
    On Timer0 Mult_wysw
    
    Dim A As Word
    Dim B As Word
    Dim C As Word
    Dim D As Word
    Dim Wart As Word
    Dim X As Byte
    Dim Nr_wysw As Byte
    Dim Wpis As Word
    
    W1 Alias Portb.0
    W2 Alias Portb.1
    W3 Alias Portb.2
    W4 Alias Portb.3
    
    Reset W1
    Reset W2
    Reset W3
    Reset W4
    
    Enable Interrupts
    Enable Timer0
    
    Wpis = &B1100100111000101                                   ' prekonfig
    Gosub Saa
    Wpis = 8750                                                 ' częstotliwość początkowa
    Gosub Saa
    Wart = 875
    
    Do
          If Pinc.5 = 0 And Pinc.4 = 1 Then
          Wart = Wart - 1
          End If
          If Pinc.5 = 1 And Pinc.4 = 0 Then
          Wart = Wart + 1
          End If
    
          If Pinc.3 = 0 Then
             Wpis = Wart * 10
             Gosub Saa
          End If
    
          If Wart < 875 Then Wart = 1085
          If Wart > 1085 Then Wart = 875
    
          D = Wart Mod 10
          C = Wart \ 10
          C = C Mod 10
          B = Wart \ 100
          B = B Mod 10
          A = Wart \ 1000
          A = A Mod 10
          If A = 0 Then A = 1
    
    Loop
    
    
    
    Saa:
    Dat = 0
    Ena = 0
    Clk = 0
    Waitms 5
    Ena = 1
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    For X = 15 To 0 Step -1
    
       Dat = Wpis.x                                             'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    
       Waitms 5
       Clk = 1
       Waitms 5
       Clk = 0
       Waitms 5
    Next X
    
    Ena = 0
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    Ena = 1
    Waitms 5
    Dat = 1
    Clk = 1
    Waitms 100
    Return
    
    End
    
    
    '-------------------------------------------------------------------------------
    Sub Pobr_znaku(cyfra As Word)
    Portd = Lookup(cyfra , Kody7seg)
    End Sub
    
    Mult_wysw:
    
    Load Timer0 , 150
    Reset W1
    Reset W2
    Reset W3
    Reset W4
    
    Select Case Nr_wysw
    
    Case 0:
    Call Pobr_znaku(a)
    Set W1
    
    Case 1:
    Call Pobr_znaku(b)
    Set W2
    
    Case 2:
    Call Pobr_znaku(c)
    Set W3
    
    Case 3:
    Call Pobr_znaku(d)
    Set W4
    End Select
    
    Incr Nr_wysw
    If Nr_wysw = 4 Then
    Nr_wysw = 0
    End If
    Return
    
    Kody7seg:
    Data &B01000000 , &B01111001 , &B00100100 , &B00110000 , &B00011001
    Data &B00010010 , &B00000010 , &B01111000 , &B00000000 , &B00010000
    Data &B11111111                                             ' kaswanie cyfry
  • #7 8629509
    mkpl
    Poziom 37  
    Hmm z tymi przyciskami racja zapomniałem sobie czym się różni wystawienie logicznej 1 na port a podciągnięcie wewnętrznym rezystorem no ale dopiero zaczynam bo to mój 1 program na poważnie i od początku :)

    Z pentli Do Loop nie mogę wywalić tego wait bo program wykonuję się za szybko i lekko świruje (poświata na zgaszonych segmentach wyświetlacza)

    Natomiast wstawienie waitms 1000 (teoretycznie odpowiednik wait 1) wiesza program
  • #8 8630074
    M. S.
    Poziom 34  
    Jeszcze jedno. Ten program większość czasu spędza na wyświetlaniu. Wydłuż czas odświeżania wyświetlacza poprzez usunięcie Load Timer0 , 150 i zmianę w Configu timera0 - Config Timer0 = Timer , Prescale = 64. Spróbuj zmniejszyć czasy w transmisji do SAA i raczej wyłącz wyświetlacz na czas transmisji do SAA - zatrzymaj timer i wygaś wyświetlacz. Pamiętaj jeszcze o jednym. Niektóre instrukcje korzystają ze sprzętów uC - głównie timerów. Jeśli ty też korzystasz z tego samego timera to masz kolizję. Niestety trzeba czytać helpa. W tym przypadku jednak raczej tak nie będzie.
  • #9 8632673
    mkpl
    Poziom 37  
    Ok rozwiązałem i waitms jako tako działa :)

    Czy procesor wysyłając Wpis = &B1100100111000101 wysyła go kolejno 1 , 1,0,0.. czyli od lewej do prawej czy od prawej do lewej czyli 1,0,1,0... ?

    Prosił bym też o sprawdzenie poprawności wysyłania wartości częstotliwości bo mi coś nie działa i nie wiem za bardzo jak to sprawdzić

    Program po przyciśnięciu przycisku ma wartość wart zwiększyć o zero od prawej strony tzn np z 885 zrobić 8850 i wpisać do zmiennej wpis i przesłać do podprogramu SAA który przetworzyć na postać binarną i tak samo wysłać bit po bicie
  • #11 8632798
    Jaca
    Poziom 31  
    xury napisał:
    Procesor nic nie wysyła. Linia Wpis = &B1100100111000101 oznacza tylko tyle, że zmienna wpis ma wartość 51653.
    Równie dobrze możesz napisać: Wpis = 51653 lub Wpis = &HC9C5.


    Wysyła (zgodnie z cytowanym wcześniej kodem) od lewej (od 15-tego bitu) do prawej (do 0-wego bitu) :)
  • #13 8633163
    mkpl
    Poziom 37  
    Kurde coś mi to nie działa. Na mierniku idą jakieś sygnały ale coś gdzieś siedzi i jest mega upierdliwe.
    Wywaliłem obsługę wyświetlaczy wywaliłem i przyciski kazałem mu wysłać w postaci bitów czyli:
    Wpis = &B1101110010000101 podstawowe ustawienia
    Gosub Saa


    Wpis = &B0010001111110000 wartość 9200
    Gosub Saa

    No i się okazało że grzecznie przechodzi przez cały podprogram SAA ale za każdym razem pomija wysyłanie bit po bicie wartości wpis :|
    Siedzę już nad tym 4 godzinę i nie wiem jak to ruszyć
    Ile razy mogę zapisywać mikro kontroler bez jego uszkodzenia?
  • #14 8635690
    M. S.
    Poziom 34  
    Możesz spróbować jeszcze tak:
    Saa:
    Dat = 0
    Ena = 0
    Clk = 0
    Waitms 5
    Ena = 1
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
    Shiftout Dat , Clk , Wpis , 1 , 16 , 2
    
    Ena = 0
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    Ena = 1
    Waitms 5
    Dat = 1
    Clk = 1
    Waitms 100
    Return
    


    End przesuń pod Loop pętli głównej.
  • #15 8636854
    mkpl
    Poziom 37  
    Ok poprawiłem potestowałem i nadal omija wysyłanie bit po bicie. Jedyne co działa to waitims i wystawianie stanów sztywno na port.
    Zastanawiam się czy nie zrobić tego na piechotę choć to poważnie poszerzy kod.

    Wodotryski z napisami dodałem dla bajeru i dla zobaczenia jak program skacze po gosubach. Na czas testów są wyłączane

    Aktualny kod:
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 32
    $swstack = 8
    $framesize = 24
    
    Config Portd = Output
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    Config Portc.0 = Output
    Config Portc.1 = Output
    Config Portc.2 = Output
    
    ' ustawiam porty do saa1057
    Dat Alias Portc.2
    Ena Alias Portc.1
    Clk Alias Portc.0
    
    'przyciski
    Ddrc = &B00000000
    Portc = &B11111111
    
    Config Timer0 = Timer , Prescale = 8
    
    Declare Sub Pobr_znaku(cyfra As Word)
    
    On Timer0 Mult_wysw
    
    Dim A As Word
    Dim B As Word
    Dim C As Word
    Dim D As Word
    Dim E As Word
    Dim Wart As Word
    Dim X As Byte
    Dim Nr_wysw As Byte
    Dim Wpis As Word
    
    W1 Alias Portb.0
    W2 Alias Portb.1
    W3 Alias Portb.2
    W4 Alias Portb.3
    
    
    Enable Interrupts
    Enable Timer0
    
    A = 10
    B = 0
    C = 15
    D = 10
    Wait 8
    A = 10
    B = 5
    C = 5
    D = 13
    Wait 8
    A = 1
    B = 0
    C = 5
    D = 7
    Wait 8
    
    Wpis = &B1110010111000101                                   ' prekonfig
    Gosub Saa
    Wpis = 9200
    Gosub Saa
    
    
    Do
    
          If Pinc.5 = 0 And Pinc.4 = 1 Then
          Wart = Wart - 1
          End If
          If Pinc.5 = 1 And Pinc.4 = 0 Then
          Wart = Wart + 1
          End If
    
          If Pinc.3 = 0 Then
             Wpis = Wart * 10
    
             Gosub Saa
          End If
    
          If Wart < 875 Then Wart = 1085
          If Wart > 1085 Then Wart = 875
    
    
    
          D = Wart Mod 10
          C = Wart \ 10
          C = C Mod 10
          B = Wart \ 100
          B = B Mod 10
          E = Wart \ 1000
          E = E Mod 10
          If E = 0 Then
          A = 10
          Else
           A = E
          End If
    
        Wait 1
    Loop
     End
    
     Saa:
      A = 11
      B = 12
      C = 13
      D = 14
      Wait 8
    Stop Timer0
    W1 = 0
    W2 = 0
    W3 = 0
    W4 = 0
    
    Dat = 0
    Ena = 0
    Clk = 0
    Waitms 100
    Ena = 1
    Waitms 100
    Clk = 1
    Waitms 100
    Clk = 0
    Waitms 100
       'For X = 15 To 0 Step -1
    
       'Dat = Wpis.x                                             'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
      'Waitms 100
      'Clk = 1
      'Waitms 100
      'Clk = 0
      'Waitms 100
      'Next X
    Shiftout Dat , Clk , Wpis , 1 , 16 , 2
    Ena = 0
    Waitms 100
    Clk = 1
    Waitms 100
    Clk = 0
    Waitms 100
    Ena = 1
    Waitms 100
    Dat = 1
    Clk = 1
    Waitms 300
    
    Start Timer0
    
    
    Return
    
    
    
    
    
    
    '-------------------------------------------------------------------------------
    Sub Pobr_znaku(cyfra As Word)
    Portd = Lookup(cyfra , Kody7seg)
    End Sub
    
    Mult_wysw:
    
    Reset W1
    Reset W2
    Reset W3
    Reset W4
    
    Select Case Nr_wysw
    
    Case 0:
    Call Pobr_znaku(a)
    Set W1
    
    Case 1:
    Call Pobr_znaku(b)
    Set W2
    
    Case 2:
    Call Pobr_znaku(c)
    Set W3
    
    Case 3:
    Call Pobr_znaku(d)
    Set W4
    End Select
    
    Incr Nr_wysw
    If Nr_wysw = 4 Then
    Nr_wysw = 0
    End If
    Return
    
    Kody7seg:
    Data &B01000000 , &B01111001 , &B00100100 , &B00110000 , &B00011001
    Data &B00010010 , &B00000010 , &B01111000 , &B00000000 , &B00010000
    Data &B11111111                                             'wygaś 0
    Data &B11000111 , &B10100011 , &B10001000 , &B10100001 , &B10101011
    Data &B
    ' L = 11 , o = 12, A = 13 , D = 14 , N = 15 , O = 0 , S = 5
    
  • #16 8637485
    Jaca
    Poziom 31  
    Zamień swoje ustawienia na podane niżej. W razie konieczności wpisz większe aż do uzyskania prawidłowego działania.

    $hwstack = 64
    $swstack = 64
    $framesize = 64
    
  • #17 8637540
    mkpl
    Poziom 37  
    Mógłbyś w miarę łopatologicznie napisać za co te wartości odpowiadają? Tylko przyjadę do domu i testuję
  • #18 8638312
    M. S.
    Poziom 34  
    Cytat:
    Zamień swoje ustawienia

    Moim zdaniem to nie pomoże, ale spróbować można.

    Przetestuj wyjścia komunikujące się z SAA np. programem

    DDRC = &B00000111
    Dat Alias Portc.2
    Ena Alias Portc.1
    Clk Alias Portc.0 
    Do
    Dat = 1
    Ena = 1
    Clk = 1
    Waitms 500
    Dat = 0
    Ena = 0
    Clk = 0
    Waitms 500
    Loop
    End



    No i jeszcze jedno!!!
    Masz podłączone zasilanie do AVCC? (K20) i masę do GDN (k22), 100nF pomiędzy AREF i GDN?
    Jeśli nie to podłącz!!!
  • #19 8638812
    mkpl
    Poziom 37  
    zmieniłem ustawienia efekt taki ze program nieco zwolnił. Nie miałem zasilania częsci analogowej ale po podłączeniu i tak nie działa
  • #20 8639186
    M. S.
    Poziom 34  
    Hmm. Program nie może przez to zwolnić, a już na pewno nie jesteś w stanie tego zauważyć. Moim zdaniem masz problem ze sprzętem albo nawet z kompilatorem. Spróbowałbym przeinstalować Bascoma. Możesz też podesłać kompletny program bas i schemat, a ja go skompiluję i odeślę.
    Chwila! Zauważyłem też DDRC = &B00000000, mimo że zaproponowałem DDRC = &B00000111. Przecież na pinie 0, 1, 2 masz wyjście do syntezy!
  • #21 8639661
    mkpl
    Poziom 37  
    Rozwiązałem program i problemy :)
    Mógłbym poprosić o jakieś wskazówki jak rozwiązać ostatni problem
    Synteza otrzymuje wartość startową 9200 i ustawia taką częstotliwość lecz wartość wyświetlana zawsze po starcie jest 1085. Tak jakby w pętli Do loop zerował tą zmienną. Chciałbym też zrobić wpis do eepromu ostatnio nastawionej częstotliwości. Na co powinienem zwrócić uwagę. To że trzeba będzie przy zmiennych word adresować co 2 komórkę pamięci to wiem
    Oto moja wersja która obecnie działa:
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Portd = Output
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    Config Portc.0 = Output
    Config Portc.1 = Output
    Config Portc.2 = Output
    
    ' ustawiam porty do saa1057
    Dat Alias Portc.2
    Ena Alias Portc.1
    Clk Alias Portc.0
    
    'przyciski
    Ddrc = &B00000111
    Portc = &B11111111
    
    Config Timer0 = Timer , Prescale = 8
    
    Declare Sub Pobr_znaku(cyfra As Word)
    
    On Timer0 Mult_wysw
    
    Dim A As Word
    Dim B As Word
    Dim C As Word
    Dim D As Word
    Dim E As Word
    Dim Wart As Word
    Dim X As Byte
    Dim Nr_wysw As Byte
    Dim Wpis As Word
    
    W1 Alias Portb.0
    W2 Alias Portb.1
    W3 Alias Portb.2
    W4 Alias Portb.3
    
    
    Enable Interrupts
    Enable Timer0
    
    Do
    wyl:
    A = 10
    B = 0
    C = 16
    D = 16
    
    
    If Pinc.3 = 0 Then
    Wait 1
    If Pinc.3 = 0 Then
    Gosub Program
    End If
    End If
    Loop
    
    Program:
    
    A = 10
    B = 0
    C = 15
    D = 10
    Wait 3
    A = 10
    B = 5
    C = 5
    D = 13
    Wait 3
    A = 1
    B = 0
    C = 5
    D = 7
    Wait 3
    
    Wpis = &B1100010010000101                                   ' prekonfig
    Gosub Saa
    Wpis = 9200
    Gosub Saa
    
    
    Do
    
          If Pinc.5 = 0 And Pinc.4 = 1 Then
          Wart = Wart - 1
          End If
          If Pinc.5 = 1 And Pinc.4 = 0 Then
          Wart = Wart + 1
          End If
    
          If Pinc.5 = 0 And Pinc.4 = 0 Then
             Wpis = Wart * 10
    
             Gosub Saa
          End If
          If Pinc.3 = 0 Then
          Wait 1
          If Pinc.3 = 0 Then
          Gosub Wyl
          End If
          End If
    
    
          If Wart < 875 Then Wart = 1085
          If Wart > 1085 Then Wart = 875
    
    
    
          D = Wart Mod 10
          C = Wart \ 10
          C = C Mod 10
          B = Wart \ 100
          B = B Mod 10
          E = Wart \ 1000
          E = E Mod 10
          If E = 0 Then
          A = 10
          Else
           A = E
          End If
    
        Waitms 180
    Loop
     End
    
     Saa:
      A = 11
      B = 12
      C = 13
      D = 14
      Wait 1
    Stop Timer0
    W1 = 0
    W2 = 0
    W3 = 0
    W4 = 0
    
    Dat = 0
    Ena = 0
    Clk = 0
    Waitms 100
    Ena = 1
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
    
                Dat = Wpis.15                                   'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
                Dat = Wpis.14                                   'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
                Dat = Wpis.13                                   'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
                Dat = Wpis.12                                   'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
                Dat = Wpis.11                                   'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
                Dat = Wpis.10                                   'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
                Dat = Wpis.9                                    'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
                Dat = Wpis.8                                    'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
                Dat = Wpis.7                                    'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
                Dat = Wpis.6                                    'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
                Dat = Wpis.5                                    'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
                Dat = Wpis.4                                    'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
                Dat = Wpis.3                                    'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
                Dat = Wpis.2                                    'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
                Dat = Wpis.1                                    'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
                Dat = Wpis.0                                    'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    
    Ena = 0
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    Ena = 1
    Waitms 100
    Dat = 1
    Clk = 1
    
    Start Timer0
    
    
    Return
    
    
    
    
    
    
    '-------------------------------------------------------------------------------
    Sub Pobr_znaku(cyfra As Word)
    Portd = Lookup(cyfra , Kody7seg)
    End Sub
    
    Mult_wysw:
    
    Reset W1
    Reset W2
    Reset W3
    Reset W4
    
    Select Case Nr_wysw
    
    Case 0:
    Call Pobr_znaku(a)
    Set W1
    
    Case 1:
    Call Pobr_znaku(b)
    Set W2
    
    Case 2:
    Call Pobr_znaku(c)
    Set W3
    
    Case 3:
    Call Pobr_znaku(d)
    Set W4
    End Select
    
    Incr Nr_wysw
    If Nr_wysw = 4 Then
    Nr_wysw = 0
    End If
    Return
    
    Kody7seg:
    Data &B01000000 , &B01111001 , &B00100100 , &B00110000 , &B00011001
    Data &B00010010 , &B00000010 , &B01111000 , &B00000000 , &B00010000
    Data &B11111111                                             'wygaś 0
    Data &B11000111 , &B10100011 , &B10001000 , &B10100001 , &B10101011
    Data &B00001110
    ' L = 11 , o = 12, A = 13 , D = 14 , N = 15 , O = 0 , S = 5 , F = 16
    
  • #22 8640597
    M. S.
    Poziom 34  
    Cytat:
    Rozwiązałem program i problemy


    Tylko do czasu przepełnienia stosu, a później maliny!

    Nie wychodzi się z podprogramu poprzez Gosub Wyl do pętli głównej. Podprogram musi się zakończyć przez Return! Wyjdź z pętli Do: Loop przynajmniej za pomocą Exit Do i wstaw na końcu podprogramu Return. Etykieta Wyl nie będzie potrzebna. End przestaw pod Loop pętli głównej.
REKLAMA