Проблема при включении устройства на PIC
Проблема при включении устройства на PIC
Всем привет!
Требуется идея что может быть не так:
Собрано первое устройство на PIC 16F628A. Тестер LAN кабеля.
Схема примитивна - половина контактов порта B на выход, половина на вход. Выдает единицу на одну ножку выхода и слушает по очереди все входы. И так 4 раза.
Порт А - индикация на диодах.
Собственно проблема в чем: при подаче питания в 5% случаев включается и работает нормально. Остальные 95% - на выходе индикации нули.
Сначала запускал от внутреннего генератора, но потом решил что виноват он (я не сохранил биты конфигурации, пока осваивал программатор) и теперь сделал внешний ER-генератор.
Плату сделал качественно, собрано (видимо) без ошибок, т.к. в 5 % случаев показывает действительно то, что должен.
Программа залита без ошибок - проверял. Слово конфигурации (3F5A) - тоже.
Все прерывания отключены.
Чего прошу:
идею почему может быть нестабильный запуск.
Требуется идея что может быть не так:
Собрано первое устройство на PIC 16F628A. Тестер LAN кабеля.
Схема примитивна - половина контактов порта B на выход, половина на вход. Выдает единицу на одну ножку выхода и слушает по очереди все входы. И так 4 раза.
Порт А - индикация на диодах.
Собственно проблема в чем: при подаче питания в 5% случаев включается и работает нормально. Остальные 95% - на выходе индикации нули.
Сначала запускал от внутреннего генератора, но потом решил что виноват он (я не сохранил биты конфигурации, пока осваивал программатор) и теперь сделал внешний ER-генератор.
Плату сделал качественно, собрано (видимо) без ошибок, т.к. в 5 % случаев показывает действительно то, что должен.
Программа залита без ошибок - проверял. Слово конфигурации (3F5A) - тоже.
Все прерывания отключены.
Чего прошу:
идею почему может быть нестабильный запуск.
- Реклама
Re: Проблема при включении устройства на PIC
Банально висит в водухе ножка MCLR
Re: Проблема при включении устройства на PIC
MCLR вообще на внутреннем сбросе.
Re: Проблема при включении устройства на PIC
Да, висит, но я выключил ее в конфигурации.
Хм, может мне и правда идти штудировать раздел про сброс?
Да, я забыл сказать - устройство включается подачей питания и выключается исчезновением питания. Видимо это важно?
Ну да, так и есть. Только я не понял - это ответ на предыдущее или на мое?otest писал(а):MCLR вообще на внутреннем сбросе.
Хм, может мне и правда идти штудировать раздел про сброс?
Да, я забыл сказать - устройство включается подачей питания и выключается исчезновением питания. Видимо это важно?
Re: Проблема при включении устройства на PIC
В том то и дело что нормального запуска нет. Может POR не пашет? Попробуйте сброс аппаратный(RC-цепочку или супервизор). Была такая фигня, на работе один чувак сделал на пике и у него время от времени не запускался девайс---поставили супервизор и поперло.
- Реклама
Re: Проблема при включении устройства на PIC
Да, идею понял, спасибо, вечером попробую.
Кстати, там был косяк со словом конфигурации - было 3F5A, а надо было 3F52 (я забыл поставить таймер на включение)
Уже переделал и стало лучше (не сильно), что говорит мне о том, что похоже направление мысли верное
Кстати, там был косяк со словом конфигурации - было 3F5A, а надо было 3F52 (я забыл поставить таймер на включение)
Уже переделал и стало лучше (не сильно), что говорит мне о том, что похоже направление мысли верное
- Dmitry Dubrovenko
- Поставщик валерьянки для Кота
- Сообщения: 2360
- Зарегистрирован: Вс янв 09, 2011 16:51:39
- Откуда: Санкт-Ленинград
- Контактная информация:
Re: Проблема при включении устройства на PIC
Кто писАл программу?duckens писал(а):Собрано первое устройство на PIC 16F628A.
На чём?
Где исходник?
Если отсутствуют прерывания, зачем таймер?
ICQ нет, и, в ближайшее время, не будет.
Re: Проблема при включении устройства на PIC
Писал программу сам, на ассемблере, компилировал в MPASM for Windows, проверял работоспособность в Proteus 7.7.
Исходник прицепил.
Этот таймер делает то же, что должна делать та схема, которую мне предлагают подцепить - удерживать контроллер в состоянии сброса, пока не установится питание.
При том что я называю "неправильным" запуском схема ведет себя так, как будто на всех входах все время нули.
Исходник прицепил.
Этот таймер делает то же, что должна делать та схема, которую мне предлагают подцепить - удерживать контроллер в состоянии сброса, пока не установится питание.
При том что я называю "неправильным" запуском схема ведет себя так, как будто на всех входах все время нули.
- Вложения
-
- wireok.asm
- (2.7 КБ) 189 скачиваний
Re: Проблема при включении устройства на PIC
Че-т не понял какой таймер??duckens писал(а): Этот таймер делает то же, что должна делать та схема, которую мне предлагают подцепить - удерживать контроллер в состоянии сброса, пока не установится питание.
Re: Проблема при включении устройства на PIC
3-й бит слова конфигурации -PWRTE - бит разрешения работы таймера включения питания. "Таймер обеспечивает задержку в 72 мс по сигналу схемы сброса вкл. питания POR или сброса по снижению напряжения питания BOR."Psych писал(а): Че-т не понял какой таймер??
- Dmitry Dubrovenko
- Поставщик валерьянки для Кота
- Сообщения: 2360
- Зарегистрирован: Вс янв 09, 2011 16:51:39
- Откуда: Санкт-Ленинград
- Контактная информация:
Re: Проблема при включении устройства на PIC
Очень мало коментариев. Сами же будете забывать, про что писАли.duckens писал(а):Писал программу сам, на ассемблере, компилировал в MPASM for WindowsА чем родной MPLAB не устроил?
duckens писал(а):Исходник прицепил.
Конфигурацию удобнее задавать строками типа:
Код: Выделить всё
__CONFIG _CP_ON & _DATA_CP_ON & _LVP_OFF & _BOREN_ON & _MCLRE_ON & _WDT_ON & _PWRTE_ON & _HS_OSC
_BOREN_ON EQU H'3FFF' ;Сброс по снижению питания (BOR)
_BOREN_OFF EQU H'3FBF' ;Сброс по снижению питания (BOR)
_CP_ON EQU H'1FFF' ;Бит защиты
_CP_OFF EQU H'3FFF' ;Бит защиты
_DATA_CP_ON EQU H'3EFF' ;Бит защиты EEPROM памяти данных
_DATA_CP_OFF EQU H'3FFF' ;Бит защиты EEPROM памяти данных
_PWRTE_OFF EQU H'3FFF' ;Таймер по включению питания (PWRT)
_PWRTE_ON EQU H'3FF7' ;Таймер по включению питания (PWRT)
_WDT_ON EQU H'3FFF' ;Сторожевой таймер
_WDT_OFF EQU H'3FFB' ;Сторожевой таймер
_LVP_ON EQU H'3FFF' ;Низковольтное программирование
_LVP_OFF EQU H'3F7F' ;Низковольтное программирование
_MCLRE_ON EQU H'3FFF' ;Выбор режима вывода RA5/-MCLR
_MCLRE_OFF EQU H'3FDF' ;Выбор режима вывода RA5/-MCLR
_RC_OSC_CLKOUT EQU H'3FFF'
_RC_OSC_NOCLKOUT EQU H'3FFE'
_INTOSC_OSC_CLKOUT EQU H'3FFD' ;Внутренний генератор
_INTOSC_OSC_NOCLKOUT EQU H'3FFC' ;Внутренний генератор
_EXTCLK_OSC EQU H'3FEF'
_HS_OSC EQU H'3FEE'
_XT_OSC EQU H'3FED'
_LP_OSC EQU H'3FEC'Сейчас попробую запихнуть Ваш исходник в связку МПЛАБ-Протеус (вообще-то, схема не помешала бы)
ICQ нет, и, в ближайшее время, не будет.
Re: Проблема при включении устройства на PIC
Дим , извини меня но это галиматья . Или ты всю жизнь начинающий ?_BOREN_ON EQU H'3FFF' ;Сброс по снижению питания (BOR)
_BOREN_OFF EQU H'3FBF' ;Сброс по снижению питания (BOR)
Во первых :
Так не понятней будет ??????;Сброс по снижению питания (BOR)
_BOREN_ON EQU H'3FFF' ; включен
_BOREN_OFF EQU H'3FBF' ;
Во вторых конфиги изначально определены в хидерах , так же как и регистры.
Почему вы их до сих пор не научились подключать? Все за вас уже прописано.
Код: Выделить всё
#include <P16F628A.INC>
LIST P=PIC16F628A
__CONFIG _CP_ON & DATA_CP_ON & _LVP_OFF & _BOREN_ON & _MCLRE_ON & _WDT_ON & _PWRTE_ON & _HS_OSC
Последний раз редактировалось dosikus Сб апр 09, 2011 11:34:59, всего редактировалось 1 раз.
- Dmitry Dubrovenko
- Поставщик валерьянки для Кота
- Сообщения: 2360
- Зарегистрирован: Вс янв 09, 2011 16:51:39
- Откуда: Санкт-Ленинград
- Контактная информация:
Re: Проблема при включении устройства на PIC
Посмотрел на исходник, и пока не стал никуда запихивать.
В самом начале инициализации, у Вас:
С чего Вы взяли, что у Вас сразу же выставляется 1-й банк?
Также нет сброса регистров общего назначения.
В самой программе:
Что это за конструкция?
И вообще, что должна делать программа?
В самом начале инициализации, у Вас:
Код: Выделить всё
clrw
movwf 0x81
bcf STATUS, RP0 ;bank 0
clrf INTCON ;interrupt offТакже нет сброса регистров общего назначения.
В самой программе:
Код: Выделить всё
btfsc PORTB, 0
btfsc WIRE, CROSS0
btfsc WIRE, CROSS0
btfsc INTCON, 0
bsf WIRE, NOTOK0И вообще, что должна делать программа?
ICQ нет, и, в ближайшее время, не будет.
- Dmitry Dubrovenko
- Поставщик валерьянки для Кота
- Сообщения: 2360
- Зарегистрирован: Вс янв 09, 2011 16:51:39
- Откуда: Санкт-Ленинград
- Контактная информация:
Re: Проблема при включении устройства на PIC
Совершенно правильно, Алексей.dosikus писал(а):Или ты всю жизнь начинающий?
"Я знаю, что ничего не знаю".
Заметь, сказано очень давно, и не мной.
Понятней, понятней.dosikus писал(а):Так не понятней будет ??????
Можно ещё весь раздел про BOR из даташита приписАть. Тогда совсем понятно будет.
Да всё "мы" научились.dosikus писал(а):Почему вы их до сих пор не научились подключать?
Просто кому-то нравится подключать, а кому-то включать.
Кроме того, не уверен про "MPASM for Windows", что он что-то подключать умеет, и вообще что это такое?
А то ведь, может оказаться, что как-раз галиматьёй окажется:
Код: Выделить всё
#include <P16F628A.INC>ICQ нет, и, в ближайшее время, не будет.
Re: Проблема при включении устройства на PIC
Да, это косяк, спасибоDmitry Dubrovenko писал(а):Посмотрел на исходник, и пока не стал никуда запихивать.
В самом начале инициализации, у Вас:С чего Вы взяли, что у Вас сразу же выставляется 1-й банк?Код: Выделить всё
clrw movwf 0x81 bcf STATUS, RP0 ;bank 0 clrf INTCON ;interrupt off
Неправда - есть. Я пользуюсь только одной переменной WIRE - байт по адресу 0x20.Dmitry Dubrovenko писал(а): Также нет сброса регистров общего назначения.
Он сбрасывается там где написано ";init variables"
Dmitry Dubrovenko писал(а): В самой программе:Что это за конструкция?Код: Выделить всё
btfsc PORTB, 0 btfsc WIRE, CROSS0 btfsc WIRE, CROSS0 btfsc INTCON, 0 bsf WIRE, NOTOK0
И вообще, что должна делать программа?
Это хитрая конструкция. Мне нужно выполнить
Код: Выделить всё
bsf WIRE, NOTOK0Код: Выделить всё
PORTB, 0Код: Выделить всё
WIRE, CROSS0Как он работает могу объяснить отдельно если интересно.
Зачем:
Побитного (т.е. примененного не к 2-м байтам, а вообще только к 2-м битам) XOR-а в командах контроллера нет. Есть конечно обычный, но его можно сделать только скопировав эти 2 штуки (эти 2 бита) еще в 2 регистра(в 0-е биты 2-х пустых регистров), провести XOR и после этого если от =true - выполнить команду. Я решил обойтись без доп. памяти.
Вообще что прога делает:
звонит 4 провода в кабеле, поэтому 4 блока кода.
Каждый (i-й) блок делает вот что:
1) устанавливает 1-цу на на i-м выходе(из RB0..RB3), а на сот. - нули
2) смотрит по очереди все входы (RB4..RB7)
Если находит ошибку - пишет 1-цу в WIRE в i-ю позицию (Эти позиции называются NOTOK0..3)
Если находит замыкание на парный провод, то пишет 1-цу на (i+4)-ю позицию в WIRE (Эти позиции называются CROSS0..3)
Далее написан XOR. Зачем:
Если провод контачит и на себя и на парный или ни на себя ни на парный, то надо написать NOTOK. В противном случае ничего.
3)выводит результаты.
P.S. по неясной мне причине у меня не подцепляется сюда на форум файл proteus-а.
Последний раз редактировалось duckens Сб апр 09, 2011 19:16:31, всего редактировалось 1 раз.
Re: Проблема при включении устройства на PIC
http://narod.ru/disk/9719916001/WireOk.rar.html
Вот разом все: код, hex и файл Proteus-а
Да, и еще хочу выразить "Спасибо" за внимание к проблеме.
И также прошу заметить, что проблема у меня не в сути кода (вроде бы). Тут можно ждать косяк все-таки на аппаратно-логическом уровне. Т.е. например если бы не успевало установиться напряжение на выходе, а прога уже читает вход например. Когда я об этом подумал добавил NOP между.
Вот разом все: код, hex и файл Proteus-а
Да, и еще хочу выразить "Спасибо" за внимание к проблеме.
И также прошу заметить, что проблема у меня не в сути кода (вроде бы). Тут можно ждать косяк все-таки на аппаратно-логическом уровне. Т.е. например если бы не успевало установиться напряжение на выходе, а прога уже читает вход например. Когда я об этом подумал добавил NOP между.
- Dmitry Dubrovenko
- Поставщик валерьянки для Кота
- Сообщения: 2360
- Зарегистрирован: Вс янв 09, 2011 16:51:39
- Откуда: Санкт-Ленинград
- Контактная информация:
Re: Проблема при включении устройства на PIC
По-моему, весьма хитрая.duckens писал(а):Это хитрая конструкция.
Вы сами читаете, что пишите?duckens писал(а):Мне нужно выполнитьесли XOR отКод: Выделить всё
bsf WIRE, NOTOK0иКод: Выделить всё
PORTB, 0Код: Выделить всё
WIRE, CROSS0
Объясните лучше, что всё-таки должна делать программа, на понятном языке.duckens писал(а):Как он работает могу объяснить отдельно если интересно.
До п.2 понял, а вот далее, не очень.
ICQ нет, и, в ближайшее время, не будет.
Re: Проблема при включении устройства на PIC
Да, читаю конечно. Удивительно что Вы не поняли.Dmitry Dubrovenko писал(а): Вы сами читаете, что пишите?
Здесь написано:
Код: Выделить всё
if NOT((PORTB, 0) XOR (WIRE, CROSS0))=true
then bsf WIRE, NOTOK0
WIRE, CROSS0 - это бит CROSS0 в регистре WIRE
Эти биты можно понимать как 2 переменные типа boolean, и следовательно применять к ним XOR)
Вот этот кусочек кода в переводе на язык ассемблера дает:
Код: Выделить всё
btfsc PORTB, 0
btfsc WIRE, CROSS0
btfsc WIRE, CROSS0
btfsc INTCON, 0
bsf WIRE, NOTOK0
btfss PORTB, 0
btfss WIRE, CROSS0
btfss WIRE, CROSS0
btfsc INTCON, 0
bsf WIRE, NOTOK0
Ну хорошо, но это надо рисовать блок-сему, иначе будет и дальше не понятно. Я-то нарисую, но это не приближает нас к решению.Dmitry Dubrovenko писал(а): Объясните лучше, что всё-таки должна делать программа, на понятном языке.
До п.2 понял, а вот далее, не очень.
По сути:
У меня было основное подозрение на запуск тактового генератора но фронту подачи питания. Программа-то у меня выполняется за один проход, а дальше замыкается в пустой цикл. Тогда сегодня я решил не замыкать ее в пустой цикл, а замкнуть весь код без инициализации. В самом деле проблему с генератором это бы решило - не выполнилась нормально с первого прохода - наплевать.
Оказалось что ничего подобного - при "плохом" запуске у контроллера как будто нет порта B. Т.е. как будто он все время читается нулем. А при нормальном - все нормально, прога выполняется правильно.
Почему я думаю что дело не в сути кода:
потому что в Proteus-е все моделируется нормально.
Re: Проблема при включении устройства на PIC
О! Граждане, я нашел в чем косяк! И не могу его объяснить, так что расскажу подробно.
Только не сейчас - уже сил нету - это надо обстоятельно объяснять и таки блок-схему рисовать.
Только не сейчас - уже сил нету - это надо обстоятельно объяснять и таки блок-схему рисовать.
Re: Проблема при включении устройства на PIC
Итак сначала рассказываю как работает прога.
1)Сначала инициализируется
2)Потом производит 4 блока измерений - проверяет она 4 провода в кабеле, поэтому и 4 блока.
3)выводит результаты
Думаю что п.п. 1 и 3 понятны из исходника и так, поэтому рассказываю 2-й.
Блок-схема:
http://narod.ru/disk/9865244001/pic.rar.html
См. 1-й файл.
Блок схема одного (из 4-х) блоков. Блок номер 0.
В этом блоке мы обращаемся на запись к 2-м переменнм
переменная, которая должна стать = 1 если что-то плохо с нулевым (по счету) проводом.
И переменная
эта переменная должна стать = 1 если провод кросс, и = 0 если провод прямой.
На 0-м блоке сначала мы выставляем на выходе "b'00010000".
Далее прога ищет на входах логическую единицу. (схему входов, выходов смотри там же где и блок схема).
Первые 2 проверки - ищем КЗ. Если встречаем единицу где не надо, то пишет 1-цу в
Далее проверяем провод номер 2. Он - парный, так что на нем может быть и 1, если провод - кросс. Так что если там единица, то пишем 1-цу в
И осталось проверить сам провод на предмет обрыва, т.е. 0-й бит порта B. Но дело в том, что если провод - кросс, то там ноль, а единица - во втором бите.
Таким образом надо написать 1-цу в
только если либо и там и там 0, либо и там и там 1. Иными словами надо написать единицы если не XOR от WIRE,CROSS0 и B0.
Теперь про то как написан XOR. Для понимания неисправности это, похоже, важно.
См. рисунок номер 2.
Я рисую как команды BTFSS (check BiT in register F Skip if Set) BTFSC (check BiT in register F Skip if Cleared) выглядят на ленте команд.
А внизу приведена картинка как работает половина XOR-а - блок кода, который выполнит "Command" если оба аргумента равны 1.
Аналогично пишется кусок кода, где выполнится "Command" если оба аргумента равны 0.
Они записываются подряд и получается XOR.
Для него мне нужен какой-нибудь бит, значение которого я знаю наверняка, чтобы сделать "Skipper" - команду, которая прыгает через строчку ленты команд всегда.
Вот тут и есть вся проблема!! Этот XOR, хоть и мудреный и в 10 строчек (напишите оптимальнее??), но написан правильно и в эмуляции работает, а в аппаратном исполнении - нет!
В качестве бита, значение которого всегда = 0 я взял
Ну просто потому что какая разница что брать - этот я сам сбрасываю в начале программы.
И вот это место и не работает, похоже. Такое ощущение, что регистр INTCON не сбрасывается и из-за этого XOR не выполняется нормально.
При комментировании этой части кода прога работает всегда.
Собственно вопрос к тем кто осилил: господа, почему может не сброситься регистр INTCON? или может быть я упустил из виду еще что-то?
1)Сначала инициализируется
2)Потом производит 4 блока измерений - проверяет она 4 провода в кабеле, поэтому и 4 блока.
3)выводит результаты
Думаю что п.п. 1 и 3 понятны из исходника и так, поэтому рассказываю 2-й.
Блок-схема:
http://narod.ru/disk/9865244001/pic.rar.html
См. 1-й файл.
Блок схема одного (из 4-х) блоков. Блок номер 0.
В этом блоке мы обращаемся на запись к 2-м переменнм
Код: Выделить всё
WIRE, NOTOK0
И переменная
Код: Выделить всё
WIRE, CROSS0
На 0-м блоке сначала мы выставляем на выходе "b'00010000".
Далее прога ищет на входах логическую единицу. (схему входов, выходов смотри там же где и блок схема).
Первые 2 проверки - ищем КЗ. Если встречаем единицу где не надо, то пишет 1-цу в
Код: Выделить всё
WIRE, NOTOK0
Код: Выделить всё
WIRE, CROSS0
Таким образом надо написать 1-цу в
Код: Выделить всё
WIRE, NOTOK0
Теперь про то как написан XOR. Для понимания неисправности это, похоже, важно.
См. рисунок номер 2.
Я рисую как команды BTFSS (check BiT in register F Skip if Set) BTFSC (check BiT in register F Skip if Cleared) выглядят на ленте команд.
А внизу приведена картинка как работает половина XOR-а - блок кода, который выполнит "Command" если оба аргумента равны 1.
Аналогично пишется кусок кода, где выполнится "Command" если оба аргумента равны 0.
Они записываются подряд и получается XOR.
Для него мне нужен какой-нибудь бит, значение которого я знаю наверняка, чтобы сделать "Skipper" - команду, которая прыгает через строчку ленты команд всегда.
Вот тут и есть вся проблема!! Этот XOR, хоть и мудреный и в 10 строчек (напишите оптимальнее??), но написан правильно и в эмуляции работает, а в аппаратном исполнении - нет!
В качестве бита, значение которого всегда = 0 я взял
Код: Выделить всё
INTCON, 0
И вот это место и не работает, похоже. Такое ощущение, что регистр INTCON не сбрасывается и из-за этого XOR не выполняется нормально.
При комментировании этой части кода прога работает всегда.
Собственно вопрос к тем кто осилил: господа, почему может не сброситься регистр INTCON? или может быть я упустил из виду еще что-то?


