Prośba o pomoc w połączeniu 5 bajtów

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Awatar użytkownika
Karlos128@nos
Posty: 64
Rejestracja: 18 sie 2015, 13:32

Prośba o pomoc w połączeniu 5 bajtów

Post autor: Karlos128@nos » 17 lut 2025, 23:57

Witam sznownych, piszę bibliotekę dla INA228 i ustałem w miejscu w odczycie rejestru - strona 26 Energy Result (ENERGY) Register (Address = 9h) . mój problem polega na tym że za groma nie moge połączyć tych pięciu bajtów
do jednego typu DOUBLE, próbowałem na shiftach i nic komplilator wawala jakieś błędy. Chodzi o to że ten rejestr przechowuje wartość 40 bit i jak je wydostać z tego kawałka krzemu i scalić w jedeną zmienną.
Zapodaję ostatnią moją próbę, ale kompilator wywala błąd error - 31. Bardzo bym prosił o pomoc w tej programistycznej matmie.
  1. Dim Charge_1 As Byte                                        ' Tablica przechowująca 5 bajtów rejestru CHARGE
  2. Dim Charge_2 As Byte
  3. Dim Charge_3 As Byte
  4. Dim Charge_4 As Byte
  5. Dim Charge_5 As Byte
  6. Dim Charge_40bit As Double                                  ' Surowa wartość z rejestru CHARGE (40 bitów)
  7. Dim Charge_ah As Dword                                      ' Wynik w amperogodzinach (Ah)
  8. Dim Text_ah As String * 8
  9. Dim Dane1 As Double
  10. Dim Dane2 As Double
  11. Dim Dane3 As Double
  12. Dim Dane4 As Double
  13. Dim Dane5 As Double
  14. ' Funkcja odczytu rejestru CHARGE
  15. ' Funkcja łączenia bajtów w 40-bitową liczbę
  16. Sub Read_charge_ina228
  17.  
  18. '   Local Temp1 As String * 3
  19. '   Local Temp2 As String * 3
  20. '   Local Temp3 As String * 3
  21. '   Local Temp4 As String * 3
  22. '   Local Temp5 As String * 3
  23. '   Local Temp As String * 40
  24.     ' Odczyt 5 bajtów z rejestru CHARGE (adres = 0x0A)
  25.    I2cstart #6
  26.    I2cwbyte Ina228_aaddress_write , #6                     ' Adres urządzenia + Write
  27.    I2cwbyte Ina228_charge , #6                              ' Adres rejestru CHARGE
  28.    I2crepstart #6
  29.    I2cwbyte Ina228_aaddress_read , #6                       ' Adres urządzenia + Read
  30.     ' Pobierz 5 bajtów
  31.    I2crbyte Charge_1 , Ack , #6
  32.    I2crbyte Charge_2 , Ack , #6
  33.    I2crbyte Charge_3 , Ack , #6
  34.    I2crbyte Charge_4 , Ack , #6
  35.    I2crbyte Charge_5 , Nack , #6
  36.    I2cstop #6
  37.  
  38.    Dane1 = 4294967296 * Charge_1
  39.    Charge_40bit = Dane1
  40.    Dane2 = 16777216 * Charge_2
  41.    Charge_40bit = Charge_40bit + Dane2
  42.    Dane3 = 65536 * Charge_3
  43.    Charge_40bit = Charge_40bit + Dane3
  44.    Dane4 = 256 * Charge_4
  45.    Charge_40bit = Charge_40bit + Dane4
  46.    Dane5 = Charge_5
  47.    Charge_40bit = Charge_40bit + Dane5
  48.  
  49.     ' Połączenie wszystkich bajtów za pomocą operacji OR
  50. '   Charge_40bit = Charge_raw(1)
  51.  
  52. '   Połącz 5 bajtów w jedną liczbę 40-bitową
  53. '   Temp1 = Str(charge_raw(1))
  54. '   Temp2 = Str(charge_raw(2))
  55. '   Temp3 = Str(charge_raw(3))
  56. '   Temp4 = Str(charge_raw(4))
  57. '   Temp5 = Str(charge_raw(5))
  58. '   Temp = Temp1 + Temp2
  59. '   Temp = Temp + Temp3
  60. '   Temp = Temp + Temp4
  61. '   Temp = Temp + Temp5
  62. '   Text_40bit = Temp
  63. '   Charge_40bit = Val(temp)
  64. '   Charge_40bit = Charge_40bit * 0.000038147                ' Charge_40bit=double
  65.  
  66. End Sub
ina228.pdf
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
Karlos128@nos
Posty: 64
Rejestracja: 18 sie 2015, 13:32

Re: Prośba o pomoc w połączeniu 5 bajtów

Post autor: Karlos128@nos » 18 lut 2025, 16:53

