Memcopy

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
demsy
Posty: 24
Rejestracja: 30 sie 2015, 22:06

Memcopy

Post autor: demsy » 08 paź 2016, 13:19

Witam
Mam pytanie co do kodu poniżej ze strony Bartka. Chciałbym dokonać szybkiego kopiowania pomiedzy tablicami z tym że do sześciu Led(1), Led(2)...
nie wiem jak to dopisać
$regfile = "m32def.dat" $crystal = 8000000 Ddra = &B11111111 : Porta = &B11111111 Ddrb = &B00011111 : PORTB = &B11100000 Ddrc = &B11111111 : Portc = &B00000000 Ddrd = &B11111111 : PORTD = &B00000000 Config TIMER2 = Timer , Prescale = 8 , Compare = Disconnect , Clear Timer = 1 Enable COMPARE2 : On COMPARE2 Int0_isr : COMPARE2 = 124 Enable Interrupts '****************** Zmienne ******************* '*********************************************** Dim Licznik As Byte Dim Led(6) As Byte Dim Leds_pwm As Byte , M As Byte , Speed As Byte , Old_val As Byte D1 Alias Portc.0 : D2 Alias Portc.1 : D3 Alias Portc.2 : D4 Alias Portc.3 : D5 Alias Portc.4 D6 Alias Portc.5 Sw1 Alias PINB.5 Sw2 Alias Pinb.6 Do If Speed = 0 Then If Sw1 = 0 Then If Leds_pwm < 100 Then Incr Leds_pwm End If If Sw2 = 0 Then If Leds_pwm > 0 Then Decr Leds_pwm End If If Old_val <> Leds_pwm Then 'jesli wartość różni się od poprzedniej Old_val = Leds_pwm ' to zapamiętaj tę wartość Speed = 127 - Leds_pwm ' odejmij aktualną wartość PWM od 127 Shift Speed , Left , 1 ' Pomnóż razy dwa M = Memcopy(leds_pwm , Led(1) , 3 , 2 , 4 , 6 , 5)' tak nie działa End If End If Loop '************ Przerwanie timer 0 *************** '*********************************************** Int0_isr: Incr Licznik If Licznik = 100 Then Licznik = 0 If Licznik < Led(1) Then Set D1 Else Reset D1 If Licznik < Led(2) Then Set D2 Else Reset D2 If Licznik < Led(3) Then Set D3 Else Reset D3 If Licznik < Led(4) Then Set D4 Else Reset D4 If Licznik < Led(5) Then Set D5 Else Reset D5 If Licznik < Led(6) Then Set D6 Else Reset D6 If Speed > 0 Then Decr Speed Return
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Memcopy

Post autor: niveasoft » 08 paź 2016, 23:34

W memcopy po nawiasie podajesz co ma być źródłem danych do skopiowania
Po przecinku podajesz gdzie to kopiować.
Po następnym przecinku podajesz ile bajtów chcesz skopiować.
Na samym końcu podajesz "opcję"

Chodzi w tym o to że, dla przykładu, chciałbyś wszystkie elementy wypełnić jedną wartością "A" czyli 65
Wtedy podajesz wartośc 65 jako te bazową, ale ona jest jedna, to nie jest tablica.
Chciałbyś więc by caly czas tylko ten jeden znak 65 był kopiowany, ale do kolejnych bajtów tablicy.
Wtedy wybiera się opcję 2 - gdzie tylko adres docelowy danych jest zwiększany a ten adres źródła jest stały

Nie chciałbym mącić w głowie, ale w druga stronę działa to tak że można w jedno miejsce, na przykład port, wysyłac kolejne dane z tablicy i wtedy wybieramy opcje 1 :D Wtedy kolejne bajty będą się pojawiać na wybranym porcie.

Wracając do pytania syntax powinien wyglądać mniej więcej tak M=Memcopy(Led(1),Led(2),5,2) 'skopiuj 5 razy wartość Led(1) do kolejnych Led(2),Led(3),Led(4) ,Led(5) itd zaczynając od Led(2)
demsy
Posty: 24
Rejestracja: 30 sie 2015, 22:06

Re: Memcopy

Post autor: demsy » 09 paź 2016, 21:51

Nie do końca rozumiem, ale napisałem coś takiego i działa
M = Memcopy(leds_pwm , Led(1) , 6 , 2 ) M = Memcopy(led(2) , Led(6) , 1 )
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Memcopy

Post autor: niveasoft » 10 paź 2016, 0:02

Nie wiedziałem skąd chciałeś kopiować dane, ale ten Twój pierwszy zapis to robi
Oznacza "Skopiuj wartosć Leds_pwm do sześciu kolejnych bajtów tablicy Led() zaczynając od pierwszego. Opcja 2 załatwia sprawę w ten sposób, że tylko adresy tablicy Led() sie zwiekszają i cały czas kopiowana jest jedna wartość.

Drugi zapis natomiast jest dziwny i działa tylko dlatego że kopiowana jest tylko jedna wartość :D
Równie dobrze mógłbyś napisać Led(6) = Led(2) :D
demsy
Posty: 24
Rejestracja: 30 sie 2015, 22:06

Re: Memcopy

Post autor: demsy » 11 paź 2016, 8:39

Chciałem "skopiować" wartość z leds_pwm do Led(1), Led(2)... Led(6)
taki zapis mi nie działa
M = Memcopy(leds_pwm , Led(1) , 3 , 2 , 4 , 6 , 5)
ODPOWIEDZ