Printbin variable length

Proste przykłady do częstych pytań.
ODPOWIEDZ
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Printbin variable length

Post autor: niveasoft » 07 lip 2017, 16:27

Przypuśćmy, że masz bufor 250 znaków o nazwie Array(250)
Z jakiegoś źródła otrzymujesz do niego dane o różnej długości a teraz zależy Ci żeby wysłać tylko tyle ile otrzymałeś.

Polecenie Printbin przyjmuje jako argument ilości do wysyłki tylko stałe
Trzeba więc napisać Printbin Array(1) co wyśle całą tablicę, albo wpisać Printbin Array(1),Stała

Printbin Array(1), Zmienna ODPADA!

Można oczywiście poradzić sobie budując taką niewygodną i wolną konstrukcję:
  1. Dim Array(250) As Byte, N As Byte, Helpb As Byte, Zmienna As Byte
  2.  
  3. For N = 1 To Zmienna
  4.  Helpb = Array(n)
  5.   Printbin Helpb
  6. Next
To jednak nieeleganckie :P

Po podejrzeniu jak Bascom wykonuje Printbin widać że ilość bajtów do wysłania ładuje do R19
Na aktualny adres komórki do wysłania wskazuje X
Kiedy wartość spod X jest odczytywana to automatycznie adres się zwiększa o jeden (X+)
Potem uC sprawdza czy rejestr wysyłkowy USART jest wolny (lub czy poprzedni bajt już wysłano)
Jeśli nie to wraca z powrotem w miejsce gdzie znów sprawdza czy rejestr jest już wolny.
Kiedy uda się wstawić bajt do rejestru to odejmuje jeden od liczby bajtów do wysłania.
Jeśli stwierdza że trzeba wysłać kolejny to wraca na początek po nowy bajt z kolejnej komórki na którą wskazuje X ;)

Tak wiec napisałem sobie SUB który na początku ładuje do X pierwszą pozycję mojego bufora.
Do R19 ładuję ilość danych do wysyłki i ...gotowe ;)

Poniżej przykład dla symulatora. Z 10 bajtów o wartościach ASCI 1,2,3.. wyśle tylko 6 a nie 10 :D
  1. $regfile = "m2560def.dat"
  2. $crystal = 16000000
  3. $hwstack = 64
  4. $swstack = 64
  5. $framesize = 255
  6. $baud = 9600
  7. $baud1 = 9600
  8.  
  9. $sim
  10.  
  11. Config Submode = New
  12.  
  13. Open "COM2:" For Binary As #2
  14.  
  15. Dim Array(10) As Byte , Helpb As Byte , N As Byte , Chrs_to_send As Byte
  16.  
  17. 'załaduj "cyferkami" 123456789
  18. For N = 49 To 57
  19.  Incr Helpb
  20.   Array(helpb) = N
  21. Next
  22.  
  23.  
  24.  
  25.  
  26.  
  27. Sub Print_bin
  28.  R19 = Chrs_to_send                                         'załaduj liczbę bajtów do wysłania
  29.   Loadadr Array(1) , X                                      'ustaw pointer na pierwszy bajt tablicy
  30.     Start_point:
  31.     !LD        R24, X+              'do R24 załaduj bajt na który wskazuje pointer i zwiększ adres+
  32.     Wait_for_empty:
  33.     !LDS       R0, UCSR1A                                   'odczytaj rejestr kontrolujacy USART
  34.     !SBRS      R0, UDRE1        'sprawdź czy bit "rejestr gotowy na nowe dane" jest ustawiony
  35.     !RJMP Wait_for_empty
  36.     !STS       UDR1, R24                                    'wstaw dane z R24 do rejestru USART
  37.     !DEC       R19                                          'zmniejsz liczbę bajtów do wysyłki
  38.     !BRBC      1,Start_point                                'jeśli to nie koniec (R19<>0) to wróć na początek
  39. End Sub
  40.  
  41. Chrs_to_send = 6
  42.  Call Print_bin
  43.  
  44. End
Pikczu
Posty: 388
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Printbin variable length

Post autor: Pikczu » 07 lip 2017, 20:47

Fantastycznie kolego Bartku.
ODPOWIEDZ