| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Прекъсване от RB0 на 16F873А http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=6549 |
Страница 1 от 1 |
| Автор: | VladoG [ Пет Фев 13, 2009 10:38 pm ] |
| Заглавие: | Прекъсване от RB0 на 16F873А |
Здравейте, Нов съм във форума. Правя и първи стъпки в програмирането. Та проблема ми е следния: Ползвам прекъсване от RB0. Поставил съм бутон. Първото прекъсване работи. Второ няма. Преди излизане от програмата за обслужване на прекъсването нулирам INTCON,1. Необходимо ли е да се прави още нещо? |
|
| Автор: | bobyper [ Пет Фев 13, 2009 11:01 pm ] |
| Заглавие: | |
така едва ли някой ще помогне. Дай малко код да видиме, какво става в прекъсването |
|
| Автор: | VladoG [ Пет Фев 13, 2009 11:08 pm ] |
| Заглавие: | |
Подпрограмата за обслужване на прекъсването: org 0x04 INTR movwf W_Temp ; Save W register swapf STATUS,W ; Swap status to be saved into W movwf STATUS_Temp ; Save STATUS register movfw PCLATH movwf PCLATH_Temp ; Save PCLATH goto interupt banksel INTCON bcf INTCON,1 ; INTCON,INTF INTX movfw PCLATH_Temp movwf PCLATH ; Restore PCLATH swapf STATUS_Temp,W movwf STATUS ; Restore STATUS register - restores bank swapf W_Temp,F swapf W_Temp,W ; Restore W register retfie И инициализациите на двата регистъра: banksel INTCON movlw B'11010000' movwf INTCON nop banksel OPTION_REG movlw B'10000000' movwf OPTION_REG |
|
| Автор: | thegza [ Съб Фев 14, 2009 12:41 am ] |
| Заглавие: | |
Струва ми се, че не смъкваш флага за прекъсването. |
|
| Автор: | bobyper [ Съб Фев 14, 2009 10:34 pm ] | |||||||||
| Заглавие: | ||||||||||
Прексъсването не е наред с тези пипания по PCLATH Това е достатъчно
Ама защо не ползваш някое C вместо assempler |
||||||||||
| Автор: | Popeye [ Нед Фев 15, 2009 6:13 pm ] |
| Заглавие: | |
16F873А има една неприятна особеност, мястото на записа на W, STATUS и PCLATH регистрите при входа в обработването на прекъсването зависи от състоянието на бита RP0 в самия STATUS регистър. Тоест, ако W_Temp, STATUS_Temp и PCLATH_Temp са декларирани на адреси примерно 70h, 71h и 72h при RP0 = 0 ще се запишат точно там, обаче ако RP0 = 1 ще се запишат на F0h, F1h и F2h. Ако в прекъсването се променя стойността на RP0 резултатите са непредсказуеми, инструкцията banksel INTCON прави точно това. Тя нулира PR0 и W, STATUS и PCLATH ще се възстановят от адреси 70h, 71h и 72h, незаисимо, че са били записани в F0h, F1h и F2h ако RP0 е бил в 1. Между другото INTCON е достъпен във всички банки, така че banksel INTCON е излишна. Заради тази особеност никога не съм ползвал PIC16F873A/874A, слагам 876A/877A, декларирам W_Temp, STATUS_Temp и PCLATH_Temp някъде между 70h и 7Fh и ми е мирна главата. Бих предложил следния код: ; Възстановява STATUS както е бил при влизането в прекъсването swapf STATUS_Temp,W movwf STATUS ; Restore STATUS register - restores bank ;Регистрите се четат от банката, в която са били записани movfw PCLATH_Temp movwf PCLATH ; Restore PCLATH swapf STATUS_Temp,W movwf STATUS ; Restore STATUS register - restores bank swapf W_Temp,F swapf W_Temp,W ; Restore W register retfie Разбира се, ако W_Temp, STATUS_Temp и PCLATH_Temp са на адреси примерно 70h - 72h , адресите F0h - F2h в банка 1 не трябва да се ползват нито в главната програмат, нито в прекъсването. Гаранции не давам, все пак никога не съм го проверявал |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|