Problem z tablicą dwu wymiarową

Pytania, kody i porady dotyczące nie tylko Bascom.
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Problem z tablicą dwu wymiarową

Post autor: Pikczu » 14 kwie 2019, 18:49

Cześć,
Staram się rozkminić przechowywanie danych w tablicach dwu wymiarowych.
Niby proste a jednak jest problem.
Online help mówi iż:
https://wiki.mcselec.com/bavr/DIM
Lets see how memory is organized when using multiple indexes. For the sample we use an array of 5x3 bytes.
'popatrzmy jak pamięć jest zorganizowana gdy używamy wielu indexów. Dla przykładu użyjemy tablicy 5 x 3 bajtów.
Dim ar(5,3) as byte.

This gives us the following possible index values :
To da nam następujące wartości indexu:
1,1 1,2 1,3

2,1 2,2 2,3

3,1 3,2 3,3

4,1 4,2 4,3

5,1 5,2 5,3
Since the memory of the processor is linear, we have 15 cells.
ponieważ pamięć procesora jest liniowa mamy 15 komórek.
Tabela z helpa patrz tabela 1
tab.PNG
Jak dotąd logiczne.
Natomiast w realu wychodzi inaczej.
Zmieniając zawartość tablicy 1 o indeksie 2 jakimś dziwnym sposobem zawartość nie trafia do komórki z kolejnym adresem.
Tabela_2.PNG
Natomiast testując funkcję memcopy wszytko działa jak należy index jest zmieniany liniowo.
Widać to na przykładzie wartości 17 która zostaje wpisana do tablicy po zakończeniu funkcji memcopy.
Tabela 3.PNG
Dla testu napisałem mały przykład trzeba go odpalić w symulatorze i oglądać zawartość komórek pamięci.
  1.  
  2. $regfile = "m8def.dat"
  3. $crystal = 16000000
  4. $hwstack=40
  5. $swstack=16
  6. $framesize = 32
  7.  
  8.  
  9.  
  10. Dim Multi_array(16 , 6) As Byte                             'destination array
  11. dim A as byte 'used for for next to fill up array
  12. dim byte_count as byte   'used for memcopy to store amount of copied bytes
  13. Dim index as byte 'index for array idex
  14. dim source_array(6) as byte 'source array
  15.  
  16. 'test1
  17.  
  18.  
  19.  
  20. Multi_array(1 , 1) = 1
  21. Multi_array(1 , 2) = 1
  22. Multi_array(1 , 3) = 1
  23. Multi_array(1 , 4) = 1
  24. Multi_array(1 , 5) = 1
  25. Multi_array(1 , 6) = 1
  26.  
  27. Multi_array(2 , 1) = 2
  28. Multi_array(2 , 2) = 2
  29. Multi_array(2 , 3) = 2
  30. Multi_array(2 , 4) = 2
  31. Multi_array(2 , 5) = 2
  32. Multi_array(2 , 6) = 2
  33.  
  34. Multi_array(3 , 1) = 3
  35. Multi_array(3 , 2) = 3
  36. Multi_array(3 , 3) = 3
  37. Multi_array(3 , 4) = 3
  38. Multi_array(3 , 5) = 3
  39. Multi_array(3 , 6) = 3
  40.  
  41. Multi_array(4 , 1) = 4
  42. Multi_array(4 , 2) = 4
  43. Multi_array(4 , 3) = 4
  44. Multi_array(4 , 4) = 4
  45. Multi_array(4 , 5) = 4
  46. Multi_array(4 , 6) = 4
  47.  
  48. Multi_array(5 , 1) = 5
  49. Multi_array(5 , 2) = 5
  50. Multi_array(5 , 3) = 5
  51. Multi_array(5 , 4) = 5
  52. Multi_array(5 , 5) = 5
  53. Multi_array(5 , 6) = 5
  54.  
  55. Multi_array(6 , 1) = 6
  56. Multi_array(6 , 2) = 6
  57. Multi_array(6 , 3) = 6
  58. Multi_array(6 , 4) = 6
  59. Multi_array(6 , 5) = 6
  60. Multi_array(6 , 6) = 6
  61.  
  62. Multi_array(7 , 1) = 7
  63. Multi_array(7 , 2) = 7
  64. Multi_array(7 , 3) = 7
  65. Multi_array(7 , 4) = 7
  66. Multi_array(7 , 5) = 7
  67. Multi_array(7 , 6) = 7
  68.  
  69. Multi_array(8 , 1) = 8
  70. Multi_array(8 , 2) = 8
  71. Multi_array(8 , 3) = 8
  72. Multi_array(8 , 4) = 8
  73. Multi_array(8 , 5) = 8
  74. Multi_array(8 , 6) = 8
  75.  
  76. Multi_array(9 , 1) = 9
  77. Multi_array(9 , 2) = 9
  78. Multi_array(9 , 3) = 9
  79. Multi_array(9 , 4) = 9
  80. Multi_array(9 , 5) = 9
  81. Multi_array(9 , 6) = 9
  82.  
  83. Multi_array(10 , 1) = 10
  84. Multi_array(10 , 2) = 10
  85. Multi_array(10 , 3) = 10
  86. Multi_array(10 , 4) = 10
  87. Multi_array(10 , 5) = 10
  88. Multi_array(10 , 6) = 10
  89.  
  90. Multi_array(11 , 1) = 11
  91. Multi_array(11 , 2) = 11
  92. Multi_array(11 , 3) = 11
  93. Multi_array(11 , 4) = 11
  94. Multi_array(11 , 5) = 11
  95. Multi_array(11 , 6) = 11
  96.  
  97. Multi_array(12 , 1) = 12
  98. Multi_array(12 , 2) = 12
  99. Multi_array(12 , 3) = 12
  100. Multi_array(12 , 4) = 12
  101. Multi_array(12 , 5) = 12
  102. Multi_array(12 , 6) = 12
  103.  
  104. Multi_array(13 , 1) = 13
  105. Multi_array(13 , 2) = 13
  106. Multi_array(13 , 3) = 13
  107. Multi_array(13 , 4) = 13
  108. Multi_array(13 , 5) = 13
  109. Multi_array(13 , 6) = 13
  110.  
  111. Multi_array(14 , 1) = 14
  112. Multi_array(14 , 2) = 14
  113. Multi_array(14 , 3) = 14
  114. Multi_array(14 , 4) = 14
  115. Multi_array(14 , 5) = 14
  116. Multi_array(14 , 6) = 14
  117.  
  118. Multi_array(15 , 1) = 15
  119. Multi_array(15 , 2) = 15
  120. Multi_array(15 , 3) = 15
  121. Multi_array(15 , 4) = 15
  122. Multi_array(15 , 5) = 15
  123. Multi_array(15 , 6) = 15
  124.  
  125. Multi_array(16 , 1) = 16
  126. Multi_array(16 , 2) = 16
  127. Multi_array(16 , 3) = 16
  128. Multi_array(16 , 4) = 16
  129. Multi_array(16 , 5) = 16
  130. Multi_array(16 , 6) = 16
  131.  
  132.  
  133. 'test part 2
  134.  
  135. A= 17
  136.  
  137. for index = 1 to 6
  138. source_array(index) =A
  139. next index
  140.  
  141. index =1 'set index to one for memcopy
  142.  
  143.  
  144. byte_count = Memcopy(source_array(1) , Multi_array(index , 1 ) , 6 , 3)
  145.  
  146.  
  147.  
  148.  
  149. Do
  150.  
  151.  
  152. Loop
  153.  
  154. End
  155.  

