2016-09-16 1 views
0

어셈블리에서 PIC16F887 또는 이와 유사한 것을 사용하여 모든 뱅크에서 레지스터를 어떻게 정의 할 수 있습니까?모든 은행에서 레지스터를 정의하는 방법은 무엇입니까?

파일은 STATUS 비트를 변경하지 않고 액세스해야합니다.

인터럽트 루틴에 들어가기 전에 W 레지스터를 임시 파일 (W_TEMP)에 저장하려고합니다. 마이크로 칩 문서에서

:

사용자 등록, W_TEMP, 모든 은행을 통해 정의해야하고, 즉, W_TEMP는 0x70에서 정의 된 은행의 기본 주소 (오프셋 같은에서 정의해야합니다 - 0x7F의)

답변

3

인터럽트가 우리가 WSTATUS을 저장해야 발생하지만 STATUS가 RAM에 이미 다른에 RAM 위치에서 레지스터를 이동 아무런 지시가없는, 그래서 먼저 복사해야합니다 Bank0에의 W으로 입력 한 다음 fi로 목적지.
즉, 및 STATUS정확히 주문에 저장해야 함을 의미합니다.

  1. 저장 W
  2. W
  3. 로 이동 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을 수정해야하므로 이는 해결할 수없는 문제로 보입니다.
는 다행히 우리는 그것을 저장 WSTATUS를 이동해야하는, 그래서 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 

: WSTATUSMOVF 변화 때문에 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_TEMPSTATUS_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 추가 정보를 찾을 수있다.
일부 의견은 기껏해야 신빙성이 있으며 최악의 경우 오도하는 것에주의하십시오.

+0

멋진. 나는 "#define"트릭을 놓치고있었습니다. 고맙습니다. –

관련 문제