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

Bascom8051 - Jak umieścić zmienną integer w tabeli dla AT24C64?

KJ 23 Sie 2002 19:40 3883 10
REKLAMA
  • #1 34194
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Cze. Czy ktoś wie jak umieścić zmienne typu integer w tabeli jak na razie udało mi się wsadzić w tabelę tylko wartości zmiennej byte od 0 do 255 a potrzebuję integer do zaadresowania pamięci AT24C64 na razie zrobiłem to za pomocą warunków ale zapchałem tym sposobem prawie całą pamięć 4051 :(.
  • REKLAMA
  • #2 34300
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Cze !
    Możesz stworzyć dwie tabele dla starszego bajtu i dla młodszego bajtu adresu ale w ten sposób zużyjesz cały RAM procka. Przybliż trochę temat, może uda się obliczać adres za pomocą wzoru.
  • #3 34378
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Tez myślałem o obliczaniu adresu a program jest do sterowania wyświetlaczem graficznym w pamięci są obrazki i trzeba tak: najpierw ustawić stronę i kolumnę od której ma się zacząć wyświetlanie do tego wyświetlacz jest jeszcze podzielony na 2 połówki w każdej połówce jest 8 stron a w każdej stronie 64 pionowe linie w każdej linii jest 8 pikseli taki sam wyświetlacz jak w kostce do gry z EP 8/2001 w projektach czytelników mój program działa tak ze ustawia stronę i kolumnę na 1 i wysyła 64bajty czyli zapisuje dane dla jednej strony potem trzeba przerwać odczyt pamięci aby zmienić stronę na następną i znowu 64 bajty i tak aż do końca pierwszej połówki potem zmienia się odpowiednimi sygnałami połówkę i wszystko zaczyna się od nowa strona kolumna i 64 bajty zmiana strony 64 bajty... problem w tym ze program musi wiedzieć pod jakimi adresami są dane dla której strony myślałem umieścić w tabeli słyszałem ze tabelach bez kombinowania można umieszczać nawet długie zmienne ale jak?
  • REKLAMA
  • #4 34652
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Cze !
    Nie widzę potrzeby stosowania tablic w tym projekcie. Wszystko da się ładnie upchać w pętle For...Next. Co do obliczania adresu w EEPROM to też jest bardzo prosty sposób:

    nrobrazka=0
    For polowka=0 to 1
    'ustaw polowka LCD
    For strona=0 to 7
    'ustaw strona LCD
    For kolumna=0 to 63
    'ustaw kolumna LCD
    adresEEPROM=nrobrazka*1024+polowka*512+strona*64+kolumna
    'czytajEEPROM
    'wyślij daną do LCD
    Next
    Next
    Next

    Tak to zgrubnie wygląda. Można to jeszcze uprościć i przyspieszyć. Prawdopodobnie LCD ma automatyczny licznik przełączający kolumnę na poprzednią/następną po odebraniu bajtu danych. Pamięć EEPROM też ma podobny mechanizm tzw. zapis/odczyt sekwencyjny.
  • #5 34914
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Tak tylko ze po każdym bajcie-kolumnie trzeba wysyłać sygnał zezwalający na operację ale pokombinuję a z tymi tabelami to mimo wszystko chciał bym umieć wsadzić w nie zmienną integer albo jakąś inną od byte. To by mi się nie tylko tu przydało.
  • REKLAMA
  • #6 34917
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Zapomnialem jeszce: Czy idzie połączyć dwie zmienne byte w jedną integer wiem że idzie rozdzielić integer na dwie byte ale czy na odwrót?
  • #7 34933
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Cze !
    Zapomnij o tablicach ! Wstaw kontrolę zezwolenia w strukturę którą Ci podałem i po kłopocie. Co do zamiany dwóch bajtów na integer - służy do tego wzór:
    Integer=starszy_bajt*256+mlodszy_bajt
    i po krzyku :D
  • #8 35692
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Hi !
    W tablicach możesz używać dowolnych typów zmiennych liczbowych, np:

    Dim A(10) As Byte
    Dim B(9) As Integer
    Dim C(8) As Long
    ...
  • #9 35755
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Chyba myślimy o innych tablicach danych chodzi ni o taką tablicę która umieszcza dane w pamięci programu a nie w ramie tak jak w tym programie do zapisywania danych w eepromie program przeznaczony do umieszczenia w procu a nie do odpalenia w symulacji chyba że komuś chce się czekać 3,5h na zapisanie 1024b albo ma dobry emulator. Cały czas z braku programatora tak sobie rdzę z programowaniem szeregowych eeprom-ów. Do takiej tabeli nie umiem wsadzić liczb większych od 255.



    Dim Adres As Integer
    Dim Adres1 As Byte
    Dim Adres2 As Byte
    Dim Value As Byte
    Declare Sub Write_eeprom
    Config Sda = P3.5
    Config Scl = P3.7




    Restore Value
    For Adres = 0 To 1023
    Read Value
    Call Write_eeprom
    Next Adres

    End




    Sub Write_eeprom 'zapis do pamięci
    Adres1 = High(adres)
    Adres2 = Low(adres)
    I2cstart
    I2cwbyte 174
    I2cwbyte Adres1
    I2cwbyte Adres2
    I2cwbyte Value
    I2cstop
    Waitms 50
    End Sub


    '--------------------------------------- dane --------------------------------------

    Value:
    DB 255,255,255,249,255,255,255,255,255,255,255,255,95,255,63,219
    DB 47,159,46,87,29,135,43,5,146,45,3,93,7,61,70,59
    DB 78,59,205,59,207,58,231,127,167,223,175,95,255,94,255,125
    DB 255,251,252,223,244,255,247,254,255,255,255,255,255,255,255,255
    DB 255,255,86,171,85,171,85,170,85,171,84,35,156,99,12,163
    DB 84,9,38,145,74,149,34,153,70,185,70,187,69,186,79,178
    DB 95,171,85,191,85,255,87,255,191,255,255,255,255,255,255,255
    DB 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
    DB 255,191,247,223,47,255,7,251,5,87,33,70,145,10,64,42
    DB 0,160,10,64,4,0,32,0,68,0,128,8,1,64,8,1
    DB 64,21,130,41,84,163,92,195,61,215,110,187,110,57,174,17
    DB 46,159,79,159,199,223,71,237,71,235,103,171,103,87,103,203
    DB 103,215,141,215,169,4,151,16,78,33,148,75,32,13,162,8
    DB 165,0,85,0,42,128,21,32,138,20,66,169,20,75,148,66
    DB 61,130,121,134,121,142,243,93,183,90,255,173,255,247,191,255
    DB 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
    DB 255,255,251,254,171,253,170,85,170,85,136,101,18,72,37,64
    DB 18,36,128,36,1,144,2,32,4,0,72,0,16,0,2,144
    DB 0,2,144,0,2,41,6,11,165,202,97,20,73,20,162,201
    DB 166,209,10,241,44,89,172,22,109,212,46,154,13,54,205,244
    DB 29,212,106,253,96,154,97,132,81,132,32,138,64,17,132,0
    DB 82,0,36,129,8,64,2,40,2,160,9,164,1,84,34,132
    DB 81,36,202,33,222,161,222,233,246,123,253,250,255,254,255,111
    DB 255,255,255,255,255,255,255,255,255,255,255,111,191,127,255,255
    DB 255,255,255,255,251,253,246,251,236,243,220,98,213,18,73,20
    DB 129,28,34,92,226,124,250,53,250,125,186,88,25,82,56,80
    DB 33,8,64,4,1,16,2,128,8,34,145,236,183,253,255,254
    DB 255,254,255,248,238,177,202,32,5,75,60,232,212,63,131,40
    DB 194,116,219,111,183,221,162,85,42,133,16,74,20,129,36,3
    DB 36,5,144,5,38,1,42,3,72,2,4,144,2,1,72,2
    DB 44,151,127,255,255,255,231,145,196,18,72,37,82,45,130,125
    DB 7,255,15,247,95,255,239,255,255,255,255,255,251,253,255,255
    DB 255,255,255,255,255,255,255,255,255,255,255,255,223,104,2,64
    DB 8,128,1,16,135,1,39,9,66,21,64,11,32,129,8,64
    DB 18,0,128,9,64,2,144,0,8,64,22,107,190,255,251,255
    DB 255,255,255,255,247,255,22,73,2,208,105,86,59,200,34,144
    DB 15,117,223,125,215,254,187,238,177,204,34,208,2,8,64,16
    DB 1,64,8,0,17,128,2,32,4,0,64,16,4,0,72,1
    DB 128,4,19,95,191,127,255,255,254,251,228,169,194,41,148,66
    DB 189,66,189,210,253,255,255,255,255,255,255,255,255,255,255,255
    DB 255,255,255,255,255,255,255,255,255,255,255,255,255,213,234,0
    DB 132,32,128,36,0,148,10,161,8,84,1,40,66,0,20,64
    DB 2,16,68,0,144,2,32,128,2,80,141,112,21,98,213,11
    DB 199,63,23,95,47,181,82,36,220,39,208,73,96,146,111,136
    DB 100,51,93,55,95,26,143,150,75,229,34,88,36,154,64,149
    DB 64,168,0,66,16,68,0,32,4,129,16,0,164,1,0,164
    DB 0,64,21,128,98,157,230,255,255,255,255,255,255,255,255,252
    DB 254,251,253,254,255,255,255,255,255,255,255,255,255,255,255,255
    DB 255,255,255,255,255,255,255,255,255,255,255,255,255,255,251,249
    DB 182,250,84,184,208,90,160,24,162,8,165,16,68,17,0,84
    DB 1,32,8,130,160,200,224,242,252,255,255,252,247,252,249,246
    DB 249,229,243,213,234,214,226,212,238,192,236,213,204,230,212,236
    DB 198,229,246,194,243,233,243,248,245,248,254,253,254,255,253,255
    DB 253,254,241,222,32,217,100,153,100,146,68,162,16,202,32,146
    DB 72,34,153,194,41,216,138,245,222,111,250,127,255,127,255,255
    DB 247,253,255,254,255,255,255,255,255,255,255,255,255,255,255,255
    DB 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,247
    DB 221,227,153,229,146,65,168,130,144,192,164,224,233,240,249,252
    DB 250,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255
    DB 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
    DB 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
    DB 255,255,255,255,253,246,217,238,81,174,81,46,65,44,18,41
    DB 20,33,52,74,48,109,210,116,82,125,86,59,29,63,95,55
    DB 127,95,119,125,223,123,127,223,127,126,223,127,127,255,255,255
  • #10 35757
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Ok, teraz rozumiem o co Ci chodzi :D

    Dim Daneint As Integer , Danelong As Long , Temp As Byte

    Restore Daneint
    For Temp = 1 To 3
    Read Daneint
    Print Daneint
    Next
    Restore Danelong
    For Temp = 1 To 3
    Read Danelong
    Print Danelong
    Next
    End

    Daneint:
    Data 12345% , 1234% , 32100%
    Danelong:
    Data 1234567& , 321212& , 151213&
  • REKLAMA
  • #11 35950
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Dzięki wielkie już pracuję nad programem :D

Podsumowanie tematu

✨ Dyskusja dotyczy problemu umieszczania zmiennych typu integer w tablicach w Bascom8051 do adresowania pamięci EEPROM AT24C64. Autor próbuje zapisać dane większe niż bajt (0-255), aby efektywnie zarządzać adresacją pamięci dla sterowania wyświetlaczem graficznym podzielonym na strony i kolumny. Proponowano rozdzielenie integera na dwa bajty (starszy i młodszy) i przechowywanie ich osobno, jednak wiąże się to z dużym zużyciem RAM. Zasugerowano obliczanie adresów za pomocą wzoru i pętli For...Next, co pozwala na sekwencyjny zapis i odczyt danych bez konieczności stosowania dużych tablic. Podano wzór łączenia dwóch bajtów w integer: Integer = starszy_bajt * 256 + młodszy_bajt. W Bascom8051 można deklarować tablice różnych typów (Byte, Integer, Long), ale w kontekście zapisu do EEPROM ważne jest rozdzielenie danych na bajty i odpowiednie ich przesyłanie. Przykładowy kod pokazuje zapis do EEPROM z rozdzieleniem adresu na dwa bajty i wykorzystaniem podprogramu Write_eeprom. Dyskusja podkreśla ograniczenia pamięci RAM mikrokontrolera i specyfikę pracy z pamięcią EEPROM AT24C64 w kontekście sterowania wyświetlaczem graficznym.
Wygenerowane przez model językowy.
REKLAMA