Wygląda na to że zmienna double działa w tej bascomowej matmie z innym double.
Na przykład : double = byte *100 i tego nie uznaje kompilator, ale jak zrobię w ten sposób: double_1 = double_2 * 100 to jest okej.
Jakoś pokonałem ten problem, mój pomysł na te 40bit działa, chociaż wydaje się że raczej to on optymalny nie jest.
  1.    Local Bit_5 As Double
  2.    Local Bit_4 As Double
  3.    Local Bit_3 As Double
  4.    Local Bit_2 As Double
  5.    Local Bit_1 As Double
  6.    ' Wszyskie Dane1,Dane2... też double
  7.    I2cstart #6
  8.    I2cwbyte Tca9546w , #6
  9.    I2cwbyte &H08 , #6                                       '00
  10.    I2cstop #6
  11.    Waitms 20
  12.    I2cstart #6
  13.    I2cwbyte Ina228_aaddress_write , #6                      ' Adres urządzenia + Write
  14.    I2cwbyte Ina228_charge , #6                              ' Adres rejestru CHARGE
  15.    I2crepstart #6
  16.    I2cwbyte Ina228_aaddress_read , #6                       ' Adres urządzenia + Read
  17.     ' Pobierz 5 bajtów
  18.    I2crbyte Kolumb(1) , Ack , #6
  19.    I2crbyte Kolumb(2) , Ack , #6
  20.    I2crbyte Kolumb(3) , Ack , #6
  21.    I2crbyte Kolumb(4) , Ack , #6
  22.    I2crbyte Kolumb(5) , Nack , #6
  23.    I2cstop #6
  24.  
  25.    Bit_5 = Kolumb(1)
  26.    Bit_4 = Kolumb(2)
  27.    Bit_3 = Kolumb(3)
  28.    Bit_2 = Kolumb(4)
  29.    Bit_1 = Kolumb(5)
  30.  
  31.    Dane1 = 4294967296 * Bit_5
  32.    Dane2 = 16777216 * Bit_4
  33.    Dane3 = 65536 * Bit_3
  34.    Dane4 = 256 * Bit_2
  35.    Dane5 = Bit_1
  36.  
  37.    Kolumb_40bit = 0
  38.    Kolumb_40bit = Kolumb_40bit + Dane1
  39.    Kolumb_40bit = Kolumb_40bit + Dane2
  40.    Kolumb_40bit = Kolumb_40bit + Dane3
  41.    Kolumb_40bit = Kolumb_40bit + Dane4
  42.    Kolumb_40bit = Kolumb_40bit + Dane5
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Prośba o pomoc w połączeniu 5 bajtów

Post autor: niveasoft » 19 lut 2025, 13:28

A to zamiast tego monożenia nie prościej przez Overlay a do odczytu uzyc I2creceive i wciagnąć pięc bajtów na raz?
  1. Dim Mydouble As Double
  2. Dim Mybuff(8) As Byte At Mydouble Overlay
  3. Dim Kulomb(5) As Byte
  4.  
  5. I2creceive Ina228_aaddress_write , Kulomb(1) , 0 , 5 , #6  'podaje sie adres do zapisu bo możesz też coś od razu wysłać, samo robi start i stop
  6.  
  7. Mybuff(8) = Kulomb(1)
  8. Mybuff(7) = Kulomb(2)
  9. Mybuff(6) = Kulomb(3)
  10. Mybuff(5) = Kulomb(4)
  11. Mybuff(4) = Kulomb(5)
  12.  
  13. Print Mydouble
Nie jestem pewien co do kolejności tych bajtów (czy trzeba je odwracać) bo jesli nie to mozna to zrobić jeszcze prościej.
Wczytać pięć bajtów do Mybuff i potem to przesunąć o trzy bajty czyli Shift 24 Right
A może na bezczelnego I2creceive Mybuff(4) , 0 ,5 :D Powinno zapisać w odpowiednich bajtach i przesuwanie niepotrzebne :D

Troche dziś nie mam głowy ale coś w ten deseń.

Co do tego że wypada działać na takim samym typie zmiennej to jest to opisane w Helpie. Dopiero po tym robi sie rzutowanie (casting) jeśli potrzebne.
Casting

In BASCOM-AVR when you perform operations on variables they all must be of the same data type.

long = long1 * long2 ' for example

The assigned variables data type determines what kind of math is performed.

For example when you assign a long, long math will be used.

If you try to store the result of a LONG into a byte, only the LSB of the LONG will be stored into the BYTE.

Byte = LONG

When LONG = 256 , it will not fit into a BYTE. The result will be 256 AND 255 = 0.

Of course you are free to use different data types. The correct result is only guaranteed when you are using data types of the same kind or that result always can fit into the target data type.
ODPOWIEDZ