Заставить кнопки включить светодиодную подсветку базового экрана ввода-вывода chipKIT и платы Uno32 - PullRequest
0 голосов
/ 28 сентября 2019

Справочная информация

У меня есть плата Uno32 с 32-разрядным процессором MIPS и базовым экраном ввода-вывода, который идет вместе с ним.Помимо прочего, IO-щит имеет восемь светодиодных индикаторов и четыре кнопки.Приведенная ниже программа включает светодиодный индикатор 1 на время нажатия кнопки 1.Я прокомментировал код с моей интерпретацией того, что делает каждая строка, и включил дополнительное объяснение ниже кода.Мой фактический вопрос связан со вторым фрагментом кода, но я начну с представления этого рабочего кода в попытке оправдать мои ожидания относительно второго фрагмента.

#include <pic32mx.h>

/*
 * read from Rx[n]:        (PORTx >> n) & 0x1
 * drive value to Rx[n]:   PORTx = value << n
 *
 * set Rx[n] to output:    TRISx |= 0x...., where only bit n is 0
 * set Rx[n] to input:     TRISx |= 0x...., where only bit n is 1  
 *
 * REn: LED light n+1
 * RFn: Button n+1
 */
int main(void) {
   TRISE = ~0xff; // set RE[7:0] to output, RE[15:8] to input
   TRISF |= 0x2;  // set RF[1] to input

   while(1)
      PORTE = (PORTF >> 1) & 0x1; // drive RF1 to RE0

   return 0;
}

Светодиодные индикаторы загораются при работес 1 и выключается при движении с 0. Кнопки подключаются так, чтобы выдавать 1 при нажатии и 0 при отпускании.Микропроцессор Uno32 организует группы GPIO в порты и называет эти порты RA, RB, RC, RD, RE, RF и RG.Каждый порт может иметь до 16 контактов GPIO и управляется двумя регистрами: TRISx и PORTx, где x - это буква (AG), обозначающая интересующий порт.16 младших разрядов регистра TRISx определяют, является ли каждый вывод входом или выходом.Когда данный бит регистра TRISx равен 0, вывод является выходом;когда это 1, это вход.16 младших разрядов регистра PORTx определяют соответствующие значения, которые выводятся или считываются с каждого контакта.

Выводы с 0 по 7 порта E (то есть RE0–RE7) соответствуют восьми светодиодным индикаторам.Вывод 1 порта F (т. Е. RF1) соответствует кнопке 1. Я выяснил, что RF1 соответствует кнопке 1, ознакомившись со справочными руководствами для платы Uno32 и экрана IO (соответствующие таблицы из руководств прилагаются кэто сообщение).

reference manuals

Опять же, обращаясь к справочному руководству, я считаю, что RF2, RF3 и RF4 соответствуюткнопка 2, кнопка 3 и кнопка 4 соответственно.(Это будет актуально в ближайшее время.)

Учитывая вышеприведенный фон, позвольте мне объяснить, почему в приведенном выше коде светодиод 1 горит на время нажатия кнопки 1.Оператор TRISE = ~0xff; устанавливает выводы от 0 до 7 порта E (порт светодиодного индикатора) для вывода.Затем TRISF |= 0x2; устанавливает вывод кнопки 1 в качестве входа.Когда кнопка нажата, PORTE = (PORTF >> 1) & 0x1; переводит входное значение 1 на первый светодиодный индикатор RE0, потому что нажатие кнопки приводит к тому, что RF1 становится 1.Когда кнопка отпущена, PORTE = (PORTF >> 1) & 0x1; выводит входное значение 0 на первый светодиод RE0, поскольку RF1 равно 0.Эти «механизмы» объясняют, почему в приведенном выше коде светодиод 1 светится в течение всего времени нажатия кнопки 1.

Вопрос

Теперь, используя те же рассуждения, что и выше, Я ожидаю, что приведенный ниже код заставит светодиод 1 светиться в течение всего времени нажатия кнопки 2 (потому что я ожидаю, что (PORTF >> 2) & 0x1 даст мне значение RF2).

int main(void) {
   TRISE = ~0xff; // set RE[7:0] to output, RE[15:8] to input
   TRISF |= 0x4;  // set RF[2] to input

   while (1)
      PORTE = (PORTF >> 2) & 0x1; // drive RF2 to RE0

   return 0;
}

Однако,Эффект этого кода заключается в том, что светодиодный индикатор 1 светится постоянно, и ни одна из кнопок не имеет видимого эффекта.

Где я иду не так?

...