Frage

Ich bin von Bankumschaltung in PIC-Assembler verwirrt ... Das funktioniert für die Umsetzung eines ‚Q‘ auf dem USART:

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

Und das funktioniert genauso gut:

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

Ich habe überprüft, dass der Compiler keine Bankumschaltung nicht tun, wenn ich nicht bin gerade ... Wann muss Bank wechseln?

War es hilfreich?

Lösung

Als erstes which pic-Gerät verwenden Sie denn das würde einen geringfügigen Unterschied macht. die auch Compiler Sie verwenden.

Doch der Grund, Ihr Code funktioniert, weil alles, was Sie zum uart zu tx tun müssen, in Bank 0 Ihr Schreiben in Port b ist nichts tun, ich vermute ich, dass Sie die TRISB wechseln wollen, und das ist in der Bank 1 aber da die uart hat Steuerung der Schreibstifte an Port B es sich von selbst keine Wirkung hat. In Ihrem zweiten Beispiel sind Sie Polling, was denken Sie TXSTA ist, aber das ist in Bank 0 1 keine Bank ich vermute ich, dass Sie durch die Abfrage falschen Stelle Glück haben und das Bit ist immer im richtigen Zustand, so dass die Schleife beendet.

Wenn ich einen Sende ich lieber zuerst sehen, ob die uart leer ist, und warten Sie, bis es ist, und dann das Zeichen senden. Keine Notwendigkeit zu warten, bis es Sandte zu beenden, wenn Sie eine Interrupt beispielsweise verwenden, um die nächsten Zeichen zu erhalten.

Also beiden Teile des Codes arbeiten, weil Sie in der Bank sind 0 in beide, wenn Sie movwf TXREG. Der Rest wird in Hardware für Sie behandelt.

Edit: Nun, da ich weiß, dass der Teil, den Sie in diesem TXSTA korrekt sind, ist in Bank 1. Sie durch mich, weil Sie einen Kommentar der Adresse als 0x18 hatte und es sollte 0x98 sein. Im ersten Beispiel sind Sie Polling RCSTA Bit 1, das die OERR nicht TXSTA ist. Also, wenn es funktioniert, bedeutet dies, dass OERR = 1, die sehr gut möglich ist, ich es in der Regel klar, wenn ich irgendetwas tun mit dem Empfang.

Andere Tipps

Es ist am besten, nur BANKSEL zu benutzen, um Ihre Bankumschaltung automatisch zu tun. Es ist eine besondere Assemblerdirektive die den Assembler auf die richtige Bank wechseln erzählt. Also, wenn Sie wollen PORTB zugreifen zu können, nur BANKSEL (PORTB), bevor es zu benutzen.

PS:. PORTB ist in BANK0 auf der PIC16-Familie, nicht BANK1 wie im Code

Ich fand auch Bankauswählsignal zu verstehen, sehr schwierig.

Ich beginne ein Projekt mit PIC12F1822s, für ihre I2C-Funktionalität. den Hintergrund Researching ist eher wie ein Knäuel von Fäden zu entwirren, die jeweils eine Menge zu kämpfen muss, bevor es klar kommt. Eines der Themen habe ich es geschafft zu ziehen ist eine Erklärung der „BANKSEL“ Richtlinie.

Hintergrund. Es gibt mehrere Dutzend SFRs - Special Function Register - die Unterstützung bei der Bedienung des Gerätes, in den unteren Datenspeicher abgebildet. Weil es so viele sind, sind sie in 32 Banken organisiert, nummeriert von 0 bis 31, von 32 SFRs je. Die SFRs sequentiell in der Form (Bits) nummeriert sind bbbbbfffffff , wobei bbbbb ist die Banknummer und fffffff ist in der Bank der Offset. Ihre Werte werden in der .INC Datei definiert für die PIC, und es gibt viele Lücken in der Sequenz. Beachten Sie, dass für die SFR-Offsets in Banken 0 bis 30 nur fünf Bits ausreichend sind, aber für die Bank 31 sieben Bits erforderlich sind.

Wenn eines dieser SFRs Zugriff auf ihre Banknummer in dem BSR-Register sein muß, die von dem „MOVLB“ Assemblerbefehl gesetzt. Um dies zu leicht gibt es eine Richtlinie „BANKSEL“, die vor jedem Zugriff eines SFR verwendet werden kann. (In anderen PICs, Bits im Statusregister halten die Banknummer) Nach erfolgreicher Prüfung, überflüssige BANKSELs entfernt werden können. Mein Puzzle (nach dieser bisher Gründung - die Informationen in der Dokumentation ist spärlich und verstreut) war, wie diese Richtlinie funktioniert. Es ist, natürlich, durch den Monteur vor jedem Code ausgewertet wird produziert, und dies ist mein Testcode, check it out, EQU mit den Berechnungen zu tun, und erklären sie (Anmerkung LOCN ist „Ort“, dh die Adresse des Befehls .):

        ;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       
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top