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

[bascom]waitms 1000 to nie wait 1 ?

xamrex 22 Sty 2011 13:24 2625 16
REKLAMA
  • #1 9040880
    xamrex
    Poziom 28  
    Witam,
    Napisałem sobie program do obsługi 2 wyświetlaczy 7segmentowcyh (połączonych przez 4543)

    Taki kod mam:

    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Pinc.0 = Output
    Config Pinc.1 = Output
    Config Pinc.2 = Output
    Config Pinc.3 = Output
    
    Config Pinb.0 = Output
    Config Pind.7 = Output
    
    
    Config Timer0 = Timer , Prescale = 256
    Declare Sub Zapis_cyfry(cyfra As Byte)
    On Timer0 Mult_wysw
    
    Dim A As Byte , B As Byte , I As Byte
    Dim Nr_wysw As Byte
    
    W2 Alias Portb.0
    W1 Alias Portd.7
    
    Enable Interrupts
    Enable Timer0
    Timer0 = 6
    
    Do
    A = 3
    B = 6
    
    
    Wait 1
    Loop
    End
    
    Sub Zapis_cyfry(cyfra As Byte)
    Portc = Cyfra
    End Sub
    
    Mult_wysw:
    Timer0 = 6
    Set W1
    Set W2
    
    Select Case Nr_wysw
    
    Case 0:
       Call Zapis_cyfry(a)
       Reset W1
    
    Case 1:
       Call Zapis_cyfry(b)
       Reset W2
    End Select
    Incr Nr_wysw
    If Nr_wysw = 2 Then Nr_wysw = 0
    
    Return
    
    


    Wszystko działa jak należy.
    Na jednym wyświetlaczu pokazuje 6,
    a na drugim 3

    Problem jednak pojawia się w pętli do Loop
    Do
    A = 3
    B = 6
    
    Wait 1
    Loop
    End


    Jeśli usunę wait 1, to program dalej działa.
    Jeśli zamienię wait 1 na np. wait 5 to program dalej działa (pokazuje 36)

    Ale jeśli zamiast rozkazu wait, dam rozkaz waitms i obojętnie jaką liczbę,(np. waitms 999) to na wyświetlaczu pojawia się "00"

    Dlaczego tak się dzieje?

    Dam może screena aby każdy zrozumiał o co mi chodzi:
    [bascom]waitms 1000 to nie wait 1 ?

    Dodam, że kod pochodzi z książki pana Marcina Wiazania (tylko jest zmodyfikowany dla 2 wyświetlaczy)
  • REKLAMA
  • REKLAMA
  • #3 9040947
    xamrex
    Poziom 28  
    Wiem, że mogę użyć timera, ale tu nie chodzi o dokładny pomiar czasu.
    Chciałbym się dowiedzieć dlaczego stosując wait 1, program działa
    a przy poleceniu waitms, program przestaje działać
  • #4 9042207
    Fredy
    Poziom 27  
    Spróbuj zadeklarować udostępnianie argumentów do funkcji Sub Zapis_cyfry(cyfra As Byte) poprzez Byval.
    Albo zamień ten Sub na zwykły podprogram i wywołaj poprzez Gosub.
  • REKLAMA
  • #5 9042385
    xamrex
    Poziom 28  
    Fredy
    Jak zrobiłem coś takiego:
    
    Declare Sub Zapis_cyfry(byval cyfra As Byte)  
    

    to na wyświetoaczu pokazało mi się tym razem 03 (ale nie ma to nic wspólnego z tym, że A=3, bo jak zmienię na A=6, to dalej na wyświetlaczu jest 03)

    Mówiłeś jeszcze aby zamienić SUB na zwykły podprogram, ale tego nie da się tak zrobić bo trzeba przekazywać parametr.
    Jest np:
    
    Case 0:
       Call Zapis_cyfry(a)
    

    To jak zamiast tego dam:
    
    Case 0:
       Goto Zapis_cyfry
    

    To nie przekaże tego parametru a
  • #7 9042543
    xamrex
    Poziom 28  
    piotrva
    Dzięki, pomogło.
    Nie mam rs232, więc ustawiałem na 'chybiłl trafił'
    Domyślnie miałem
    HW STACK na 32 (i wtedy nie działało)

    po zmianie na 31 (również nie działało)

    ale po zmianie na 30,29 działa
    33 , 34 - Również działa

    Tak jak pisałem nie mogę użyć Programu Stack Analyser, więc ustawienie na 34 będzie chyba dobrym pomysłem
  • #8 9042580
    Marczeli_P
    Poziom 20  
    Problem tkwi w argumencie przekazywanym do funkcji waitms. Przekazujesz liczbę spoza zakresu. To znaczy ze argument tej funkcji może przyjmować liczbę z zakresu od 1-255 a ty tam wstawiasz te twoje 999.
  • #9 9042617
    xamrex
    Poziom 28  
    Marczeli_P NIE
    Gdybyś popatrzył na zdjęcie z pierwszego postu, zobaczyłbyś, że nawet przy waitms 1 Program źle działał (1 nie jest spoza zakresu)
  • Pomocny post
    #10 9042815
    mirekk36
    Poziom 42  
    Generalnie to twój problem wynika w dużej mierze z tego, że wywołujesz funkcję z wewnątrz przerwania. To powoduje szczególnie w Bascomie - niestety KOSMICZNE obciążenie w postaci po pierwsze ogromnego i niepotrzebnego zużycia stosu przez co musisz właśnie zacząć się bawić z tymi wszystkimi HWSTACKAMI itp .... zobaczysz jaka bonanza z tym będzie przy większych projektach :( .... Po drugie to kosmiczne obciążenie to dramatyczne zwiększenie ilości kodu w pamięci Flash a po trzecie to zdecydowanie większe obciążenie procesora - procedurą tego przerwania - zaczyna ona zjadać niepotrzebnie więcej czasu.

    Nie oznacza to , że nie można wywoływać funkcji z wewnątrz przerwań, ale sam szybko dojdziesz że staje się to mocno nieopłacalne w Bascomie i ZDECYDOWANIE lepiej taki zapis do portu C powielić w przerwaniu niż skakać do funkcji bo zyskasz na tym bardzo dużo w Bascomie i nawet może ci to zadziała wtedy bez zwiększania tych wartości STACK'ów - spróbuj ;)
  • #12 9043057
    xamrex
    Poziom 28  
    Nie, no że ja na to nie wpadłem, tylko jak głupi przepisywałem z książki pana Marcina Wiazana...
    Przecież w przerwaniu wystarczyło zrobić:
    
    Case 0:
       Portc = A
       Reset W1
    
    Case 1:
      Portc = B
       Reset W2


    I po problemie, (nawet z domyślnymi ustawieniami stosu działa)
  • Pomocny post
    #13 9043471
    mirekk36
    Poziom 42  
    No właśnie o tym pisałem, ale tak czy siak dobrze, że natknąłeś się na potrzebę zaznajomienia z potrzebą ustawiania stosów w Bascomie. Wbrew pozorom to nie żarty i jeszcze chwila i będziesz musiał się z tym zapoznać. Na szczęście można znaleźć opis, który stos, za co odpowiada i od czego zależy, więc jakoś można starać nad tym zapanować. Jednak nadal podtrzymuję, że przy większych projektach jest to katorga ;) - te trzy stosy. Dlatego im wcześniej o tym poczytasz tym bardziej wyjdzie ci to na zdrowie w bascomie ;)
  • REKLAMA
  • #14 9043805
    piotrva
    VIP Zasłużony dla elektroda
    Ogólnie w bascomie natkniesz się na inne przykre niespodzianki, typu źle obsługiwane timery, przerwania, rejestry niektórych uP, porównywanie liczb niektórych typów...
    I najgorsze, że wtedy się szuka błedu godzinami zanim się dojdzie o co chodzi...
    C jest o tyle lepsze że tam i tak wszystko robisz sam ręcznie i dodatkowo są większe możliwości w wykorzystaniu zasobów uP
  • #15 9044139
    Konto nie istnieje
    Poziom 1  
  • #16 9044341
    piotrva
    VIP Zasłużony dla elektroda
    Dlaczego tak twierdzisz?
    W c da się dużo lepiej optymalizować kod bo ma się wpływ prawie na wszystko, a w bascom raczej nie, chyba że ktoś grzebie w asm i bibliotekach...
  • #17 9044468
    xamrex
    Poziom 28  
    A ja powiem tak,
    temat nie został stworzony, aby polemizować który język jest lepszy, więc całe szczęście, że moderator się do tego nie dobrał.
    Temat został stworzony, aby poradzić coś na komendę waitms.
    I udało to się, więc chciałbym jeszcze raz podziękować użytkownikowi piotrva oraz mirekk36 i temat uważam za zamknięty.
REKLAMA