Co wy na to koledzy ??
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Problem z tablicą dwu wymiarową

Post autor: niveasoft » 14 kwie 2019, 19:06

Jak zwykle nawet przy niedzieli nie ma czasu, ale logicznie na to patrząc to jeśli tablica jest 5x3 a adres 1,1 to 1 to adresem komórki 2,1 powinno być 6.
Cos akurat "cały dzień kończę" :D Popatrzę wieczorem lub w nocy.
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Problem z tablicą dwu wymiarową

Post autor: Pikczu » 14 kwie 2019, 19:31

No właśnie mnie to wstrzymuje, bo chce skończyć bibliotekę do fajnego wyświetlacza.
https://www.4dsystems.com.au/product/gen4_uLCD_70D/ Pewnie widziałeś na MCS forum.
Zmodyfikowałem fiffo od ollopa żeby odkładało całe tablice, to było akurat banalne ale przy okazji chciałem się pobawić tymi tablicami i jakoś dziwnie się one zachowują.
Albo znowu coś robię źle.
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Problem z tablicą dwu wymiarową

Post autor: niveasoft » 14 kwie 2019, 19:49

Tu może być problem.
Multiple indexes is a new feature in 2078. The simulator does not support this option yet, so for the simulator, only 1 array exists.
https://wiki.mcselec.com/bavr/DIM
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Problem z tablicą dwu wymiarową

