كيفية الحصول على قيمة من دبوس ال15 من ميناء 32BIT وفي ARM؟

StackOverflow https://stackoverflow.com/questions/1810308

سؤال

وأنا باستخدام IC، DS1620 لقراءة البيانات التسلسلية 1 بت المقبلة على خط واحد. لست بحاجة لقراءة هذه البيانات باستخدام أحد الموانئ متحكم ARM (LPC2378). الموانئ ARM هي 32 بت. كيف يمكنني الحصول على هذه القيمة إلى متغير 1 قليلا؟

وتحرير: وبعبارة أخرى أحتاج إشارة مباشرة إلى دبوس المنفذ

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

المحلول

وليس هناك متغيرات 1 بعض الشيء، ولكن هل يمكن عزل قليلا معين على سبيل المثال:

uint32_t original_value = whatever();
uint32_t bit15 = (original_value >> 15) & 1; /*bit15 now contains either a 1 or a 0 representing the 15th bit */

ملحوظة: أنا لا أعرف ما إذا كنت قد عد الأرقام قليلا ابتداء من الساعة 0 أو 1، وبالتالي فإن >> 15 قد يكون من جانب واحد، ولكن تحصل على هذه الفكرة

.

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

وعموما، هذا قد تكون ذات فائدة لك.

نصائح أخرى

لوحدة المعالجة المركزية الخاصة بك ينبغي أن تستخدم الجواب من ايفان تيران. أردت فقط أن أذكر ميزة الفرقة قليلا من بعض الآخر CPU ARM مثل اللحاء M3. بالنسبة لبعض منطقة RAM / ملحقات يتم تعيين كل بت لعنوان منفصل ليسهل الوصول إليها.

HTTP: / /infocenter.arm.com/help/index.jsp؟topic=/com.arm.doc.ddi0337e/Behcjiic.html للحصول على مزيد من المعلومات.

وانها بسيطة إذا كنت تستطيع الوصول إلى المنفذ تسجيل مباشرة (ليس لدي أي خبرة مع ARM)، فقط أحادي المعامل AND مع قناع ثنائي الذي يتوافق مع بت تريد:

var = (PORT_REGISTER & 0x00008000);

والآن فار يحتوي إما 0 إذا بت ال15 هو '0' أو 0x00008000 إذا بت ال15 هو "1".

وبالإضافة إلى ذلك، يمكنك تغيير ذلك إذا كنت تريد أن يكون إما '0' أو '1':

var = ((PORT_REGISTER & 0x00008000) >> 15);

وملف رأس (ق) التي تأتي مع إرادة مترجم يحتوي على الإعلانات لجميع سجلات متحكم، ووبت في تلك السجلات.

في هذه المادة تحديدا، دعونا نتظاهر بأن السجل منفذ الإدخال يسمى PORTA، والشيء الذي تريد لديه قناع المحددة لذلك دعا PORTA15.

وبعد ذلك لقراءة حالة أن دبوس:

PinIsSet = (PORTA & PORTA15) == PORTA15;

وأو مكافئ، وذلك باستخدام الثلاثي مشغل :

PinIsSet = (PORTA & PORTA15) ? 1 : 0;

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

في LPC2378 (كما العائلة الأخرى متحكم LPC2xxxx)، I / O الموانئ في ذاكرة النظام، لذلك تحتاج إلى إعلان بعض المتغيرات مثل هذا:

#define  DALLAS_PIN (*(volatile unsigned long int *)(0xE0028000)) /* Port 0 data register */
#define  DALLAS_DDR (*(volatile unsigned long int *)(0xE0028008)) /* Port 0 data direction reg */
#define  DALLAS_PIN (1<<15)

تجدر الإشارة إلى أن 0xE0028000 هو عنوان لتسجيل البيانات من port0، و0xE0028008 هو عنوان السجل الاتجاه البيانات لport0. تحتاج إلى تعديل ذلك وفقا للميناء وقليلا المستخدمة في التطبيق الخاص بك. بعد ذلك، في وظيفة التعليمات البرمجية، رمز أو وحدات الماكرو للكتابة 1، والكتابة 0 وقراءة يجب أن يكون شيئا من هذا القبيل:

#define  set_dqout()    (DALLAS_DDR&=~DALLAS_PIN)   /* Let the pull-up force one, putting I/O pin in input mode */
#define  reset_dqout()  (DALLAS_DDR|=DALLAS_PIN,DALLAS_PORT&=~DALLAS_PIN) /* force zero putting the I/O in output mode and writing zero on it */
#define  read_dqin()    (DALLAS_DDR&=~DALLAS_PIN,((DALLAS_PORT & DALLAS_PIN)!= 0)) /* put i/o in input mode and test the state of the i/o pin */

وآمل أن يكون هذا يمكن أن تساعد.

والتحيات!

وإذا كان الاختبار لهذه المعاهدات، وأنه من الجيد أن نأخذ في الاعتبار ترتيب التقييم مشغل C، على سبيل المثال

if( port & 0x80 && whatever() )

ويمكن أن يؤدي إلى سلوك غير متوقع، كما كتبت فقط

if( port & (0x80 && whatever()) )

ولكن ربما منة

if( (port & 0x80) && whatever() )
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top