인터럽트가 우리가 W
및 STATUS
을 저장해야 발생하지만 STATUS
가 RAM에 이미 다른에 RAM 위치에서 레지스터를 이동 아무런 지시가없는, 그래서 먼저 복사해야합니다 Bank0에의 W
으로 입력 한 다음 fi로 목적지.
즉, 및 STATUS
을 정확히 주문에 저장해야 함을 의미합니다.
- 저장
W
W
- 로 이동
STATUS
저장 W
(= STATUS
)
우리는 W
로 이동하기 전에 STATUS
을 수정할 수 없습니다 또는 우리가의를 복원 할 수 없을거야, 지금 잠재적으로 잃어버린 원래의 가치; 우리는 저축 후 이동 W
저장을위한 특정 은행을 선택하기 위해 수정할 수 없습니다 W
.
인터럽트가 발생하면 어떤 뱅크라도 선택할 수 있으므로 은에 W
을 저장할 수 있어야합니다.
우리는
#define W_TEMP 0x40
이
이 주소는 0x40 + 0x40을 0x80으로는, +로 0x100로 0x100는 0x180 + 0 × 40이되어야 함을 의미 사용하는 경우 모든 수
고려이 위치에 의해 갑자기 덮어 쓸 수 있기 때문에, 우리의 프로그램에 의해 예약 인터럽트.
이
는
하고는이고, 모든 뱅크에 걸쳐 정의되어야하고 뱅크베이스 어드레스로부터의 오프셋과 동일한 정의되어야
사용자 레지스터 W_TEMP의 의미 , 아마도 명확하지 않을 수도 있습니다. W_TEMP
은 모든 은행에 있습니다 (또는 은행이 저장되지 않으면 은행이 전혀 없음). 레지스터를 "정의"하려면 오프셋을 설정합니다. 즉 숫자입니다.우리가주의해야 STATUS
을 저장 오면 ISR를 수정하기 때문에
, 우리는 어떤 은행에 저장 할 수 없으며 STATUS
이 저장된 은행에게 원래 RP<1:0>
비트를 잃게됩니다.
은행을 선택하여 사용해야합니다. 보통 일부 칩에는 RAM 만 있기 때문에 일반적으로 뱅크 0입니다.
은행을 설정하려면 STATUS
을 수정해야하므로 이는 해결할 수없는 문제로 보입니다.
는 다행히 우리는 그것을 저장 W
에 STATUS
를 이동해야하는, 그래서 W
에되면 우리는 (W
지금) 원래 STATUS
을 변경하지 않고 현재 은행을 설정 BCF
명령을 사용할 수 있습니다.
예제 코드
#define W_TEMP 0x70
#define STATUS_TEMP 0x71
MOVWF W_TEMP ;Save W
SWAPF STATUS, W
BCF STATUS, RP0 ;Set bank0
MOVWF STATUS_TEMP ;Save STATUS
주 : W
에 STATUS
이 MOVF
변화 때문에 Z
플래그 필요하고, 복원시 사용할 수 없습니다 저장 SWAPF
의 사용.
ISR이 동작은 상술 한 상태를 복원 한 후
는 PIC16F887 같이, RAM의 일부는 모든 뱅크에서 공유 가지고 역순
SWAPF STATUS_TEMP, W
MOVWF STATUS ;Restore STATUS (and bank)
;There is no load W from memory without affecting flags
SWAPF W_TEMP, F ;We swap W_TEMP in place (no flags affected)
SWAPF W_TEMP, W ;Then swap W_TEMP in W (this restoring W)
일부 장치를 수행해야한다.
이 부분은 모든 뱅크의 마지막 16 바이트이며 오프셋 0x70-0x7f입니다. 이 경우
는 W_TEMP
및 STATUS_TEMP
경우 우리가 절약 문맥 동안 은행을 전환 할 필요가 없습니다가 정의되어 있습니다
#define W_TEMP 0x70
#define STATUS_TEMP 0x71
MOVWF W_TEMP
SWAPF STATUS, W
MOVWF STATUS_TEMP
이것은
(즉, W_TEMP가 0x70에 정의 된 설명 - Bank0의 0x7F)
견적 부분. 인터럽트 처리에 대한
in this Microchip document about it 추가 정보를 찾을 수있다.
일부 의견은 기껏해야 신빙성이 있으며 최악의 경우 오도하는 것에주의하십시오.
멋진. 나는 "#define"트릭을 놓치고있었습니다. 고맙습니다. –