[ Mikrokontroleri @ 16.07.2011. 20:36 ] @
Molio bih [es] Team da mi pomogne oko jednog zadatka iz Mikrokontrolera koji glasi : Bafer veličine 5 bajtova napuniti sa 0xFF. U prvu lokaciju posle kraja bafera upisati 0x00. Upisati u bafer 3,6,12,24. Izaći iz programske petlje kada se dođe do podatka 0x00 upisanog u bafer. Znam da se ova tema ponavljala kao i ovaj zadatak izvinjavam se u napred . Napisao sam kod do pola a od pola ne znam ni da beknem.

Code:

main

LFSR FSR0,buffer
movlw c_buffer_length
movwf Loop_counter
clrf WREG
main_loop0
movlw 0xFF
movwf POSTINC0
decfsz Loop_counter
bra main_loop0
movlw 0x00

U pitanju je PIC 18F4520 . Bio bih do neba zahvalan ako bi neko od [es] Team mogao da mi pomogne . Ako ne mozete da mi pomognete bar mi dajte neke smernice, literaturu na internetu ili mozda cak neki pokusaj resenja ovog zadatka stvarno ne mogu da resim drugu polovinu.Pozdrav i izvinite na uznemiravanju. Molio bih odgovor .Pozdrav
[ jumper2high @ 31.07.2011. 00:15 ] @
Ae da probam da pomognem ako nije kasno :)

Prvo, da li sam razumeo dobro: Poenta je da se prvo bafer napuni 0xFF, a zatim u njega upisu brojevi 24, 12, 6, 3 i 0, i iskoci iz petlje?
[ Mikrokontroleri @ 31.07.2011. 12:53 ] @
Da
[ jumper2high @ 31.07.2011. 13:09 ] @
Znaci algoritam bi bio:

a) Inicijalizovati dva registra da cuvaju adresu i 'offset' bafera
b) Proci kroz ciklus od offset=4 do offset=0 i set-ovati* vrednost na 0xFF
c) Inicijalizovati pomocni registar na vrednost 24.
d) Proci kroz ciklus od offset=4 do offset=0, setovati* vrednost bafera (na datom offset-u) na vrednost pomocnog registra, zatim shiftovati vrednost desno bez prenosa (RRNCF ako je PIC18F4520)



* PIC kontroleri imaju mogucnost 'indirektnog' adresiranja registara u memoriji, koriscenjem FSR registra (file select register) [upisivanjem adrese zeljenog registra ovde] i citanjem ili pisanjem u INDF registar.

Dakle, recimo, ako stavimo da je adresa bafera 0x20, i hocemo da upisemo 0xFF u ceo registar islo bi:


while offset > 0
FSR = 0x20+OFFSET
INDF = 0xFF
DECR OFFSET

[ Mikrokontroleri @ 31.07.2011. 18:56 ] @
Hvala na algoritmu.Pokusacu da napisem kod pa cu da vam javim ili dokle sam stigao
[ Mikrokontroleri @ 31.07.2011. 23:18 ] @
Evo napisao sam deo koda jos je ostalo da napisem za Izaci iz programske petlje kada se dodje do podatka 0x00 upisanog u bafer.
Code:

Main

lfsr FSR0,buffer
movlw c_buffer_length
movwf loop_counter
clrf WREG

Main_loop0

movlw 0xFF
movwf POSTINC0
decfsz loop_counter
bra Main_loop0
movlw 0x00
movlw 3
Main_loop1
CPFSGT INDF0
Bra main_upisi
main_upisi
addlw 3
movwf POSTINC0
bra Main_loop1
[ jumper2high @ 31.07.2011. 23:42 ] @
Ne znam koliko ces nauciti o programiranju u asembleru ako koristis neki visi programski jezik i zatim prevedes u Asembler.

Na osnovu izgleda koda, mislim da je C u pitanju? :) Mislim da je cak i nepotrebno zakomplikovan kod bas zato.
[ Mikrokontroleri @ 31.07.2011. 23:56 ] @
Dao sam moguce resenje ali ako ne valja onda kako da uradim . Zadatak treba uraditi u Asembleru
[ jumper2high @ 01.08.2011. 09:18 ] @
Instrukcije

movlw 0x00
movlw 3


Pune W registar nulom, a zatim brojem tri.
Nigde ne upisujes te registre u buffer kroz onaj POSTINC registar.

Kasnije,

ADDLW 3 znaci da dodajes 3 na W registar, al' tvoj niz brojeva bi trebao da bude 3, 6, 12, 24 (svaki je 2 puta veci od prethodnog).
bolje bi bilo da shift-ujes bez carry-ja levo i time 'mnozis' sa dva.


Takodje, INDF0 registar drzi VREDNOST na adresi stavljenoj u FSR0 registar. Proveravas da li je INDF0 > 0 instrukcijom CPFSGT INDF0?

[ Mikrokontroleri @ 02.08.2011. 19:56 ] @
Ispravite me ako gresim instrukcija movff WREG, buffer_end ovo verovatno znaci da se sadrzaj WREG prepise (kopira) u buffer_end a u to u mom zadatku trebalo da 0x00 prepisem u buffer_end (na poslednju lokaciju u baferu pa tek onda mogu da upisem 3,6,12,24). Zanimame da li sam upravu ako nisam onda gde sam pogresio.
[ Mikrokontroleri @ 03.08.2011. 13:33 ] @
Evo napisao sam kod koji bi trebalo da valja ali samo je jos ostalo da napisem da izadjem iz programske petlje kada se dodje do podatka 0x00.

Main
lfsr FSR0,buffer
movlw c_buffer_length
movwf loop_counter
clrf WREG
Main_loop0
movlw 0xFF
movwf POSTINC0
decfsz loop_counter
bra Main_loop0
movlw 0x00
movff WREG,buffer_end
Main_loop1
movf 3
rlncf
rlncf
rlncf
movf INDF0,W
bra Main_loop1

Ne znam kako da napisem instrukciju za rotiranje registra f stao mi mozak pokusavao sam na razlicite nacine ali pokazuje gresku.
[ jumper2high @ 03.08.2011. 16:52 ] @
Rotiranje je RLCF i RLNCF (with and without Carry) LEVO i RRCF RRNCF desno (with and without Carry).


Mozda pomogne :)
[ Mikrokontroleri @ 03.08.2011. 20:06 ] @
Hvala na pomoci ali kako da napisem u ovom mom zadatku.Inace sta mislite o resenju da li je tacno.
[ Mikrokontroleri @ 12.08.2011. 14:04 ] @
Da li sam dobro napisao kod?