Post autor: Pikczu » 14 kwie 2019, 20:18

Zobaczymy co na MCS odpowiedzą.
Mark mi obiecał betę nowej wersji do testu z print bin w którym można dodać ilość bajtów do wysłania.
Było by super, uprościło by to wysyłanie tablic.
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Problem z tablicą dwu wymiarową

Post autor: niveasoft » 14 kwie 2019, 20:39

Mam taki Printbin napisany "ręcznie", ale tego to widziałeś chyba.
Bierze się z mcs.lib kod do Printbin i kopiuje do swojej funkcji. Bascom ilość znaków do wysłania pakuje do R19. To ja pakuję sobie ręcznie ten R19 i wołam swoją funkcję. Działa jak złoto z MQTT ;)

Co do Marka to czasem właśnie dobrze jest coś napisać lub zapytać bo kiedyś tam pisałem kod do flash i chciałem całą stronę flash zapisywać a okazało się że po SPI można było wysyłać max 255 bajtów. Mark napisał - poczekaj chwilę- ahahaha i już testowałem Config SPI = Extended do 65535 bajtów i to weszło w nastepnym Bascom :D

Dzisiaj wymodziłem bibliotekę do ADS1220 taki czterokanałowy 24bit ADC po SPI z wieloma dodatkowymi funkcjami. Nawet działa. Coś pewnie przyjdzie dopieścić.
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Problem z tablicą dwu wymiarową

Post autor: Pikczu » 14 kwie 2019, 21:21

O fajny aż 24 bity wypas.
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Problem z tablicą dwu wymiarową

Post autor: Pikczu » 15 kwie 2019, 9:25

Zmodyfikowany print widzialem, ale on nie bedzie dzialal z xmega.
Bedziesz mial czas to popatrz na ta tablice bo wydaje mi sie ze nie dziala jak potrzeba.
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Problem z tablicą dwu wymiarową

Post autor: Pikczu » 16 kwie 2019, 22:28

Mózg mi się lasuje od tej tablicy.
MWS dał mi przykład ale chyba tylko po to żeby bardziej utrudnić:
  1. $Regfile="m328pdef.dat"
  2. $Crystal=16000000
  3. $hwstack=40
  4. $swstack=16
  5. $framesize=32
  6.  
  7. Config Base = 0
  8.  
  9. Const A_size = 7
  10. Const B_size = 4
  11. Const C_size = 6
  12.  
  13. Const A_width = 1
  14. Const B_width = A_size
  15. Const C_width = A_size * B_size
  16.  
  17. Const arr_size = A_size * B_size * C_size
  18.  
  19. Dim mult_arr(A_size, B_size, C_size) As Byte
  20. Dim linarr(arr_size) As Byte At mult_arr Overlay
  21.  
  22.  
  23. Dim A As Byte, A_ptr As Byte
  24. Dim B As Byte, B_ptr As Byte
  25. Dim C As Byte, C_ptr As Byte
  26. Dim linptr As Byte
  27.  
  28. A = 3 : B = 2 : C = 4
  29.  
  30.   mult_arr(A,B,C) = 29
  31.  
  32. A_ptr = A
  33. B_ptr = B * B_width
  34. C_ptr = C * C_width
  35. linptr = A_ptr + B_ptr : linptr = linptr + C_ptr
  36.   Print linarr(linptr)
  37.  
  38. A = 3 : B = 0 : C = 5
  39.  
  40.   mult_arr(A,B,C) = 36
  41.  
  42. A_ptr = A
  43. B_ptr = B * B_width
  44. C_ptr = C * C_width
  45. linptr = A_ptr + B_ptr : linptr = linptr + C_ptr
  46.   Print linarr(linptr)
  47.  
  48. A = 1 : B = 1 : C = 1
  49.  
  50.   mult_arr(A,B,C) = 96
  51.  
  52. A_ptr = A
  53. B_ptr = B * B_width
  54. C_ptr = C * C_width
  55. linptr = A_ptr + B_ptr : linptr = linptr + C_ptr
  56.   Print linarr(linptr)
  57.  
  58. end


