Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PIC16f887 сбрасывается выход
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Слесарь
Здравствуйте!
Осваиваю PIC контроллеры.
Подскажите, когда я делаю
void lcd_strobe(void)
{
RE0 = 1;
RE0=0;
}
у меня сбрасывается в нулл (RE1 == 1).
В мануале написано что возможно неправильно настроен ADCON1. Но я подставил настройку из шаблона. Что может быть?

Причем, данная проблема имеет временный характер. Возникла при глобальном изменении кода программы.
=AK=
Обращение к порту - это байтовая операция "чтение-модификация-запись". Когда вы ставите битик RE0 в 0 или в 1, PIC читает и пишет весь порт. Eсли в этот момент на пине RE1 имеется 1 (например, в случае, когда RE1 управляется как открытый коллектор, через TRISE), тo в ходе этой операции PIC читает 1 из RE1 и прописывает его назад в порт. Эти грабли в аппликухах описаны, даже в даташите черным по белому сказано:

All write operations are read-modify-write operations. Therefore, a write to a port implies that the port pins are read, this value is modified and then written to the PORT data latch.
Слесарь
У меня лог 1 устанавливается на RE1 программно до выполнения последовательности RE0 = 1; RE0=0. Посли выполнения RE0 = 1, RE1 устанавливается в лог 0.
На RE1 была единица до того как мне понадобилось мигнуть на RE0.

То есть, предлагаете работать только побайтно с портами, а не побитно(по линиям) как у меня?
=AK=
Цитата(Cлесарь @ May 21 2010, 14:22) *
То есть, предлагаете работать только побайтно с портами, а не побитно(по линиям) как у меня?

Я ничего не предлагаю, поскольку понятия не имею, что за задачу вы решаете. Не в моих правилах что-то предлагать в такой ситуации. Я вам объясняю, что скудно описанные вами симптомы болезни соответствуют граблям, которые возникают при побитовой работе с портом в тех случаях, когда соседние линии этого порта время от времени меняют настройку "вход" или "выход". Вы там что-то такое невнятное сказали про ADCON1. Вполне возможно, что вы периодически меняете настройку RE1, то он у вас аналоговый вход, то он выход. Вот от этого тогда и случаются грабли.

Побайтная работа с портом такие грабли, действительно, вылечивает. Однако постоянная настройка портов, без перенастройки то на вход, то на выход - тоже вылечивает. smile.gif
Слесарь
ADCON0 = 0x00; // Disable analog pins
ADCON1 = 0x07; // Disable analog pins


RE0 = 0;
RE1 = 0;

TRISE=0;

Проблему не решает.

///
/// какие-то действия
///

RE1 = 1;

/// какие-то действия

RE0 = 1; // сбрасывает RE1 в лог 0
RE0 = 0;
@Ark
Цитата
В мануале написано что возможно неправильно настроен ADCON1. Но я подставил настройку из шаблона. Что может быть?

Выбросьте свой мануал и скачайте нормальный даташит.
Регистры ADCON0 и ADCON1 управляют настройкой и выбором аналогового канала для АПЦ.
За выбор режимов портов аналоговый/цифровой отвечают регистры ANSEL и ANSELH.
AHTOXA
Цитата(=AK= @ May 21 2010, 11:02) *
постоянная настройка портов, без перенастройки то на вход, то на выход - тоже вылечивает. smile.gif

Даже если нога постоянно настроена на выход, но при этом сильно нагружена, то с неё вполне может считаться ноль, в то время как она пытается выдать единицу.
Слесарь
Поиск по справочнику взятому на сайте Микрочип.ру на предмет ANSEL не дал результата.
@Ark
Цитата
Поиск по справочнику взятому на сайте Микрочип.ру на предмет ANSEL не дал результата.

http://ww1.microchip.com/downloads/en/DeviceDoc/41291F.pdf
=AK=
Цитата(Cлесарь @ May 21 2010, 16:37) *
Поиск по справочнику взятому на сайте Микрочип.ру на предмет ANSEL не дал результата.

TB3009: Common 8-Bit PIC® Microcontroller I/O Pin Issues
Слесарь
ANSEL = 0x00; вроде помогло. Всем спасибо! Особенно @Ark
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.