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

малко пояснения за PIC 16F84A ??
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=6985
Страница 1 от 1

Автор:  vedball [ Чет Юли 16, 2009 12:58 pm ]
Заглавие:  малко пояснения за PIC 16F84A ??

днеска реших да инсталирам пак MPLAB за да видя какво съм забравил и какво си спомням от Асемблера и написах една простичка програма която 1-во зарежда константа в 5 псоледователни клетки от паметта и след това нулира клетките. Простичко....
Но след като стигне до нулирането на 5-тата кл. би трябвало програмата да свърши (така съм му кзал), но не е така. Стойностите на Работния р-р започват да броят до 0 и като стигне 0 айде пак от 255 :?: защо е така ? аз ли бъркам нещо ?

моля за малко пояснения


ето го и кода:

list p=16F84A
#include <p16F84A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

ORG H'00'
GOTO start
ch1 EQU B'11000000' давам имена на адресите
ch2 EQU B'11000001'
ch3 EQU B'11000010'
ch4 EQU B'11000011'
ch5 EQU B'11000100'
start MOVLW D'24' зареждам работния р-р с 24
MOVWF ch1 зареждам адресите с 24
MOVLW D'24'
MOVWF ch2
MOVLW D'24'
MOVWF ch3
MOVLW D'24'
MOVWF ch4
MOVLW D'24'
MOVWF ch5
MOVLW ch1 зареждам адреса на 1-вото число
MOVWF FSR в FSR
CLRF INDF нулирам 1-вото число
et1 INCF FSR,1 зареждам адреса на следващото число
CLRF INDF нулирам го
BTFSS FSR,2 проверявам 3-тия по ред бит на FSR, ако е 1 означава че е обработен и 5-тия адрес и би трябвало прог. да иде на E N D, ако е 0 ще се формира още един адрес
GOTO et1
GOTO et2
et2 NOP
end


Да не би да е така, защото NOP нетрябва да стои преди END ?
май имаше нещо такова но не съм сигурен :?
....а проблема настъпва точно когато стигне до NOP

Автор:  Zeus [ Чет Юли 16, 2009 2:34 pm ]
Заглавие: 

Дано не бъркам, че от доста време не съм правил програми на асемблер, но дефакто процесора ти не трябва да стига до end, защото после не се знае къде отива. Трябва да осигуриш примерно безкраен цикъл в края на програмата и да се върти там след като приключи с това дето си му задал.

Автор:  vedball [ Чет Юли 16, 2009 2:52 pm ]
Заглавие: 

аха...то яво като езае къде да отива започва да брой докато е се спре захраваето...

О.К. мерси pal 8)

Автор:  Gogo [ Чет Юли 16, 2009 4:09 pm ]
Заглавие: 

Това: et2 NOP го сложи преди GOTO et2

Автор:  vedball [ Пет Юли 17, 2009 10:28 am ]
Заглавие: 

:) да...тогажа схте се оформи тоя безктаен цикъл, за който говорихме :)

Автор:  RM [ Пет Юли 17, 2009 11:05 am ]
Заглавие: 

На много места имам спомени че слагаха slip пред end

Автор:  optron [ Вто Авг 11, 2009 11:19 am ]
Заглавие: 

Някои неща, които им направиха впечатление:
Не, че ще повлияят на работата на програмата ти, но при оптимизиране ще помогнат.
Когато зареждаш регистрите с една и съща стойност, няма нужда да зареждаш работния регистър всеки път.
Тоест, това:
Код:
MOVLW D'24'
MOVWF ch1
MOVLW D'24'
MOVWF ch2
MOVLW D'24'
MOVWF ch3
MOVLW D'24'
MOVWF ch4
MOVLW D'24'
MOVWF ch5

Може да стане и така:
Код:
MOVLW D'24'
MOVWF ch1
MOVWF ch2
MOVWF ch3
MOVWF ch4
MOVWF ch5

Другото, което видях е, че двата рета преди END са напълно излишни:
Код:
BTFSS FSR,2
GOTO et1
GOTO et2
et2 NOP
end

Става:
Код:
BTFSS FSR,2
GOTO et1
end

Сега ПДФ-а не е пред мен и не мога да кажа със сигурност, но провери адресите, които си задал дали не се припокриват случайно с някой специален регистър и оттам да ти се получава неясното поведение. За удобство, ползувай шестнадесетични, вместо двоични числа.
За подсигуряване, вместо да проверяваш един бит от адресния регистър, може да го сравняваш с ch5 Когато се изравни или стане по-голямо, прекратяваш програмата. Ако се чудиш, сравняването става чрез изваждане. ;)

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