Я установил 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. Все они закончились одинаково.
(этот ответ может быть неточным, пожалуйста, не стесняйтесь комментировать и редактировать)
После 2-дневного изучения этого, наконец, я нашел несколько проблем, связанных с этим, и решил проблему.
Если кажется, что микроконтроллер не работает должным образом, как здесь, вы можете проверить следующее:
После некоторого тестирования и проверки я обнаружил, что проблема, с которой я столкнулся, заключается в том, что я не реализовал сброс и не включил 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):
- Применение соответствующего источника питания и заземления (VDD и VSS) к устройству;
- Поднять напряжение на выводе MCLR до уровня напряжения программирования (в общем случае около 13В), при этом:
- Подтягивание двух назначенных портов ввода/вывода к низкому логическому уровню и удерживание их там.
Если вы не подключили все VDD и VSS должным образом, вы должны это сделать. Дополнительную информацию об этом см. в разделе Если микроконтроллер PIC обеспечивает несколько Vdd/Vss, следует ли подавать питание на них все? .
Различия между требованиями к низковольтному программированию (также называемому программированием с однополярным питанием) и высоковольтному программированию:
В моем случае, потому что в битах конфигурации я установил бит 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 плавающим?
alexan_e
Лонгтенгаа
Энди ака
Лонгтенгаа
Энди ака
Лонгтенгаа