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

[ATMega8][Bascom] Przekazywanie parametrów do procedury

RAPELC 13 Sty 2010 13:32 2035 2
  • #1 7528993
    RAPELC
    Poziom 17  
    Pisząc program w Bascom-AVR IDE [1.11.9.5] nie mogę sobie poradzić z przekazaniem parametrów do procedury. Kompilator domaga się umieszczenia w deklaracji procedury słowa Byval, inaczej wykazuje błedy i nie kompiluje programu. Niestety w wewnątrz procedury wartości parametrów są inne niż te które miały być przekazane - tak działo się we właściwym programie.
    Gdy wyselekcjonowałem ten fragment to wartość parametrów wewnątrz procedury jest równa zero. Kombinowałem na różne sposoby jak się tylko dało i za każdym razem to samo.
    Gdzie zrobiłem błąd? Już nie wiem o co chodzi.

    Poniżej ten fragment programu:

    
    $regfile = "m8def.dat"                                      'typ procesora
    $crystal = 1000000                                          'zegar [Hz]
    
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portd.3 , Rs = Portd.1
    Config Lcd = 16 * 2
    
    Const Kranc_g = &H80
    Const Kranc_d = &H40
    Const P2 = &H04
    Const P3 = &H08
    
    Dim Kranc As Byte , S1 As Byte , S2 As Byte
    Dim Io As Byte , Mask As Byte
    
    Declare Sub Ruch(byval Kranc As Byte , Byval S1 As Byte , Byval S2 As Byte)
    
    
    '--------------------------------
           Cls
           Lcd Kranc_d ; " " ; P3 ; " " ; P2 ; " do Call"       'parametry przekazywane
    Call Ruch(kranc_d , P3 , P2)                                'jazda w dol
    
    
    
    
    '********************************
    Sub Ruch(byval Kranc As Byte , Byval S1 As Byte , Byval S2 As Byte)       'ruch
    
          Lowerline
          Lcd Kranc ; " " ; S1 ; " " ; S2 ; " a to w Sub"       'parametry przekazane
    
    End Sub
    


    To co wyświetla LCD:

    64 8 4 do Call
    0 0 0 w Subb

    Pierwsza linia jest prawidłowa, a druga już nie.
    I dlaczego jest powtórzony ostatni znak? Również powtarzał się gdy nie umieściłem napisu (było wtedy na końcu drugie zero).
  • #2 7529203
    arnoldziq
    VIP Zasłużony dla elektroda
    RAPELC napisał:
    Dim Kranc As Byte , S1 As Byte , S2 As Byte

    Sub Ruch(byval Kranc As Byte , Byval S1 As Byte , Byval S2 As Byte)



    Jak myślisz, które zmienne są wyświetlane? Te zadeklarowane globalnie, czy te zadeklarowane dla procedury Ruch ? Bo nazwy są dokładnie takie same.
  • #3 7530939
    RAPELC
    Poziom 17  
    Tak, nazwy się zgadzają bo tak jest w pomocy Bascoma że są one deklarowane poprzez Dim oraz w deklaracji procedury jak również w nazwie samej procedury.
    Czytałem teraz jeszcze raz bardzo dokładnie plik pomocy i zauważyłem że sama procedura jest umieszczona poza End który kończy właściwy program. Gdy poprawiłem ten End (wcześniej był on na samym końcu wszystkiego) to te błędy znikły.
    Po zakomentowaniu Dim nic się nie zmieniło, też było dobrze.

    Ale niestety przekazywane są jedynie 2 parametry, trzeci już nie (w procedurze jest zawsze zero). Może to już taka ograniczona wersja kompilatora która akceptuje tylko 2 argumenty. lecz przy sprawdzaniu składni błąd nie był wykazywany.
    Wcześniej przy wykonywaniu obliczeń kompilator akceptował jedynie 2 argumenty, więcej nie chciał (ale to można łatwo obejść) i pisał o tym w opisie błędu.
    Ale jak zrobić trik z parametrami to nie wiem.


    Już rozszyfrowałem o co chodzi.
    Po dodaniu dyrektyw kompilatora określających wielkość stosu nie ma już błędów i można przekazywać więcej parametrów. Jak na razie 3 mi wystarczają, więc nie sprawdzam ile się da przekazać.

    $hwstack = 32                                               'domyslnie 32 dla stosu sprzetowego
    $swstack = 10                                               'domyslnie 10 dla stosu programowego
    $framesize = 40                                             'domyslnie 40 dla the frame space
    
REKLAMA