|
|
  |
Странное поведение таймера 1 в PIC16F876A, Поведение таймера меняется в зависимости от записи в PORTА |
|
|
|
Apr 1 2011, 10:21
|
Частый гость
 
Группа: Участник
Сообщений: 127
Регистрация: 6-07-08
Из: Москва
Пользователь №: 38 765

|
Всем привет! Помогите, пожалуйста, совсем весь извелся! Третий день бьюсь! Суть проблемы: с закоментированной строкой №423 пик дергает ногой нормально, на выходе RA4 меандр. Как только раскоментирую строку, скважность начинает плясать. Не пойму, какая здесь связь (таймер 0, порт RA4 и RA3 никак не связаны!), но влияние "на лице"? Параметры: тактовая 20МГц, WDT выключен, питание стабильное 5В. Спасибо за помощь!
Сообщение отредактировал Rostislav - Apr 1 2011, 11:32
Эскизы прикрепленных изображений
 Уменьшено до 51%
354 x 276 (18.46 килобайт)
|
|
|
|
|
|
Apr 1 2011, 10:47
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(Rostislav @ Apr 1 2011, 14:21)  Суть проблемы: с закоментированной строкой №423 пик дергает ногой нормально, на выходе RA4 меандр. Как только раскоментирую строку, скважность начинает плясать. Фрагмент маленький, не очень понятный. Но тем не менее первое, что приходит на ум - а это точно PORTA ? Биты банков стоят правильно ? Ну и второе - битовые манипуляции с "PORT" - они ведь не только с указанным битом работают, а с всем портом, чтение-модификация-запись. А что там на porta.4, если его прочитать ? Если туда выведена "1", это вовсе не означает, что прочитана будет "1"...
|
|
|
|
|
Apr 1 2011, 11:28
|
Частый гость
 
Группа: Участник
Сообщений: 127
Регистрация: 6-07-08
Из: Москва
Пользователь №: 38 765

|
Цитата(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. Что-то я вообще в ступоре!  Карау-у-у-л-.....
Сообщение отредактировал Rostislav - Apr 1 2011, 11:33
|
|
|
|
|
Apr 1 2011, 11:29
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(Rostislav @ Apr 1 2011, 15:16)  RA4 я не читаю, а ТОЛЬКО записываю. Еще раз - команда bcf/bsf не записывает значение бита в порт ! Она читает весь порт, модифицирует бит и затем записывает все содержимое порта. А поскольку ra.4 вообще OC, то, если там нет внешней подтяжки, то и прочитанное значение будет "0", даже если в PORTA.4 было явно записано "1". И после любой операции с PORTA, даже вроде бы не затрагивающей бит 4, он обнулится.
|
|
|
|
|
Apr 1 2011, 11:48
|
Частый гость
 
Группа: Участник
Сообщений: 127
Регистрация: 6-07-08
Из: Москва
Пользователь №: 38 765

|
Цитата(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В) и тутже записывается в защелку? Если это так, то как выход из положения подключить транзистор к другой линии через токоограничивающий резистор.
Сообщение отредактировал Rostislav - Apr 1 2011, 12:31
|
|
|
|
|
Apr 1 2011, 12:41
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 10-06-05
Из: Новосибирск
Пользователь №: 5 890

|
Цитата(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
|
|
|
|
|
Apr 1 2011, 13:15
|
Частый гость
 
Группа: Участник
Сообщений: 127
Регистрация: 6-07-08
Из: Москва
Пользователь №: 38 765

|
Цитата(O.L. @ Apr 1 2011, 16:41)  Операция READ_MODIFY_WRITE над портом ввода/вывода является причиной "пляски". Спасибо, кажется, именно в этом и было дело! Всем спасибо, тема закрыта!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|