Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

PIC24 помогите прочитать порт

Сб май 21, 2022 20:09:57

Доброго времени суток. Решил в коем-то веке потрогать МК PIC24FJ64GA004. Конкретно, образовался затык на чтении I/O портов RB0, RB1, RB2. По МК серии PIC12/16/18 я привык, что перед чтением порта надо отключить его аналоговую часть. Но как отключать аналоговые входы здесь - я до конца не понял. Привычных ANSELA/ANSELB тут нет. Сбросил бит ADON в AD1CON1, чтоб отключить АЦП, AD1CON2 полностью обнулил, чтоб выключить всякие сканы портов, прерывания, и т.д. AD1CHS тоже полностью обнулил, чтоб все входы АЦП настроить на никак меня не интересующий AN0. Как я понял, пункта "оставить в воздухе вход АЦП" у этого МК нет. AD1CSSL также обнулил, чтоб запретить всякие Band Gap Reference Input Pin Scan Selection bit (Бит выбора входного сигнала сканирования ширины запрещенной зоны. Что под этим подразумевается, я не знаю). Компараторы тоже вроде бы отключил, обнулив CMCON (на интересующих входах компаратор тоже сидит). Также, на интересующих меня входах сидят прерывания CN4/5/6. Их тоже следует отключить? RP0-RP2 тоже есть. Вроде ничего на них не настраивал. TRISB=0b0000000000011111, то есть, наши входы настроены как входы. Собственно, нужны мне эти входы, чтоб прочитать клавиатуру. В качестве "анодов" выступают порты RA7..RA10. Не добившись какого либо результата, я временно выставил на них единицы. "Катоды" - RB0..RB2. То есть, при нажатии любой кнопки хотя бы один из RBx выставится в единицу. Измерения мультиметром на ноге МК подтверждает эту теорию. При нажатии клавиши напряжение 3 Вольта. Но вот читаются указанные ноги все по нулям.

Код, упрощенный до состояния "лишь бы откликнуться", выглядит вот так (вызывается из бесконечного цикла):
LATA=0x0780; //выставляем единицы на всех интересующих нас ногах - "анодах"

delay(5);
Prekey=PORTB & 0x0007; //Prekey - переменная типа uint16_t. А 0x0007 - отбрасывает не интересные нам ноги (с ними вывод PORT таки не равен нулю)
if(Prekey!=0) prints('a'); //Вызов функции вывода символа на дисплей. Функция точно работает, проверял

Что еще... Смущает, что входной буфер порта только ST без возможности выбора TTL. По опыту работы с МК PIC16F1824, ST у меня почему-то никогда не читался, читался только TTL. Может, ST надо как-то по другому читать?

Re: PIC24 помогите прочитать порт

Ср май 25, 2022 17:21:51

Даташит прочитать - не судьба?
10.2 Configuring Analog Port Pins
The use of the AD1PCFG and TRIS registers control
the operation of the A/D port pins.

Содержимое AD1PCFG , как следует из его названия, находится в разделе ADC даташита.
Ну и референсный мануал на семейство тоже стоит почитать.

ЗЫ. Отвыкайте писать в коде магические числа. Либо применяйте маски через дефайны, либо пользуйтесь структурами регистров и устанавливайте/сбрасывайте именованные биты.

Добавлено after 11 minutes 2 seconds:
Смущает, что входной буфер порта только ST без возможности выбора TTL.

Ну и что? Это триггер Шмитта. Он позволяет защитить входной вентиль от промежуточных состояний, поскольку обладает гистерезисом. К чтению порта это не имеет никакого отношения.

Re: PIC24 помогите прочитать порт

Вс май 29, 2022 16:15:10

Содержимое AD1PCFG , как следует из его названия, находится в разделе ADC даташита.

Ох, я умудрился пропустить этот регистр, точнее, задать его в корне наоборот - все обнулил... Прописал единицы - теперь порт читается
КРАМ писал(а):ЗЫ. Отвыкайте писать в коде магические числа. Либо применяйте маски через дефайны, либо пользуйтесь структурами регистров и устанавливайте/сбрасывайте именованные биты.

А как это делать? Именованные биты - это, например, PORTBbits.RBx - это вроде понятно, хоть и не всегда удобно так делать. А что за маски в дефайнах? Как их задавать?

Re: PIC24 помогите прочитать порт

Вс май 29, 2022 17:12:46

Именованные биты - это, например, PORTBbits.RBx - это вроде понятно, хоть и не всегда удобно так делать.

Поскольку вы работаете с МК, а не с ПК, следует помнить, что основным преимуществом МК является режим реального времени. То есть минимальная латентность отклика железа на код, а так же предсказуемость этого отклика. Поэтому нужно четко понимать как компилятор транслирует исходник в исполняемые инструкции ядра.
Побитовый доступ к порту В ОБСУЖДАЕМОЙ АРХИТЕКТУРЕ компилируется в ОДНУ битовую инструкцию. Поэтому, при необходимости модификации одного бита, доступ через LATBbits.RBx вне конкуренции и превратится в bset/bclr LATB, #RBx.

А что за маски в дефайнах? Как их задавать?

Обычно. Маска - это разновидность константы для определения, в общем случае, произвольного количества бит в слове (используется с логическими функциями и текущим содержимым маскируемого регистра). Поэтому маске есть смысл присвоить осмысленное имя и определить через #define. Например, это может потребоваться при нескольких вариантах определения содержимого регистров под разные режимы. Тогда вы в хедере пишите всякую описательную галиматью, а в коде используете самодокументируемые имена отражающие реальный физический смысл константы.
Ответить