Перейти к содержанию

Почему PIC18F4550 не видит кнопки на PORTB?

Обновлено Редакция GAW

PIC18F4550 часто берут для USB-проектов с кнопками на PORTB — и сразу натыкаются на то, что RB0–RB4 читаются нулями при любом уровне на выводе. Причина — в бите конфигурации PBADEN.

Что делает PBADEN

PBADEN (CONFIG3H, бит 1)PCFG3:PCFG0 после сбросаRB0–RB4AN0–AN7
1 — как у чистого кристалла0000аналоговые, читаются как 0аналоговые
00111цифровыеаналоговые
любое, затем ADCON1 = 0x0F1111цифровыецифровые

Данные — DS39632E, разд. 10.2 и регистр 21-2. Выводы RB0–RB4 — это ещё и каналы АЦП AN12, AN10, AN8, AN9 и AN11, поэтому их режим задаёт поле PCFG регистра ADCON1, а PBADEN выбирает, каким оно будет после сброса.

Как исправить

В XC8:

#pragma config PBADEN = OFF   // RB0..RB4 digital on reset

void main(void) {
    ADCON1 = 0x0F;            // all ADC pins digital (optional)
    TRISB = 0xFF;             // inputs
    INTCON2bits.RBPU = 0;     // PORTB pull-ups on
    while (1) { /* read PORTB */ }
}

RBPU = 0 включает встроенные подтяжки PORTB, и кнопки подключают между выводом и землёй. Пример 10-2 даташита на ассемблере записывает в ADCON1 значение 0Eh: PORTB становится цифровым, но AN0 остаётся аналоговым входом (по табл. регистра 21-2).

Где ещё ловушки

Значения чистого PIC18F4550 и других кристаллов, вместе со всеми битами CONFIG1L…CONFIG7H, показывает генератор битов конфигурации PIC: там же видно, что у чистого кристалла включён сторожевой таймер и выбран внешний сигнал вместо кварца. Остальные причины, по которым программа PIC «не работает» после прошивки, собраны в ответе «Почему PIC не работает после прошивки». Обзор семейств — на странице «Микроконтроллеры PIC».

Похожие вопросы

Можно ли включить встроенные подтяжки PORTB для кнопок?

Да: бит RBPU в INTCON2 при значении 0 включает подтяжки PORTB для выводов, настроенных на вход (DS39632E, регистр INTCON2). Кнопку тогда подключают между выводом и землёй, нажатие читается как 0. Аналоговые выводы при этом всё равно читаются нулями — сначала сделайте их цифровыми.

Почему RB5–RB7 работают, а RB0–RB4 нет?

У RB5–RB7 нет аналоговой функции, а RB0–RB4 — это ещё и входы АЦП AN12, AN10, AN8, AN9 и AN11. Именно их PBADEN после сброса делает аналоговыми (DS39632E, разд. 10.2).

Что выбрать: PBADEN = OFF или ADCON1?

PBADEN = OFF настраивает PORTB цифровым сразу при включении питания, ещё до первой команды. ADCON1 = 0x0F делает цифровыми все входы АЦП, включая PORTA, и пригодится, если АЦП не используется вовсе. Часто делают и то и другое (наш совет).

Источники

  1. Microchip. PIC18F2455/2550/4455/4550 Data Sheet (DS39632E) — 10.2 — после сброса по питанию RB4:RB0 по умолчанию аналоговые входы и читаются как 0, RB7:RB5 — цифровые; PBADEN (CONFIG3H<1>) = 0 делает RB4:RB0 цифровыми; пример 10-2 — ADCON1 = 0Eh, если PBADEN включён; регистр 21-2, прим. 1 — PCFG<3:0> после сброса 0000 при PBADEN = 1 и 0111 при PBADEN = 0, PCFG = 1111 — все входы цифровые; выводы RB0/AN12, RB1/AN10, RB2/AN8, RB3/AN9, RB4/AN11; INTCON2.RBPU = 0 включает подтяжки PORTB; табл. 25-1 — CONFIG3H чистого кристалла 1--- -011
  2. Microchip. MPLAB XC8 Getting Started Guide (DS50002173A) — биты конфигурации задают строками #pragma config; окно Configuration Bits в MPLAB X выдаёт их готовыми

Нашли ошибку?