문제

Pic Assembler에서 은행 전환으로 혼란스러워 ... 이것은 Usart에 'Q'를 넣는 데 효과적입니다.

bsf PORTB,1         ;Set Transmit DIR (PORTB (0x6) not mirrored in other banks)
movlw 'Q'           ;'Q' to work reg
movwf TXREG         ;work reg to TXREG (TXREG (0x19) not mirrored in other banks)
clrwdt              ;Clear watchdog
btfss TXSTA,TRMT    ;Wait until 'Q' is shifted (TXSTA is 0x18, not mirrored)
goto $-2
bcf PORTB,1         ;Set Recive DIR

그리고 이것은 마찬가지로 잘 작동합니다.

BCF 0x3, 0x5        ;Switch to bank 0
BCF 0x3, 0x6
bsf PORTB,1         ;Set Transmit DIR
movlw 'Q'           ;'Q' to work reg
movwf TXREG         ;work reg to TXREG 
BSF 0x3, 0x5        ;Switch to bank 1
clrwdt              ;Clear watchdog
btfss TXSTA,TRMT    ;Wait until 'Q' is shifted
goto $-2
BCF 0x3, 0x5        ;Switch to bank 0
bcf PORTB,1         ;Set Recive DIR

보고 있지 않을 때 컴파일러가 은행 스위칭을하지 않는지 확인했습니다. 은행을 전환해야 할 때?

도움이 되었습니까?

해결책

먼저 어떤 PIC 장치를 사용하고 있습니까? 또한 어떤 컴파일러를 사용하고 있습니까?

그러나 코드가 작동하는 이유는 UART에 TX에해야 할 모든 것이 은행 0에 있기 때문입니다. Port B에 대한 글은 아무것도하지 않고 있습니다. Trisb를 전환하고 싶다고 생각합니다. UART는 포트 B에 쓰는 핀을 제어 할 수 있습니다. 두 번째 예에서 당신은 당신이 TXSTA라고 생각하는 것을 폴링하고 있지만 은행 0 은행이 아닌 은행 1에 있습니다. 나는 당신이 잘못된 위치를 폴링하여 운이 좋으며 비트는 항상 올바른 상태에 있으므로 루프가 종료 될 것이라고 생각합니다.

전송을 할 때 우선이 비어 있는지 먼저 확인하고 그 때까지 기다린 다음 숯을 보내는 것을 선호합니다. 예를 들어 다음 숯을 얻기 위해 인터 루트를 사용하지 않는 한 전송을 끝내기를 기다릴 필요가 없습니다.

따라서 MOVWF TXREG를 수행 할 때 모두 은행 0에 있기 때문에 두 코드 모두 작동합니다. 나머지는 하드웨어로 처리됩니다.

편집 : 이제 TXSTA가 은행 1에 있다는 부분이 정확하다는 것을 알았으므로 0x18로 주소에 대한 의견을 가지고 있었기 때문에 0x98이어야합니다. 첫 번째 예에서는 TXSTA가 아닌 OERR 인 RCSTA 비트 1을 폴링합니다. 그래서 그것이 작동한다면 이것은 OERR = 1이 가능하다는 것을 의미합니다.

다른 팁

은행을 사용하여 은행을 자동으로 전환하는 것이 가장 좋습니다. 그것은 특별한 어셈블러 지침으로, 어셈블러에게 올바른 은행으로 전환하도록 지시합니다. 따라서 PORTB에 액세스하려면 Banksel (PORTB)을 사용하기 전에 만하십시오.

추신 : PORTB는 코드에서와 같이 Bank1이 아닌 PIC16 제품군의 Bank0에 있습니다.

나도 은행 선택이 이해하기가 매우 어렵다는 것을 알았습니다.

I2C 기능을 위해 PIC12F1822S를 사용하여 프로젝트를 시작하고 있습니다. 배경을 연구하는 것은 스레드의 타래를 풀고있는 것과 비슷합니다. 각각은 분명해지기 전에 많은 어려움이 필요합니다. 내가 뽑아 낸 스레드 중 하나는 "Banksel"지침에 대한 설명입니다.

배경. 장치 작동에 도움이되는 수십 개의 SFR (특수 기능 레지스터)이 있습니다. 너무 많은 것이 있기 때문에 각각 32 개의 SFR 중 0 ~ 31 개로 32 개의 은행으로 구성되어 있습니다. SFRS는 형태 (비트)로 순차적으로 번호를 매겼습니다. bbbbbfffffff 어디 BBBBB 은행 번호입니다 fffffff 은행의 상쇄입니다. 그들의 값은 PIC의 .inc 파일에 정의되며 순서에는 많은 간격이 있습니다. 은행의 SFR 오프셋의 경우 0 ~ 30의 비트 만 충분하지만 은행의 경우 31 비트가 필요합니다.

이 SFR 중 하나에 액세스 할 때는 은행 번호가 BSR 레지스터에 있어야하며 "MOVLB"어셈블러 명령에 의해 설정되어 있어야합니다. 이것을 쉽게하기 위해 SFR의 각 액세스 전에 사용할 수있는 지침 "Banksel"이 있습니다. (다른 사진에서, 상태 레지스터의 비트는 은행 번호를 보유하고 있습니다) 성공적인 테스트 후 불필요한 은행을 제거 할 수 있습니다. 내 퍼즐 (지금까지 이것을 설정 한 후 - 문서의 정보는 드물고 흩어져 있음) 은이 지침의 작동 방식이었습니다. 물론, 코드가 생성되기 전에 어셈블러가 평가 한 것입니다. 이것은 계산을 수행하기 위해 EQU를 사용하여이를 확인하고 설명하는 테스트 코드입니다. .) :

        ;BANKSEL is a directive that does the equivalent of 
        ;       movlb  (<SFRname> & 0XF0) >> 7

        ;For example TRISA is defined in P12F1822.INC as:

        ;-----Bank1------------------
        TRISA            EQU  H'008C' 

   Assembler:
   Locn   Resulting value     Line  Original code line content ";" is a comment
   ~~~~   ~~~~~~~~~~~~~~~     ~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                              00047 ; Test of equivalent of BANKSEL directive          
          0000008C            00048 selbank equ TRISA
          00000080            00049 selbnk1 equ selbank & 0XF80 ; Extract bank no. ..
          00000001            00050 selbnk2 equ selbnk1 >> 7 ; .. move it to the right
          0000000C            00051 selbnk3 equ TRISA & 0XF80 >> 7 
        [ Operator precedence: >> (bit shift right) higher than & (bitwise AND) ]
          0000000C            00052 selbnk4 equ TRISA & (0XF80 >> 7) ; default
          00000001            00053 selbnk5 equ (TRISA & 0XF80) >> 7 ; as needed`
                     . . .
   006C   0021                00100 movlb  1           ; Should be same as next line
   006D   0021                00101 banksel TRISA       
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top