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 надо как-то по другому читать?
Код, упрощенный до состояния "лишь бы откликнуться", выглядит вот так (вызывается из бесконечного цикла):
LATA=0x0780; //выставляем единицы на всех интересующих нас ногах - "анодах"
delay(5);
Prekey=PORTB & 0x0007; //Prekey - переменная типа uint16_t. А 0x0007 - отбрасывает не интересные нам ноги (с ними вывод PORT таки не равен нулю)
if(Prekey!=0) prints('a'); //Вызов функции вывода символа на дисплей. Функция точно работает, проверял
Что еще... Смущает, что входной буфер порта только ST без возможности выбора TTL. По опыту работы с МК PIC16F1824, ST у меня почему-то никогда не читался, читался только TTL. Может, ST надо как-то по другому читать?