GPIO на PIC16F887 не работает

Я установил PIC16f887 на внешний кварц 20 МГц и внутренний генератор 4 МГц, ни один из них никогда не работал со следующим кодом:

int main(void) {

    ANSELbits.ANS5 = 0;

    TRISEbits.TRISE0 = 0; 
    PORTEbits.RE0 = 1;        // pin RE0 is high

    TRISDbits.TRISD1 = 0;    // pin RD1 is high
    PORTDbits.RD1 = 1;

    while(1);

    return 0;

}

Но с указанными выше двумя режимами генератора я успешно отработал некоторые функции UART. Таким образом, это может исключить возможность того, что PIC не работает. По крайней мере, я так думаю.

Чтобы быть конкретным, мои биты конфигурации для INTOSC :

#pragma config FOSC = INTRC_CLKOUT
#pragma config WDTE = OFF 
#pragma config PWRTE = OFF
#pragma config MCLRE = ON  
#pragma config CP = OFF  
#pragma config CPD = OFF
#pragma config BOREN = ON  
#pragma config IESO = ON 
#pragma config FCMEN = ON
#pragma config LVP = ON

// CONFIG2
#pragma config BOR4V = BOR40V
#pragma config WRT = OFF

А что касается внешнего кристалла , то я просто поменял:

 #pragma config FOSC = HS

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

ANSELbits.ANS5 = 0;

чтобы убедиться, что RE0 ​​находится в режиме цифрового ввода/вывода.

И я устанавливаю соответствующий бит в регистре TRIS, чтобы настроить бит как выход.

Но это никогда не срабатывало.

обновлять

Я проверил, что напряжения между VDD/VSS и RE0 равны нулю, что меня сильно смущает.

Кто-нибудь знает, что здесь происходит? К вашему сведению, я тестировал оба PIC16f887. Все они закончились одинаково.

Как вы проверяете выход (вольтметр)? К контактам что-нибудь подключено? Все ли контакты питания MCU подключены?
да, я использовал вольтметр. И к контактам ничего не подключено, а контакты питания подключены. Я смоделировал это в MPLAB X, и получается выводить правильно.
контакт сброса высокий?
@Andyaka Andyaka Я не реализовал сброс. Может ли это быть проблемой? Но я заставил работать UART.
читайте техпаспорт. Сброс должен быть при логической 1. Если оставить плавающим, поведение непредсказуемо.
Я добавил сброс и подал питание на все доступные VDD/VSS. Все еще не работает.... @Andyaka

Ответы (1)

(этот ответ может быть неточным, пожалуйста, не стесняйтесь комментировать и редактировать)

После 2-дневного изучения этого, наконец, я нашел несколько проблем, связанных с этим, и решил проблему.

Если кажется, что микроконтроллер не работает должным образом, как здесь, вы можете проверить следующее:

  1. Правильно ли подключены все цифровые и аналоговые контакты питания и заземления?
  2. Микроконтроллер постоянно перезагружается?
  3. Осциллятор работает?
  4. Микроконтроллер находится в режиме программирования вместо выполнения кода?

После некоторого тестирования и проверки я обнаружил, что проблема, с которой я столкнулся, заключается в том, что я не реализовал сброс и не включил LVP (программирование с низким напряжением).

Сброс MCLR

На некоторых устройствах PICmirco сигнал MCLR (основной сброс) может быть внутренне привязан к VDD через бит конфигурации MCLRE . Если этот бит установлен, функция MCLR включена. И тогда, если напряжение на выводе низкое, микроконтроллеру придется перезагрузиться. Если этот бит сброшен, то вывод MCLR можно использовать как вывод ввода/вывода.

Что касается моей проблемы здесь, я установил бит MCLRE , но вывод MCLR был плавающим . Поскольку бит MCLRE установлен, вывод должен функционировать как вход. Но из-за плавающего штифта было трудно предсказать, какое на нем напряжение.

На странице 217 таблицы данных PIC16F887 предлагается подключить резистор 1 кОм (или больше) к VDD и конденсатор 0,1 мкФ (необязательно, не критично) к земле. Тогда микроконтроллер никогда не должен сбрасывать себя, за исключением сброса времени ожидания POR, BOR и WDT и т. Д.

На самом деле я заменил конденсатор переключателем, поэтому я могу вручную перезагрузить устройство, когда захочу.

Низковольтное программирование

Я не осознавал, что меня беспокоит LVP , пока не наткнулся на этот пост на форуме Microchip.

Microchip предоставляет нам два режима программирования: высоковольтное программирование и низковольтное программирование.

Программирование высокого напряжения требовало последовательного выполнения трех вещей (согласно PICmirco Device Programming: What You Always Wanted to Know (But Knot Who Ask), стр. 2):

  1. Применение соответствующего источника питания и заземления (VDD и VSS) к устройству;
  2. Поднять напряжение на выводе MCLR до уровня напряжения программирования (в общем случае около 13В), при этом:
  3. Подтягивание двух назначенных портов ввода/вывода к низкому логическому уровню и удерживание их там.

Если вы не подключили все VDD и VSS должным образом, вы должны это сделать. Дополнительную информацию об этом см. в разделе Если микроконтроллер PIC обеспечивает несколько Vdd/Vss, следует ли подавать питание на них все? .

Различия между требованиями к низковольтному программированию (также называемому программированием с однополярным питанием) и высоковольтному программированию:

  1. Требуется только VDD на выводе MCLR.
  2. LVP использует PGM в качестве дополнительного вывода программирования, в то время как другие выводы (PGC-Program Clock, PGD Program Data) в режиме программирования высокого напряжения все еще используются.

В моем случае, потому что в битах конфигурации я установил бит LVP . Согласно техпаспорту:

LVP: Бит разрешения программирования низкого напряжения

1 = контакт RB3/PGM имеет функцию PGM, разрешено программирование низкого напряжения

0 = контакт RB3 является цифровым вводом/выводом, HV на MCLR должен использоваться для программирования

Вот как устройство входит в режим LVP в соответствии со страницей 5 программирования устройств PICmirco :

Когда на выводах PGC и PGD удерживается низкий логический уровень, в то время как VDD подается как на PGM, так и на MCLR, микроконтроллер входит в режим программирования.

Поэтому я непреднамеренно установил LVP и плавал PGC, PGD и PGM, прежде чем узнал, что такое LVP . Поскольку LVP включен, а PGC, PGC, PGM все плавающие, после того, как я реализовал сброс , который решил проблему сброса, но также подключил вывод MCLR к VDD, устройство перешло в режим программирования низкого напряжения вместо запуска кода.

связанный вопрос:

Схема PIC не будет оставаться под напряжением

Кажущаяся нестабильной базовая схема PIC18F2550

Действительно ли плохая идея оставлять входной контакт MCU плавающим?

Хороший ответ :) Конденсатор на контакте сброса там, чтобы избежать электромагнитных помех, на случай, если линия сброса также подключена к чему-то еще, например, к программному интерфейсу. В таких случаях развязывающий колпачок (а также внутренний/внешний подтягивающий резистор) очень важен и обязателен, иначе вы, скорее всего, получите проблемы с электромагнитной совместимостью. Производитель микроконтроллера должен указать, какое значение подходит. 100 нФ — обычное значение для большинства микроконтроллеров, но для некоторых требуется более крутой фронт сброса и, следовательно, меньшее значение емкости.