سؤال

وأنا اتلقى عن طريق التحول البنك الخلط في المجمع PIC ... وهذا يعمل لوضع 'Q' على 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

وهذا يعمل مثلما جيدة:

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

ولقد راجعت أن المترجم لا تفعل أي تحويل مصرفي عندما لا أكون مشاهدة ... عندما لا يكون لتبديل البنك؟

هل كانت مفيدة؟

المحلول

أولا الجهاز الذي تستخدمه لأن ذلك لا تجعل اختلاف طفيف الموافقة المسبقة عن علم. أيضا التي المترجم الذي تستخدمه.

ولكن السبب يعمل التعليمات البرمجية الخاصة بك لأن كل ما عليك القيام به لتكساس إلى UART في البنك 0. يكتب الخاصة بك إلى ميناء ب لا تفعل شيئا وأنا على التخمين الذي تريد تبديل trisb والتي هي في البنك 1 ولكن منذ UART تسيطر على دبابيس الكتابة إلى ميناء B هو النفس له أي تأثير. في المثال الثاني كنت الاقتراع ما هو في رأيك TXSTA ولكن هذا هو في البنك 0 لا المصرفية 1. أنا على التخمين أن كنت محظوظا بالاقتراع موقع خاطئ وبت هو دائما في الحالة الصحيحة حتى تنتهي الحلقة.

عند أفعل الإرسال أنا أفضل أن نرى أولا إذا كان UART فارغ وانتظر حتى هو، وبعد ذلك ترسل شار. لا حاجة للانتظار لحين الانتهاء الإرسال إلا إذا كنت ترغب في استخدام يقطع على سبيل المثال للحصول على شار المقبل.

وهكذا كل من قطعة من عمل كود لأنك في البنك 0 في كلا عندما لم movwf TXREG. تتم معالجة بقية في الأجهزة بالنسبة لك.

وتحرير: الآن وأنا أعلم أن الجزء الذي على صواب في ذلك TXSTA في البنك 1. يمكنك من خلال لي لأن كان لديك تعليق من العنوان كما 0x18 وينبغي أن يكون 0x98. في المثال الأول كنت الاقتراع RCSTA بت 1 وهو OERR لا TXSTA. حتى إذا كان يعمل هذا يعني أن OERR = 1 التي من الممكن جدا وعادة ما مسحها عندما أفعل أي شيء مع التلقي.

نصائح أخرى

فمن الأفضل أن مجرد استخدام BANKSEL للقيام البنك الذي تتعامل معه التحول تلقائيا. وهو التوجيه المجمع الخاص ليقول المجمع للتبديل إلى المصرفي الصحيح. لذا، إذا كنت ترغب في الوصول إلى PORTB، فقط BANKSEL (PORTB) قبل استخدامه.

وPS: PORTB في BANK0 على الأسرة PIC16، وليس BANK1 كما في التعليمات البرمجية

وأنا أيضا وجدت اختيار البنك من الصعب جدا أن نفهم.

وأنا بدأت مشروع باستخدام PIC12F1822s، للحصول على الوظائف I2C بهم. البحث في الخلفية هو بالأحرى مثل فك تشابكات على خصلة خيوط من المواضيع، كل واحد يحتاج الى الكثير من الكفاح قبل أن يأتي واضح. واحدة من المواضيع لقد تمكنت من الانسحاب هو شرح التوجيه "BANKSEL".

والخلفية. هناك عشرات SFRs - سجلات وظيفة خاصة - التي تساعد في تشغيل الجهاز، تعيين في الذاكرة بيانات أقل. لأن هناك الكثير من يتم تنظيمها في 32 البنوك، مرقمة من 0 إلى 31 من 32 SFRs لكل منهما. يتم ترقيم SFRs بالتتابع في شكل (بت) <م> bbbbbfffffff حيث <م> BBBBB هو عدد البنوك و<م> fffffff هو الإزاحة في البنك. يتم تعريف القيم في ملف خفيفة لPIC، وهناك العديد من الثغرات في التسلسل. لاحظ أن لإزاحة SFR في البنوك 0-30 بت فقط خمسة كافية، ولكن بالنسبة البنك 31 بت سبعة ضرورية.

عند الوصول إلى واحدة من هذه SFRs يجب أن يكون عدد البنك في السجل BSR، وهو يحدد من قبل "MOVLB" تعليمات المجمع. لجعل هذا سهلا هناك توجيه "BANKSEL" التي يمكن استخدامها من قبل كل من وصول SFR. (في بلدان جزر المحيط الهادئ الأخرى، بت في تسجيل حالة عقد عدد البنوك) بعد تجارب ناجحة، أي BANKSELs زائدة يمكن إزالتها. بلدي لغز (بعد إنشاء هذا حتى الآن - المعلومات الواردة في وثائق متفرقة ومبعثرة) كان كيف يعمل هذا التوجيه. هو، بالطبع، تقييمها من قبل المجمع قبل أي رمز تنتج، وهذا هو بلدي رمز اختبار للتحقق من ذلك، وذلك باستخدام EQU للقيام بهذه العمليات الحسابية، وتفسير ذلك (لاحظ locn هو "المكان" أي عنوان التعليمة .):

        ;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