Aha ponoć tabela z helpa przedstawiająca indeksy jest błędna :( :(

Próbuje sobie pomóc używając varptr() może coś mi się rozjaśni:
  1. $regfile = "m128def.dat"
  2. $crystal = 4000000
  3. $hwstack = 128
  4. $swstack = 128
  5. $framesize = 128
  6.  
  7.  
  8. Config Base = 0
  9.  
  10. Const A_size = 7
  11. Const B_size = 4
  12. Const C_size = 6
  13.  
  14. Const A_width = 1                                           '1
  15. Const B_width = A_size                                      '7
  16. Const C_width = A_size * B_size                             '28 = 4x7
  17.  
  18. Const Arr_size = A_size * B_size * C_size                   '168 =7x 4x6
  19.  
  20. Dim Mult_arr(a_size , B_size , C_size) As Byte
  21. Dim Linarr(arr_size) As Byte At Mult_arr Overlay            '168
  22.  
  23.  
  24. Dim A As Byte , A_ptr As Byte
  25. Dim B As Byte , B_ptr As Byte
  26. Dim C As Byte, C_ptr As Byte
  27. Dim Linptr As Byte
  28.  
  29. A = 3 : B = 2 : C = 4
  30. Mult_arr(a , B , C) = 29                                    '3,2,4=29
  31. Print Hex(varptr(mult_arr(a , B , C)))
  32. A_ptr = A                                                   '3
  33. B_ptr = B * B_width                                         '14=2x7
  34. C_ptr = C * C_width                                         '112=4x28
  35. Linptr = A_ptr + B_ptr : Linptr = Linptr + C_ptr            '129
  36.   Print Linarr(linptr)
  37.  
  38. A = 3 : B = 0 : C = 5
  39.  
  40.   Mult_arr(a , B , C) = 36
  41. Print Hex(varptr(mult_arr(a , B , C)))
  42. A_ptr = A
  43. B_ptr = B * B_width
  44. C_ptr = C * C_width
  45. linptr = A_ptr + B_ptr : linptr = linptr + C_ptr
  46.   Print linarr(linptr)
  47.  
  48. A = 1 : B = 1 : C = 1
  49. Print Hex(varptr(mult_arr(a , B , C)))
  50.   mult_arr(A,B,C) = 96
  51. Print Hex(varptr(mult_arr(a , B , C)))
  52. A_ptr = A
  53. B_ptr = B * B_width
  54. C_ptr = C * C_width
  55. linptr = A_ptr + B_ptr : linptr = linptr + C_ptr
  56.   Print linarr(linptr)
  57. Print Hex(varptr(mult_arr(a , B , C)))
  58. End
Mój mózg nie jest na to gotowy przynajmniej nie dziś.
Obrazek
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Problem z tablicą dwu wymiarową

Post autor: Pikczu » 16 kwie 2019, 23:20

Dobra mam światło w tunelu nie jest takie trudne jak mi się wydawało (chyba).
Jutro będę testował dalej.
ODPOWIEDZ