Проблема при включении устройства на PIC

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
duckens
Родился
Сообщения: 10
Зарегистрирован: Пт апр 08, 2011 01:51:39

Проблема при включении устройства на PIC

Сообщение duckens »

Всем привет!
Требуется идея что может быть не так:
Собрано первое устройство на PIC 16F628A. Тестер LAN кабеля.
Схема примитивна - половина контактов порта B на выход, половина на вход. Выдает единицу на одну ножку выхода и слушает по очереди все входы. И так 4 раза.
Порт А - индикация на диодах.


Собственно проблема в чем: при подаче питания в 5% случаев включается и работает нормально. Остальные 95% - на выходе индикации нули.

Сначала запускал от внутреннего генератора, но потом решил что виноват он (я не сохранил биты конфигурации, пока осваивал программатор) и теперь сделал внешний ER-генератор.

Плату сделал качественно, собрано (видимо) без ошибок, т.к. в 5 % случаев показывает действительно то, что должен.
Программа залита без ошибок - проверял. Слово конфигурации (3F5A) - тоже.
Все прерывания отключены.


Чего прошу:
идею почему может быть нестабильный запуск.
Реклама
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Re: Проблема при включении устройства на PIC

Сообщение Psych »

Банально висит в водухе ножка MCLR
Реклама
otest
Друг Кота
Сообщения: 7853
Зарегистрирован: Ср фев 11, 2009 20:35:58

Re: Проблема при включении устройства на PIC

Сообщение otest »

MCLR вообще на внутреннем сбросе.
duckens
Родился
Сообщения: 10
Зарегистрирован: Пт апр 08, 2011 01:51:39

Re: Проблема при включении устройства на PIC

Сообщение duckens »

Да, висит, но я выключил ее в конфигурации.
otest писал(а):MCLR вообще на внутреннем сбросе.
Ну да, так и есть. Только я не понял - это ответ на предыдущее или на мое?


Хм, может мне и правда идти штудировать раздел про сброс?
Да, я забыл сказать - устройство включается подачей питания и выключается исчезновением питания. Видимо это важно?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Re: Проблема при включении устройства на PIC

Сообщение Psych »

В том то и дело что нормального запуска нет. Может POR не пашет? Попробуйте сброс аппаратный(RC-цепочку или супервизор). Была такая фигня, на работе один чувак сделал на пике и у него время от времени не запускался девайс---поставили супервизор и поперло.
Реклама
duckens
Родился
Сообщения: 10
Зарегистрирован: Пт апр 08, 2011 01:51:39

Re: Проблема при включении устройства на PIC

Сообщение duckens »

Да, идею понял, спасибо, вечером попробую.

Кстати, там был косяк со словом конфигурации - было 3F5A, а надо было 3F52 (я забыл поставить таймер на включение)
Уже переделал и стало лучше (не сильно), что говорит мне о том, что похоже направление мысли верное
Реклама
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2360
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: Проблема при включении устройства на PIC

Сообщение Dmitry Dubrovenko »

duckens писал(а):Собрано первое устройство на PIC 16F628A.
Кто писАл программу?
На чём?
Где исходник?
Если отсутствуют прерывания, зачем таймер?
ICQ нет, и, в ближайшее время, не будет.
duckens
Родился
Сообщения: 10
Зарегистрирован: Пт апр 08, 2011 01:51:39

Re: Проблема при включении устройства на PIC

Сообщение duckens »

Писал программу сам, на ассемблере, компилировал в MPASM for Windows, проверял работоспособность в Proteus 7.7.
Исходник прицепил.

Этот таймер делает то же, что должна делать та схема, которую мне предлагают подцепить - удерживать контроллер в состоянии сброса, пока не установится питание.

При том что я называю "неправильным" запуском схема ведет себя так, как будто на всех входах все время нули.
Вложения
wireok.asm
(2.7 КБ) 189 скачиваний
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Re: Проблема при включении устройства на PIC

Сообщение Psych »

duckens писал(а): Этот таймер делает то же, что должна делать та схема, которую мне предлагают подцепить - удерживать контроллер в состоянии сброса, пока не установится питание.
Че-т не понял какой таймер??
duckens
Родился
Сообщения: 10
Зарегистрирован: Пт апр 08, 2011 01:51:39

