Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Странное поведение таймера 1 в PIC16F876A
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Rostislav
Всем привет!

Помогите, пожалуйста, совсем весь извелся! Третий день бьюсь!

Суть проблемы: с закоментированной строкой №423 пик дергает ногой нормально, на выходе RA4 меандр. Как только раскоментирую строку, скважность начинает плясать.

Не пойму, какая здесь связь (таймер 0, порт RA4 и RA3 никак не связаны!), но влияние "на лице"?

Параметры: тактовая 20МГц, WDT выключен, питание стабильное 5В.

Спасибо за помощь!
rx3apf
Цитата(Rostislav @ Apr 1 2011, 14:21) *
Суть проблемы: с закоментированной строкой №423 пик дергает ногой нормально, на выходе RA4 меандр. Как только раскоментирую строку, скважность начинает плясать.

Фрагмент маленький, не очень понятный. Но тем не менее первое, что приходит на ум - а это точно PORTA ? Биты банков стоят правильно ? Ну и второе - битовые манипуляции с "PORT" - они ведь не только с указанным битом работают, а с всем портом, чтение-модификация-запись. А что там на porta.4, если его прочитать ? Если туда выведена "1", это вовсе не означает, что прочитана будет "1"...
Rostislav
Цитата(rx3apf @ Apr 1 2011, 14:47) *
Фрагмент маленький, не очень понятный. Но тем не менее первое, что приходит на ум - а это точно PORTA ? Биты банков стоят правильно ? Ну и второе - битовые манипуляции с "PORT" - они ведь не только с указанным битом работают, а с всем портом, чтение-модификация-запись. А что там на porta.4, если его прочитать ? Если туда выведена "1", это вовсе не означает, что прочитана будет "1"...


Маленький, но достаточный, тем более, что программа пока крутится только в этом диапазоне команд. Здесь все просто: по флагу состояния таймера 0 меняю состояние линии RA4 порта A. Биты банков здесь трогать нет необходимости. Ну то, что это PORTA, это точно! Ведь с закоментированной строкой (т.е. при отсутствии изменения состояния линии порта RA3) все нормально! Кстати, в симуляторе изменение состояния линии RA3 НИ СКОЛЬКО не влияет на сигнал на линии RA4! RA4 я не читаю, а ТОЛЬКО записываю.

Забавно, но установка линии порта RA0 в 0 (т.е. если строка №423 будет выглядеть так: bcf PORTA,0) вообще запрещает изменение сигнала на RA4. Что-то я вообще в ступоре! wacko.gif Карау-у-у-л-.....
rx3apf
Цитата(Rostislav @ Apr 1 2011, 15:16) *
RA4 я не читаю, а ТОЛЬКО записываю.

Еще раз - команда bcf/bsf не записывает значение бита в порт ! Она читает весь порт, модифицирует бит и затем записывает все содержимое порта. А поскольку ra.4 вообще OC, то, если там нет внешней подтяжки, то и прочитанное значение будет "0", даже если в PORTA.4 было явно записано "1". И после любой операции с PORTA, даже вроде бы не затрагивающей бит 4, он обнулится.
Rostislav
Цитата(rx3apf @ Apr 1 2011, 15:29) *
Еще раз - команда bcf/bsf не записывает значение бита в порт ! Она читает весь порт, модифицирует бит и затем записывает все содержимое порта. А поскольку ra.4 вообще OC, то, если там нет внешней подтяжки, то и прочитанное значение будет "0", даже если в PORTA.4 было явно записано "1". И после любой операции с PORTA, даже вроде бы не затрагивающей бит 4, он обнулится.


Про OPEN DRAIN я знаю, резистор подтяжки есть (1 кОм на +5В). Линия порта подключена к npn транзистору (к его базе, а эмиттер на землю).

Я правильно Вас понимаю, что переход транзистора база-эмиттер шунтирует линию RA4 и в момент изменения состояния любой другой линии с линии RA4 считывается логический 0 (так как напряжение в момент чтения RA4 на линии составляет порядка 0.7В) и тутже записывается в защелку? Если это так, то как выход из положения подключить транзистор к другой линии через токоограничивающий резистор.
O.L.
Цитата(Rostislav @ Apr 1 2011, 18:48) *
Если это так, то как выход и положения подключить транзистор к другой линии через токоограничивающий резистор.

Операция READ_MODIFY_WRITE над портом ввода/вывода является причиной "пляски".

Можно решить эту проблему не перекидывая выводы порта.

В начале программы , сразу после инициализации, записываем в сам порт, временный регистр вывода порта и tris нужные значения.
Код
    BANKSEL  PORTA
    movlw    INIT_PORTA
    movwf    cTemp_PORTA
    movwf    PORTA
    BANKSEL  TRISA
    movlw    INIT_TRISA
    movwf    TRISA


В программе всегда организуем вывод через временный регистр порта.
Код
    BANKSEL  PORTA
    bcf      cTemp_GPIO,bLed    ; Led ON!
    movf     cTemp_GPIO,w
    movwf    PORTA

Rostislav
Цитата(O.L. @ Apr 1 2011, 16:41) *
Операция READ_MODIFY_WRITE над портом ввода/вывода является причиной "пляски".


Спасибо, кажется, именно в этом и было дело! Всем спасибо, тема закрыта!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.