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

[bascom] 'gdy zmienna byte >255 i <0 to.'jak to zrobic

wader_669 11 Cze 2008 23:54 3116 13
  • #1 5237683
    wader_669
    Poziom 28  
    mam problem chcialem adresowac zewnetrzna pamiec eeprom komunikacja i2c (twi) sa tam 2 adresy ktore musza miec 8 bitow (1 byte)

    chcialem zrobic tak gdy adress2 przekroczy 255 to zwiekszy sie adress1 jak to zrobic?
    myslalem nad zrobieniem jednej zmiennej 16 bitowa (2 byte'y = 1 word) ktora bede dzieli na 2 czesci.
    ______________________________________________
    np. tak:
    Cytat:

    Left Get the left part of a string

    Example:

    Dim Instring as String*13
    Dim Leftstring as String*3
    Dim Pval as Integer
    Instring = "Bascom Cursus"
    Pval = 3
    Leftstring = Left(Instring, Pval)
    'Leftstring = "Bas"



    Right Get the right part of a string

    Example:

    Dim Instring as String*13
    Dim Rightstring as String*3
    Dim Pval as Integer
    Instring = "Bascom Course"
    Pval = 3
    Rightstring = Right(Instring, Nval)
    'Rightstring = "rse"


    ma ktos pomysl jak najlepiej to rozwiazac?
    prosze o pomoc

    nie chcialem uzywac tego

    dim adress1 as byte at 'jakis adres"
    dim adress2 as byte at 'przusniecie o jeden byte' overlay
    

    ______________________________________________
    informacje dla zumka:
    Nie napiasalem w tytule jezyka i rodziny procesorow poniewaz wydaje mi sie ze nie bylo to w poprzednim poscie (ktory zostal skasowany) potrzebne. Obojetnie w jakim jezyku bym pisal i tak bym mial ten problem. chodzilo mi wczesniej o slowne wytlumaczenie jak to najlepiej zrobic. w sumie jak by ktos mial przyklad tego napisanego w bascomie to super!
    jakby co czesc pod kreska dodalem dopiero w tym na nowo utworzonym temacie :P
  • #2 5237769
    Fyszo
    Poziom 37  
    Każdy porządny język może dzielić słowo word na 2 bajty. Najczęściej instrukcje typu Lo(word) i Hi(word) zwracające dolną i górną połówkę 16bitowej liczby.
  • #3 5238908
    Balu
    Poziom 38  
    tu jest nawet wygodniej:)
    Deklarujesz dwie zmienne byteowe pod adresami OKREŚLONYMI i pod tym SAMYM określonym adresem drugą zmienną word z parametrem OVERLAY (czy jakoś tak).

    I masz dostęp do rozdzielnych byteów albo całego worda:)
  • #4 5239106
    wader_669
    Poziom 28  
    no wiem chodzi ci o to
    wader_669 napisał:


    nie chcialem uzywac tego

    dim adress1 as byte at 'jakis adres"
    dim adress2 as byte at 'przusniecie o jeden byte' overlay
    



    wszystko super, ale nie pasuje mi to przypisywanie zmiennej adresu
  • Pomocny post
    #5 5239591
    Balu
    Poziom 38  
    Nie do końca jakby o to:)

    dim address1 as byte at &H60
    dim address2 as byte at &H61
    dim Address3 as byte at &h60 overlay

    Łatwiej się nie da. I akurat język jest tu bardzo ważny :)
  • #6 5239716
    wader_669
    Poziom 28  
    sory masz racje dzieki.
    mimo to nie chcialem uzyc tego

    No dobra moze sie myle i jezyk byl wazny :p
  • #8 5239949
    wader_669
    Poziom 28  
    bo nie wiem jak to sie godzi ze stosem.

    Bardzo malo wiem o sotach, a mam mega duze problemy z tym. Dlatego nie chcialem dodawac zmiennej ktora jest zapisana do jakiegos stalego adresu (oczywiscie nie wiem czy to co pisze sie zgadza). Po 2 moj program sie co chwile rozrasta, nie wiem czy to bedzie sie godzic z tym.
    Jak mi ktos to wytlumaczy to spoko bede mogl wykorzystac ta opcje
    (oczywiscie zagladalem do helpa i szukalem na forum i malo sie dowiedzialem :P )
  • Pomocny post
    #9 5239964
    Balu
    Poziom 38  
    Umieść zmienną po prostu na początku RAMu. Stos się rozrasta od tzw dupy strony :) Czyli od końca w kierunku początku.
    Gdzie się zaczyna RAM (pod jakim adresem) w datasheecie znajdziesz. Jak nie to użyj &h60 czy &60h nie wiem jak to się w baskupie zapisywało:)

    PS to się nijak nie ma do stosu :)
    I z czym można mieć problemy ze stosem w bascomie? (No chyba, że miałeś za płytki).
  • #10 5239990
    wader_669
    Poziom 28  
    dzieki.
    no dokladnie stos sie przepelnia, Nie wiem jak dokladnie go dopasowac do moich wymagan, ale to kiedys tam. Narazie walcze z tym. wiec testowalem na adresie &H60 i error 90 w "baskupie" (w wakacje poucze sie c, narazie ni mam czasu sesja). error 90 to jest za duzy adres (addess alredy ocupied) zamienilem na 68 dziala. zaraz obadam datasheet do atmega16
  • Pomocny post
    #12 5240175
    zumek
    Poziom 39  
    Nie ma potrzeby ustawiać adresów zmiennych "na sztywno".
    Ponieważ Bascom dla zmiennych wielobajtowych , stosuje zapis typu Little Endian to kod może wyglądać tak:
    
    Dim Zmienna As Word
    Dim Zmienna_lo As Byte At Zmienna Overlay     
    Dim Zmienna_hi As Byte At Zmienna+1 Overlay
    

    I nie obchodzi nas pod jakim adresem znajduje się Zmienna , bo kompilator zadba o to , by odpowiednio przyporządkować adresy Zmienna_lo i Zmienna_hi.
    A gdybyś chciał używać dwóch niezależnych zmiennych typu Byte do przechowywania wartości 16-bitowej , to inkrementacja takiej "pary" wygląda tak:
    
    Dim Lo As Byte
    Dim Hi As Byte
    '...
    Incr Lo
    If Lo = 0 Then Incr Hi
    

    To tyle.

    Piotrek
  • #14 5240504
    wader_669
    Poziom 28  
    spoko mi tez pomogl juz kliknelem. tego tez nie wiedzialem

    Balu napisał:
    Nie za duży adres, tylko zajęty :) (przez peryferia).
    :)


    no tez tak mysle ale w ksiazce i w helpie jest napisane ze error 90 to:
    Cytat:

    Ten adres jest za duży


    jak juz nikt nie bedzie mial nic do powiedzenia to jutro zamkne temat

    Dodano po 1 [minuty]:

    a! i dzieki zumek (po raz kolejny mi mega pomogles), oczywiscie dzieki balu!
REKLAMA