Re: Проблема при включении устройства на PIC

Сообщение duckens »

Psych писал(а): Че-т не понял какой таймер??
3-й бит слова конфигурации -PWRTE - бит разрешения работы таймера включения питания. "Таймер обеспечивает задержку в 72 мс по сигналу схемы сброса вкл. питания POR или сброса по снижению напряжения питания BOR."
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2360
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: Проблема при включении устройства на PIC

Сообщение Dmitry Dubrovenko »

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 нет, и, в ближайшее время, не будет.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Проблема при включении устройства на PIC

Сообщение dosikus »

_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

Сообщение Dmitry Dubrovenko »

Посмотрел на исходник, и пока не стал никуда запихивать.

В самом начале инициализации, у Вас:

Код: Выделить всё

	clrw
	movwf 0x81
	bcf STATUS, RP0		;bank 0
	clrf INTCON		;interrupt off
С чего Вы взяли, что у Вас сразу же выставляется 1-й банк?

Также нет сброса регистров общего назначения.

В самой программе:

Код: Выделить всё

	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

Сообщение Dmitry Dubrovenko »

dosikus писал(а):Или ты всю жизнь начинающий?
Совершенно правильно, Алексей.
"Я знаю, что ничего не знаю".
Заметь, сказано очень давно, и не мной. :wink:
dosikus писал(а):Так не понятней будет ??????
Понятней, понятней. :)
Можно ещё весь раздел про BOR из даташита приписАть. Тогда совсем понятно будет. :)))

dosikus писал(а):Почему вы их до сих пор не научились подключать?
Да всё "мы" научились.
Просто кому-то нравится подключать, а кому-то включать. :wink:
Кроме того, не уверен про "MPASM for Windows", что он что-то подключать умеет, и вообще что это такое?
А то ведь, может оказаться, что как-раз галиматьёй окажется:

Код: Выделить всё

#include <P16F628A.INC>
И погоди ты умничать. Видишь, проблемы посерьёзнее. :?
ICQ нет, и, в ближайшее время, не будет.
duckens
Родился
Сообщения: 10
Зарегистрирован: Пт апр 08, 2011 01:51:39

Re: Проблема при включении устройства на PIC

Сообщение duckens »

Dmitry Dubrovenko писал(а):Посмотрел на исходник, и пока не стал никуда запихивать.

В самом начале инициализации, у Вас:

Код: Выделить всё

	clrw
	movwf 0x81
	bcf STATUS, RP0		;bank 0
	clrf INTCON		;interrupt off
С чего Вы взяли, что у Вас сразу же выставляется 1-й банк?
Да, это косяк, спасибо
Dmitry Dubrovenko писал(а): Также нет сброса регистров общего назначения.
Неправда - есть. Я пользуюсь только одной переменной WIRE - байт по адресу 0x20.
Он сбрасывается там где написано ";init variables"
Dmitry Dubrovenko писал(а): В самой программе:

Код: Выделить всё

	btfsc PORTB, 0
	btfsc WIRE, CROSS0
	btfsc WIRE, CROSS0
	btfsc INTCON, 0
	bsf WIRE, NOTOK0
Что это за конструкция?

И вообще, что должна делать программа?

Это хитрая конструкция. Мне нужно выполнить

Код: Выделить всё

	bsf WIRE, NOTOK0
если XOR от

Код: Выделить всё

	PORTB, 0
и

Код: Выделить всё

	WIRE, CROSS0
Если коротко - это написан XOR. Вернее то что Вы приводите - это половина XOR-а.
Как он работает могу объяснить отдельно если интересно.
Зачем:
Побитного (т.е. примененного не к 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 раз.
duckens
Родился
Сообщения: 10
Зарегистрирован: Пт апр 08, 2011 01:51:39

Re: Проблема при включении устройства на PIC

Сообщение duckens »

http://narod.ru/disk/9719916001/WireOk.rar.html

Вот разом все: код, hex и файл Proteus-а


Да, и еще хочу выразить "Спасибо" за внимание к проблеме.

И также прошу заметить, что проблема у меня не в сути кода (вроде бы). Тут можно ждать косяк все-таки на аппаратно-логическом уровне. Т.е. например если бы не успевало установиться напряжение на выходе, а прога уже читает вход например. Когда я об этом подумал добавил NOP между.
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2360
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: Проблема при включении устройства на PIC

Сообщение Dmitry Dubrovenko »

duckens писал(а):Это хитрая конструкция.
По-моему, весьма хитрая. :)))

