Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Програмиране на PIC16C73
http://mcu-bg.com/mcu_site/viewtopic.php?f=16&t=7772
Страница 1 от 1

Автор:  mitky406 [ Нед Апр 25, 2010 1:55 pm ]
Заглавие:  Програмиране на PIC16C73

Насочиха ме към вас та по темата
Начинаещ съм в тази среда, за това моля за малко помощ.
Имам за задача на направя програма на асемблер,която:
1.Да се състави подпрограма, пресмятаща израза:
R=A.7+2.B-49
,където A и B са еднобайтови променливи в данновата памет
2. Подпрограмата да се извиква за елементите на 2 масива от по 32 байтови числа.

Измисленото от мен до момента:

---------------------------------------------------
#include "P16C73.inc"
REGA equ 0x20
RLA equ 0x21
RHA equ 0x22
REGB equ 0x23
RLB equ 0x24
RHB equ 0x25
RRR equ 0x26
MAS equ 0x30
org 0x0000
goto start
org 0x0010
FOR
movf REGA,0
movwf RLA
bcf STATUS,C
rlf RLA,1
rlf RHA
rlf RLA,1
rlf RHA
movf RLA,0
addwf REGA,0
btfsc STATUS,C
incf RHA,1
addwf REGA,0
btfsc STATUS,C
incf RHA,1
addwf REGA,0
btfsc STATUS,C
incf RHA,1
movwf RLA
movf REGB,0
movwf RLB
bcf STATUS,C
rlf RLB,1
rlf RHB
btfsc STATUS,C
incf RHB,1
movf RLA,0
addwf RLB,0
btfsc STATUS,C
incf RHB,1
movwf RLB
movf RHA,0
addwf RHB,0
movwf RHB
retlw 0
start

next
movlw MAS
movwf REGA

call FOR
goto next
NOP
END
----------------------------------------
Първия ми въпрос е как от двубайтово число да извадя числото 49
(не съм много сигурен дали двубайтовото ми събиране е правилно, за това моля някой да му хвърли едно око)
Другия ми въпрос е защо когато от масива зареждам символите в данновата памет вмето да отива стойността от клетката отива адреса на масива
Пример с началото. Ако задам началото на масива да е числото 4 в REGA не отива стойността 4, а отива 30?
(масива съм го поизтрил малко, защото ме ядоса)

Автор:  ji4ka [ Пон Апр 26, 2010 2:15 am ]
Заглавие: 

Четенето на масив става през INDF и FSR. Първо във FSR се зарежда адреса на клетката и след това стойността й се прочита от INDF. Може просто да инкрементираш FSR и четеш INDF-a.

;================================================
; Double Precision Addition/Subtraction 16bit 2's compl.
;================================================
;
Sub16s
movf BL,w
subwf AL,f
movf BH,w
skpc
incfsz BH,w
subwf AH,f
return
;
Add16s
movf BL,w
addwf AL,f ; add lsb.AN526
skpnc ; add in carry
incf AH,f
movf BH,w
addwf AH,f ; add msb
return

Автор:  mitky406 [ Пон Апр 26, 2010 2:05 pm ]
Заглавие: 

Много ти благодаря!
Само едно малко върпосче това което си ми написал "skpc " и "skpnc" това да го разбирам, че е тест на бит при преход? При мен ще бъде btfsc нали?

Автор:  ji4ka [ Пон Апр 26, 2010 2:20 pm ]
Заглавие: 

skpc = btfss status,C - пропусни ако е Ц (кери,пренос)
skpnc = btfsc status,C (пропусни ако е неЦ или нулЦ)
Това са съкратени изписвания ,валидни в микрочипския асемблер, но ти по-добре си ползвай пълния запис. Има и skpz, skpnz и разни други.

Автор:  mitky406 [ Пон Апр 26, 2010 4:44 pm ]
Заглавие: 

Там при изваждането не трябва ли да бъде decfsz вместо incfsz . Все пак намаляваме или аз нещо съм в грешка?
Още едно въпросче мога ли направо да напиша subwf 0x31 за числото 49

Автор:  mitky406 [ Пон Апр 26, 2010 5:08 pm ]
Заглавие: 

Отговора на последни въпрос е sublw 0x31 ако на някой му трябва все пак.
(трябва да ги науча всички функции :idea: )

Автор:  mitky406 [ Пон Апр 26, 2010 8:57 pm ]
Заглавие: 

Всичко стана идеално. ГОЛЯМО БЛАГОДАРЯ!

п.п: Имам и за 8086 задачка ама да се надяваме да не ви занимавам.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/