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

[AVR][BASCOM] - własna biblioteka może być w Bascomie?

mirekk36 13 Sie 2008 09:38 2298 7
  • #1 5434460
    mirekk36
    Poziom 42  
    Witam,

    takie małe pytanko, czy zawartość biblioteki Bascoma może być napisana w Bascomie?

    kombinuję z czymś takim już:

    [mk_lcd_cls(i2c_tx_buf As Byte , Byval Amode As Byte]
       I2c_tx_buf(1) = _lcd
       I2c_tx_buf(2) = 1
       I2c_tx_buf(3) = Amode
       I2creceive _uvga_slave_adr , I2c_tx_buf(1) , 3 , 1
    [end]


    pomijam już że nie wiem jak zdefiniować tu stałe, które tam widać jak:
    "_lcd" to narazie mniejszy pikuś bo może tak się w ogóle nie da? czy w bibliotece zapis typu:

    I2c_tx_buf(2) = 1


    jest poprawny? bo oczywiście przy kompilacji same błędziory z tym wyskakują. Czy trzeba na żywca napisać wszystko w asm ???

    a jeśli tak? to jak do tego podejść w asm? zakładając, że chcę jak widać powyżej zrealizować to co widać w tej mojej pseudo bibliotecznej procedurze, czyli załadować do bufora kilka różnych bajtów podanych w parametrze do procedury jako tenże bufor, a następnie wysłać je przez I2C i na końcu odebrać 1 bajt??? może jakieś sugestie naprowadzające mnie na ten trop? byłbym wdzięczny

    Dodano po 3 [godziny] 4 [minuty]:

    no dobra już się poprawiam, powyższa funkcja w bibliotece powinna wyglądać tak chyba:


    
    [_mk_lcd_cls] 
       ... tutaj wczytanie parametrów ze stosu (już wiem jak)
       I2creceive _uvga_slave_adr , I2c_tx_buf(1) , 3 , 1 
    [end]
    


    ale jak dobrać się do funkcji I2creceive w asemblerze i jak przekazać do niej parametry ??
  • #2 5436551
    mirekk36
    Poziom 42  
    ok, idąc dalej samemu doszedłem już, że jest taka procedura jak _i2c_rbytes, której trzeba podać:

    r17 - adres slave układu
    r24 - ilość bajtów do wysłania
    r25 - ilość bajtów do odebrania
    X - bufor tychże bajtów

    więc próbuję ją wywołać --- rcall _i2c-rbytes i NIC !

    nic nie wysyła ;( a jak zrobię wysłanie pojedyńczego bajtu za pomocą procedurek:

    _i2c_start
    ldi r17, slave_adr
    rcall _i2c_write
    _i2c_stop

    to ładnie działa. Przeanalizowałem już od deski do deski tą procedurę _i2c_rbytes i ona też powinna cokolwiek wysłać - a ona NIC ! - kurczę co się może dziać czy nadal czegoś nie wiem?
  • Pomocny post
    #3 5436631
    ZbeeGin
    Poziom 39  
    Po pierwsze - użyte procedury z innych bibliotek powinny się znaleźć w lini $EXTERNAL:
    [_I2C_RBYTES]
      $EXTERNAL _I2C_READ
      _I2C_RBYTES:
        Mov R17,R18                          ; copy slave address
        Cpi R24,0                            ; bytes to send


    Po drugie można wplatać instrukcje BASCOM tylko trzeba to zrobić z prefixem:
    *BASIC: waitms 1


    Po trzecie chcesz coś wysłać, a zatem nie _i2c_rbytes tylko _i2c_wbytes.

    ps. Nie zapominaj o procedurze _i2c_init, która ustawia stany na portach. Aby poprawnie wywołać procedurę _i2c_rbytes powinieneś przeanalizować kod jaki tworzy kompilator podczas kompilacji normalnego programu z wykorzystaniem I2C. To jest najlepsza droga.
  • #4 5436741
    mirekk36
    Poziom 42  
    No jasne - kurczę ale zonka zrobiłem , na wejsciu do _i2c_rbytes podajemy adres Slave nie w R17 jak pisałem wcześniej tylko w R18 !!! kurczę teraz działa :)

    ja dlatego używam _i2c_rbytes ponieważ zawsze muszę do swojego układu SLAVE najpierw coś zapisać, żeby coś odczytać a do tego jest jak w sam raz i2creceive lub właśnie jej odpowiednik _i2c_rbytes

    hmmm odnośnie tego $external to nie wiedziałem i nawet nie stosowałem a działa teraz. Ale skoro tak trzeba to będę tak robił , dzięki za uwagę.

    ... aha pisząc abym analizował kod jaki kompilator tworzy podczas kompilacji - to masz na myśli - wrzucenie pliku OBJ do AvrStudio ??? czy może jeszcze jakiś inny sposób?

    pozdrawiam

    Dodano po 1 [godziny] 19 [minuty]:

    halo halo - jeszcze jedno -----> może ktoś mi jeszcze wyjaśnić dlaczego edytor Bascomowski dla biblitek tak durnie się zachowuje ???? jak piszę np *BASIC: bo jak się okazuje jest to duża różnica w porównianiu do * Basic :, to okazuje się że jak kliknę kursorem gdzie indziej to napis *BASIC: zamienia się na * Basic : no i kicha??? trzeba jakiegoś innego edytora używać ???

    Dodano po 17 [minuty]:

    dobra już sobie wyłączyłem tą durną opcję REFORMAT CODE w opcjach kompilatora

    ale jednak napisanie najprostszej biblioteki graniczy z cudem, bo np właśnie w tej jednej narazie procedurze w mojej bibliotece korzystam z _i2c_rbytes no i w związku z tym koniecznie po nagłówku nazwy funkcjidałem

    [Mk_lcd_cls]
    $external _i2c_rbytes
    Mk_lcd_cls:


    kurdę no i oczywiście przy kompilacji mojego już programu w Bascomie gdzie mam wszystko zdeklarowane ładnie dostaję setki komunikatów o błędach nt. _SDA, _SCL, _SDADDR, _SCLDDR itp itd

    tzn rozumiem, że używa ch gdzieś tam w czeluściach _i2c_rbytes no ale co z tym zrobić dalej. Normalnie załamka. A oczywiście w programie dałem $lib "i2c_TWI.lib"

    ale może to trzeba gdzieś dać jeszcze w bibliotece??? w tym PDFie jest napisane żeby dać $lib przed $external ale oczywiście dodanie $lib w bibliotece kończy się efektem że kompilator drze się , że nie zna polecenia asm o nazwie $lib

    a taka ma być narazie prosta ta biblioteka:

    'Declare Sub Mk_led_cls(byval Amode As Byte)
    [mk_lcd_cls]
    $EXTERNAL _i2c_rbytes
    Mk_lcd_cls:
    
          Ldd   R26, Y + 0                                  
          Ldd   R27, Y + 1
          Ld    R24, X                                    
    
          *BASIC: Loadadr I2c_tx_buf(1) , X
       
           * Ldi R16 , _lcd                            
          st    X+, R16                                 
          ldi   R16,1                                          
          st    X+, R16                                      
          st    X+, R24                                       
    
            * Ldi R18 , _uvga_slave_adr
            *BASIC: Loadadr I2c_tx_buf(1) , X
    
          ldi   R24, 3
          ldi   R25, 1
          rcall _i2c_rbytes
    
          ret
    [end]
  • #6 5437316
    mirekk36
    Poziom 42  
    nie nie, na 100% nie skończyłem, tylko czas mnie goni a muszę ukończyć pewien projekcik i dlatego łatwiej mi jeszcze idzie z Bascomem.

    w C jak już wiesz napisałem sobie sam własną i ślicznie działającą bibliotekę do obsługi LCD. Ale jak się okazuje, w ten sam sposób muszę "przewalczyć" obsługę wszystkich modułów jak RS232/485, I2C, 1Wire itp ... a nauka pochłania jednak sporo czasu. Nie chcę natomiast wciąż szukać po necie jakichś bibliotek do C i łatać program jak frankensztajna.

    poza tym jestem zafascynowany C i wrócę do niego :)

    a narazie b.szybko mi idzie zrobienie tego co chcę uzyskać z Bascomem i sporą ilością wstawek asemblerowych. Tylko też już kurczę 2 gi dzień walczę z tworzeniem biblioteki żeby już zamknąć całość pod klucz. Tzn i bez bibliteki sobie bym poradził - ale jeszcze daję sobie ostatecznie kilka dni. Proste funkcje już umiem wsadzać do biblioteki ale takie, które korzystają z innych bibliotek to już masakra jak narazie
REKLAMA