duckens писал(а):Мне нужно выполнить

Код: Выделить всё

	bsf WIRE, NOTOK0
если XOR от

Код: Выделить всё

	PORTB, 0
и

Код: Выделить всё

	WIRE, CROSS0
Вы сами читаете, что пишите?

duckens писал(а):Как он работает могу объяснить отдельно если интересно.
Объясните лучше, что всё-таки должна делать программа, на понятном языке.
До п.2 понял, а вот далее, не очень.
ICQ нет, и, в ближайшее время, не будет.
duckens
Родился
Сообщения: 10
Зарегистрирован: Пт апр 08, 2011 01:51:39

Re: Проблема при включении устройства на PIC

Сообщение duckens »

Dmitry Dubrovenko писал(а): Вы сами читаете, что пишите?
Да, читаю конечно. Удивительно что Вы не поняли.
Здесь написано:

Код: Выделить всё

if NOT((PORTB, 0) XOR (WIRE, CROSS0))=true
then bsf WIRE, NOTOK0
(PORTB, 0 - это бит 0 в регистре PORTB,
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-е все моделируется нормально.
duckens
Родился
Сообщения: 10
Зарегистрирован: Пт апр 08, 2011 01:51:39

Re: Проблема при включении устройства на PIC

Сообщение duckens »

О! Граждане, я нашел в чем косяк! И не могу его объяснить, так что расскажу подробно.

Только не сейчас - уже сил нету - это надо обстоятельно объяснять и таки блок-схему рисовать.
duckens
Родился
Сообщения: 10
Зарегистрирован: Пт апр 08, 2011 01:51:39

Re: Проблема при включении устройства на PIC

Сообщение duckens »

Итак сначала рассказываю как работает прога.

1)Сначала инициализируется
2)Потом производит 4 блока измерений - проверяет она 4 провода в кабеле, поэтому и 4 блока.
3)выводит результаты

Думаю что п.п. 1 и 3 понятны из исходника и так, поэтому рассказываю 2-й.


Блок-схема:
http://narod.ru/disk/9865244001/pic.rar.html
См. 1-й файл.
Блок схема одного (из 4-х) блоков. Блок номер 0.
В этом блоке мы обращаемся на запись к 2-м переменнм

Код: Выделить всё

WIRE, NOTOK0
переменная, которая должна стать = 1 если что-то плохо с нулевым (по счету) проводом.
И переменная

Код: Выделить всё

WIRE, CROSS0
эта переменная должна стать = 1 если провод кросс, и = 0 если провод прямой.

На 0-м блоке сначала мы выставляем на выходе "b'00010000".
Далее прога ищет на входах логическую единицу. (схему входов, выходов смотри там же где и блок схема).



Первые 2 проверки - ищем КЗ. Если встречаем единицу где не надо, то пишет 1-цу в

Код: Выделить всё

WIRE, NOTOK0
Далее проверяем провод номер 2. Он - парный, так что на нем может быть и 1, если провод - кросс. Так что если там единица, то пишем 1-цу в

Код: Выделить всё

WIRE, CROSS0
И осталось проверить сам провод на предмет обрыва, т.е. 0-й бит порта B. Но дело в том, что если провод - кросс, то там ноль, а единица - во втором бите.
Таким образом надо написать 1-цу в

Код: Выделить всё

WIRE, NOTOK0
только если либо и там и там 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, 0
Ну просто потому что какая разница что брать - этот я сам сбрасываю в начале программы.
И вот это место и не работает, похоже. Такое ощущение, что регистр INTCON не сбрасывается и из-за этого XOR не выполняется нормально.

При комментировании этой части кода прога работает всегда.
Собственно вопрос к тем кто осилил: господа, почему может не сброситься регистр INTCON? или может быть я упустил из виду еще что-то?
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»