Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATtiny45 настройка PB3
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Dmitry Dubrovenko
Что-то, как говорится, либо лыжи не едут, либо...
В общем, не удаётся настроить PB3 в ATtiny45 на вход.
На выход работает нормально, как переключаю на вход, сразу откуда-то берётся 1.75V, соответственно, при опросе, воспринимается, как постоянный "0".
Вроде уж все альтернативные модули принудительно отключил. Ничего не меняется.
При этом, на симуляторе - всё в порядке.
Клок - PLL, но пробовал и внутренний RC.
_Артём_
Цитата(Dmitry Dubrovenko @ Apr 21 2013, 17:27) *
Что-то, как говорится, либо лыжи не едут, либо...
В общем, не удаётся настроить PB3 в ATtiny45 на вход.
На выход работает нормально, как переключаю на вход, сразу откуда-то берётся 1.75V, соответственно, при опросе, воспринимается, как постоянный "0".

Наверняка фузы настроены неправильно и PB3 используется как XTAL.
Dmitry Dubrovenko
Цитата(_Артём_ @ Apr 21 2013, 19:20) *
Наверняка фузы настроены неправильно и PB3 используется как XTAL.
И какими фьюзами, кроме CKSEL, это можно сделать?

Нажмите для просмотра прикрепленного файла
ILYAUL
Зачем RESET убил?
Именно ими и преключает альтернативу.
Подтяжку на порт повесить и всего делов
Dmitry Dubrovenko
Цитата(ILYAUL @ Apr 22 2013, 00:41) *
Зачем RESET убил?
Нужен дополнительный порт (а могут быть другие причины?).

Цитата(ILYAUL @ Apr 22 2013, 00:41) *
Именно ими и преключает альтернативу.
Так и что, при настройке на внутренний генератор, задействуется внешний XTAL?

Цитата(ILYAUL @ Apr 22 2013, 00:41) *
Подтяжку на порт повесить и всего делов
Что даст подтяжка, если нога на "0" (есть там подтяжка)?
ILYAUL
Первые два вопроса было не Вам.

Что на пин подключено?
Dmitry Dubrovenko
Цитата(ILYAUL @ Apr 22 2013, 22:14) *
Первые два вопроса было не Вам.
А кому?


Цитата(ILYAUL @ Apr 22 2013, 22:14) *
Что на пин подключено?
Кнопка, пока разбираюсь.
А вообще - выход с другого МК.
А какая разница?
ILYAUL
Цитата
А кому?
Артёму

Цитата
Кнопка, пока разбираюсь.

Тогда нормально.
Dmitry Dubrovenko
Цитата(ILYAUL @ Apr 23 2013, 21:44) *
Тогда нормально.
Чего нормального-то, когда "ноль" прёт? wacko.gif
ILYAUL
Нога судя по всему в воздухе
zombi
Цитата(Dmitry Dubrovenko @ Apr 23 2013, 20:36) *
Кнопка, пока разбираюсь.
А вообще - выход с другого МК.
А какая разница?

Выход другого мк обеспечит на входной ноге Вашего мк единицу а вот кнопка нет.
Если кроме кнопки ко входу ничего не подключено то всё правильно работает.

Цитата(Dmitry Dubrovenko @ Apr 22 2013, 20:32) *
Что даст подтяжка, если нога на "0" (есть там подтяжка)?

Похоже нету подтяжки laughing.gif

Цитата(Dmitry Dubrovenko @ Apr 23 2013, 21:08) *
Чего нормального-то, когда "ноль" прёт? wacko.gif

1.75V это не совсем ноль.
Dmitry Dubrovenko
Ребяты! Вы чего?
Как отсутствие подтяжки даст ноль?


Цитата(zombi @ Apr 24 2013, 00:54) *
1.75V это не совсем ноль.
Хватает, что б подключаемая линия второго МК всё время определялась, как "0".
zombi
Цитата(Dmitry Dubrovenko @ Apr 25 2013, 22:35) *
Хватает, что б подключаемая линия второго МК всё время определялась, как "0".

Я думаю что : если один из подключенных друг к другу мк выдаёт единицу а другой получает на входе ноль то один из них просто дохлый biggrin.gif
попробуйте заменить мк.
отсоедините мк друг от друга и проверьте каждый в отдельности.
Формирует ли первый на выходе 1/0?
Переходит ли линия второго в состояние входа (подключите к ней щуп осциллографа и одновременно прикоснитесь пальцем, должны увидеть некую рваную синусоиду частотой герц эдак 50).
ILYAUL
Вы схемку подключения кнопочки не ленитесь показать. И заодно почитайте о не подключенных входах цифровой логики.
Обычно на таких входах наблюдается половина напряжения питания. Но и зависит от типа используемой технологии. Так вот ваше 1.75 прекрасно вписывается в этот постулат.
Кнопка к Вашему сведению имеет 2 устойчивых состояния - ноль и бесконечность. , Сама по себе она питание не вырабатывает.
Два выхода включённых параллельно , являются друг для друга такими же кнопками.
Какой нибудь из этих двух выходов должен сгореть в итоге- деваться то ему некуда и не сбежишь.
Dmitry Dubrovenko
Друзья!
Вы прочтите с самого начала.
Как можно спалить порт, что б он на выход нормально работал, а на вход коротил?
И не на одном чипе?
zombi
1. Чем меряете 1.75V ?
2. Есть ли кроме PB3 еще входные пины? они работают?
3. Что Вы хотите что бы на этом пине было? (1.75V, как я понимаю, Вас не устраивает). а чего нужно то?
4. Может схемку приведёте для более конкретного разговора?
Dmitry Dubrovenko
1. Тестером/осциллографом
2. Есть. Работают.
3. Нужно, что б он работал входным портом, и принимал сигнал с другого МК, а не коротил его выход.
4. Кроме чипа ещё последовательный резистор на выходном порту. Рисовать?
zombi
Цитата(Dmitry Dubrovenko @ Apr 27 2013, 20:33) *
4. Кроме чипа ещё последовательный резистор на выходном порту. Рисовать?
Как хотите. А резистор зачем? и какой его номинал ?

Цитата(Dmitry Dubrovenko @ Apr 27 2013, 20:33) *
3. Нужно, что б он работал входным портом, и принимал сигнал с другого МК, а не коротил его выход.
Если после выполнения всех необходимых манипуляций (описанных в DS) с регистрами связанными с пином для перевода его в состояние входа этого не происходит.
Значит надо спрашивать у производителя.
Эх, был бы у меня такой мк я обязательно проверил бы.
Dmitry Dubrovenko
Цитата(zombi @ Apr 27 2013, 23:20) *
А резистор зачем? и какой его номинал ?
В двух словах: так надо. rolleyes.gif
Потому что данный каскад управляет токовой петлёй. Номинал его 220Ом.
Только какое отношение это имеет к входному пину?

Цитата(zombi @ Apr 27 2013, 23:20) *
Если после выполнения всех необходимых манипуляций (описанных в DS)
Так в этом, собственно, и главный вопрос. cranky.gif
Dmitry Dubrovenko
Дальнейшие эксперименты показали, что, помимо RESET'а надо ещё отключить и последовательное программирование.
Но это ещё не всё.
После выполнения следующей последовательности:
1. Корректируем бит 3 (и другие, разумеется) в регистре R16 в "0"
2. Копируем порт DDRB в регистр R18. Бит 3 был настроен в "0"
3. Производим побитное XOR регистров R18 и R16 (с сохранением в R16). "0"+"0"="0"
4. Копируем регистр R16 в порт DDRB.
Код
     andi   R16,0b00010000
     in     R18,DDRB
     eor    R16,R18
     out    DDRB,R16

"0" почему-то становится "1", и порт, соответственно, переключается на выход.
Команда
Код
andi   R18,0b00010000

после п.2 решает проблему, но хотелось бы понять, почему, в в/у пункте, вместо "0" считывается "1"?
Сергей Борщ
QUOTE (Dmitry Dubrovenko @ Jun 12 2013, 11:27) *
после п.2 решает проблему, но хотелось бы понять, почему, в в/у пункте, вместо "0" считывается "1"?
Всегда? Подозреваю, что иногда. И что в программе используются прерывания. И что не все регистры корректно сохраняются/восстанавливаются в прерываниях.
Dmitry Dubrovenko
Цитата(Сергей Борщ @ Jun 12 2013, 13:36) *
Всегда? Подозреваю, что иногда.
Напрасно подозреваете.
После включения - вход. Первая же посылка - сразу "сваливается" на вывод.

Цитата(Сергей Борщ @ Jun 12 2013, 13:36) *
И что в программе используются прерывания. И что не все регистры корректно сохраняются/восстанавливаются в прерываниях.
Это вопрос или утверждение?
В любом случае: Прерывания используются. Всё сохраняется корректно (как бы, в противном случае, программа работала).
Сергей Борщ
QUOTE (Dmitry Dubrovenko @ Jun 12 2013, 13:27) *
Напрасно подозреваете.
После включения - вход. Первая же посылка - сразу "сваливается" на вывод.
То есть вы утверждаете, что в вашем конкретном кристалле неправильно работает команда EOR? Как говорил в таких случаях великий Станиславский: "Не верю!". Приведенный вами в сообщении №20 код не может изменить состояние третьего бита DDRB. Значит каким-то образом портится либо содержимое DDRB до выполнения этого кода, либо содержимое R16 или R18 во время выполнения этого участка. Испортить регистры могут только прерывания. Как работает при этом остальная программа - загадка, но такое случается laughing.gif

Вы хотели версий - я дал одну.
Dmitry Dubrovenko
Цитата(Сергей Борщ @ Jun 12 2013, 15:34) *
в вашем конкретном кристалле
Конкретных двух кристаллах из разных партий, и разных корпусах (см. предыдущие посты).

Цитата(Сергей Борщ @ Jun 12 2013, 15:34) *
Вы хотели версий - я дал одну.
Поскольку неправильное выполнение команды EOR, как и порча содержимого регистров, маловероятно, напрашивается вывод, что неправильно считывается содержимое порта DDRB (это, кстати, вовсе не означает, что его содержимое испорчено).
Так вот, и хотелось бы услышать гуру, почему такое происходит?

P.S.: А данный код как-раз и выполняется в прерывании.
Сергей Борщ
QUOTE (Dmitry Dubrovenko @ Jun 12 2013, 16:21) *
Конкретных двух кристаллах из разных партий, и разных корпусах (см. предыдущие посты).
Тем более.
QUOTE (Dmitry Dubrovenko @ Jun 12 2013, 16:21) *
напрашивается вывод, что неправильно считывается содержимое порта DDRB
Это не порт. Это регистр направления. Внутренний регистр. Вероятность его порчи по аппаратным причинам ничтожно мала.
QUOTE (Dmitry Dubrovenko @ Jun 12 2013, 16:21) *
P.S.: А данный код как-раз и выполняется в прерывании.
Вот может это прерывание происходит во время доступа к этому же регистру из основного цикла? В этом случае надо в основном цикле обращения к этому регистру (как и к любой другой разделяемой переменной) выполнять при запрещенном прерывании.
Dmitry Dubrovenko
Цитата(Сергей Борщ @ Jun 12 2013, 17:41) *
Это не порт
У AVR это называется именно "порт", с использованием соответствующих инструкций.

Цитата(Сергей Борщ @ Jun 12 2013, 17:41) *
Вероятность его порчи по аппаратным причинам ничтожно мала.
Повторяю ещё раз: Неправильное считывание вовсе не означает повреждения регистра.

Цитата(Сергей Борщ @ Jun 12 2013, 17:41) *
Вот может это прерывание происходит во время доступа к этому же регистру из основного цикла?
Не происходит.
Maik-vs
Как-то сложно всё у ваc в 20м сообщении.
Нельзя просто записать константу в DDR? По приведённому куску кода я вижу инверсию ЧЕТВЁРТОГО бита DDRB, если он был "1" в r16 до "andi r16". А третий (и все, кроме четвёртого) бит в DDRB не изменился.
Сергей Борщ
QUOTE (Dmitry Dubrovenko @ Jun 12 2013, 17:40) *
У AVR это называется именно "порт", с использованием соответствующих инструкций.
Портом называется совокупность ног ввода-вывода и связанных с ними регистров PORTx, PINx, DDRx. А отдельно взятый DDRx - регистр специального назначения (Special Function Register, SFR).
QUOTE (Dmitry Dubrovenko @ Jun 12 2013, 17:40) *
Повторяю ещё раз: Неправильное считывание вовсе не означает повреждения регистра.
Ну продолжайте бороться с ветряными мельницами. Заметьте - вы первый за почти 20 лет существования AVR нашли в них такую особенность. Или смотрите питание - какой там должен быть ужас, чтобы сигнал добегал с искажениями из одной части кристалла до другой? Опять же, питание маловероятно ибо стабильно только один сигнал и на нескольких разных кристаллах. Ищите в консерватории своей программе.

P.S. да, когда найдете причину - не забудьте сообщить ее здесь.
Dmitry Dubrovenko
Цитата(Сергей Борщ @ Jun 14 2013, 16:05) *
Портом называется совокупность ног ввода-вывода и связанных с ними регистров PORTx, PINx, DDRx.
Ссылочку на источник, плиз.
А по-моему, логичнее называть "портом" то, для чего используются команды работы с портом (см., например, даташит на ATtiny 25/45/85, стр.206).

Цитата(Сергей Борщ @ Jun 14 2013, 16:05) *
Заметьте - вы первый за почти 20 лет существования AVR нашли в них такую особенность
Я Вас умоляю!
Если Вы не сталкивались, не надо за всех говорить.
Одних ерратов сколько вышло.
Посмотрите Гугль по теме, типа: "не программируется 2313a по HVPP", или ещё чего-нибудь, узнаете много интересного.

Цитата(Сергей Борщ @ Jun 14 2013, 16:05) *
Или смотрите питание - какой там должен быть ужас, чтобы сигнал добегал с искажениями из одной части кристалла до другой?
Чё ж у Вас за решения каие-то всё "координальные". По-моему, уже самому начинающему должно уже быть понятно, что, если это не глюк/особенность чипа, то - ошибка конфигурации. Или Вы хотите сказать, что одной строчкой в программе можно убрать помехи по питанию?

Цитата(Сергей Борщ @ Jun 14 2013, 16:05) *
Ищите в консерватории своей программе.
Вы хотите сказать, что в порт регистр DDRx можно записать "1" и он не переключится на выход?

Цитата(Сергей Борщ @ Jun 14 2013, 16:05) *
когда найдете причину - не забудьте сообщить ее здесь.
А это надо? У всех же всё и так работает.
И вообще, найдите хотя бы пяток человек, которые Ресет отключают. А некоторые об этом и не знают. rolleyes.gif
Некоторые также не понимают, зачем выводить информацию в DDRx, а не в PORTx.


Цитата(Maik-vs @ Jun 14 2013, 14:57) *
я вижу инверсию ЧЕТВЁРТОГО бита DDRB, если он был "1" в r16 до "andi r16".
Не совсем так. Там возможны четыре варианта:
1. Бит в DDRB был "1", в r16 - "1" --> бит в DDRB инветртирутся.
2. Бит в DDRB был "1", в r16 - "0" --> бит в DDRB не инветртирутся.
3. Бит в DDRB был "0", в r16 - "1" --> бит в DDRB инветртирутся.
4. Бит в DDRB был "0", в r16 - "0" --> бит в DDRB не инветртирутся.
Это сделано, что бы исключить джиттер.
Поскольку это - софтовый UART, необходимо, что б все смены уровней происходили через одинаковые интервалы, поэтому все ветки программы (включая вход в обработчик прерывания) выровнены и оптимизированы по времени.

Цитата(Maik-vs @ Jun 14 2013, 14:57) *
А третий (и все, кроме четвёртого) бит в DDRB не изменился.
ДОЛЖЕН не изменяться, но почему-то (без принудительного сброса) меняется.
В этом собственно и суть вопроса. sm.gif
_Артём_
Цитата(Dmitry Dubrovenko @ Jun 14 2013, 19:20) *
что б все смены уровней происходили через одинаковые интервалы, поэтому все ветки программы (включая вход в обработчик прерывания) выровнены и оптимизированы по времени.

И какую точность удалось получить с помощью "выравнивания" программы?

Цитата(Dmitry Dubrovenko @ Jun 14 2013, 19:20) *
Это сделано, что бы исключить джиттер.
Поскольку это - софтовый UART, необходимо, что б все смены уровней происходили через одинаковые интервалы, поэтому все ветки программы (включая вход в обработчик прерывания) выровнены и оптимизированы по времени.

Какой джиттер? UART от 1-2% RC-генератора работает без проблем.
От чего у вас кстати МК тактируется?

Цитата(Dmitry Dubrovenko @ Jun 14 2013, 19:20) *
в порт регистр DDRx можно записать "1" и он не переключится на выход?

Если альтернативная функция порта задействована, то может и не переключится.

Цитата(Dmitry Dubrovenko @ Jun 14 2013, 19:20) *
А по-моему, логичнее называть "портом" то, для чего используются команды работы с портом (см., например, даташит на ATtiny 25/45/85, стр.206).

По такой логике, к примеру, PORTG и PORTF mega128 портами не являются.
Dmitry Dubrovenko
Цитата(_Артём_ @ Jun 14 2013, 20:44) *
И какую точность удалось получить с помощью "выравнивания" программы?
Абсолютную.

Цитата(_Артём_ @ Jun 14 2013, 20:44) *
Какой джиттер?
В каком смысле "какой"? Они что, разные бывают?

Цитата(_Артём_ @ Jun 14 2013, 20:44) *
UART от 1-2% RC-генератора работает без проблем.
Вы вообще о чём? При чём тут какой-то UART, который где-то работает?

Цитата(_Артём_ @ Jun 14 2013, 20:44) *
От чего у вас кстати МК тактируется?
А прочесть пару первых постов?

Цитата(_Артём_ @ Jun 14 2013, 20:44) *
Если альтернативная функция порта задействована, то может и не переключится.
А и надо, что б он не переключался, а он как-раз переключается.
Впрочем влияние альтернативных функций - одна из версий (о чём писАл не далее, как в предыдущем посте). Если знаете какие-то тонкости настройки, вэлком!
_Артём_
Цитата(Dmitry Dubrovenko @ Jun 14 2013, 20:00) *
Абсолютную.

А смысл в этой точности?

Цитата(Dmitry Dubrovenko @ Jun 14 2013, 20:00) *
Вы вообще о чём? При чём тут какой-то UART, который где-то работает?

Я к тому что UART не требует абсолютной точности, тем более при работе от RC-генератора.
Но к вашей проблеме это мало относится...

Цитата(Dmitry Dubrovenko @ Jun 14 2013, 20:00) *
А и надо, что б он не переключался, а он как-раз переключается.

Как вы это определяете? Осциллографом? Отладчиком?

Цитата(Dmitry Dubrovenko @ Jun 14 2013, 20:00) *
Впрочем влияние альтернативных функций - одна из версий

Имхо, маловероятно - я не нашёл альтернативных функций которые могут установить DDB3. Есть функции, которые требуют установки DDB3, но тех что сами ставят нет. Фузы могут отключать этот пин, но на вход.

Остаётся ошибка в программе: одновременная запись в разных местах программы или запись в DDRB по неправильному указателю или может ещё что...
Думать что
Код
DDRD = DDRD xor 0x10

установит DDB3 в "1" как-то бессмысленно.
Сергей Борщ
QUOTE (Dmitry Dubrovenko @ Jun 14 2013, 19:20) *
Ссылочку на источник, плиз.

Даташит на вашу ATtiny45, стр. 55:
QUOTE
Three I/O memory address locations are allocated for each port, one each for the Data Register
– PORTx, Data Direction Register – DDRx, and the Port Input Pins – PINx. The Port Input Pins
I/O location is read only, while the Data Register and the Data Direction Register are read/write.
Тут же, кстати, фигурирует и расшифровка аббревиатуры DDR (выделил специально для вас).
QUOTE (Dmitry Dubrovenko @ Jun 14 2013, 19:20) *
А по-моему, логичнее называть "портом" то, для чего используются команды работы с портом (см., например, даташит на ATtiny 25/45/85, стр.206).

Даташит ревизии N от 04.11, стр 205-206:
QUOTE
23. Register Summary
........
Note: 1. For compatibility with future devices, reserved bits should be written to zero if accessed. Reserved I/O memory addresses
should never be written.
2. I/O Registers within the address range 0x00 - 0x1F are directly bit-accessible using the SBI and CBI instructions. In these
registers, the value of single bits can be checked by using the SBIS and SBIC instructions.
3. Some of the Status Flags are cleared by writing a logical one to them. Note that, unlike most other AVRs, the CBI and SBI
instructions will only operation the specified bit, and can therefore be used on registers containing such Status Flags. The
CBI and SBI instructions work with registers 0x00 to 0x1F only.
Ни слова про порт. А вот слово Register вынесено в заголовок раздела.

QUOTE (Dmitry Dubrovenko @ Jun 14 2013, 19:20) *
Я Вас умоляю!
Если Вы не сталкивались, не надо за всех говорить.
Одних ерратов сколько вышло.
Во- первых в эррате нет ни слова про то, что "регистр DDR может иногда читаться неправильно" или "команда EOR иногда может работать неправильно".
Во-вторых, "миллионы леммингов не могут ошибаться" и если бы описанные вами ошибки в кристалле имели место - они бы уже были много раз найдены, описаны в эррате, а кристаллы пошли бы в мусорку, ибо с такими дефектами ни одна программа сложнее "мигания одним светодиодом" не могла бы работать.
QUOTE (Dmitry Dubrovenko @ Jun 14 2013, 19:20) *
Посмотрите Гугль по теме, типа: "не программируется 2313a по HVPP", или ещё чего-нибудь, узнаете много интересного.
Вы можете посмотреть хоть Гуглю хоть этот форум на предмет "ошибка компилятора". В 99.9% случаев оказывается, что виноват горе-программист.
QUOTE (Dmitry Dubrovenko @ Jun 14 2013, 19:20) *
По-моему, уже самому начинающему должно уже быть понятно, что, если это не глюк/особенность чипа, то - ошибка конфигурации. Или Вы хотите сказать, что одной строчкой в программе можно убрать помехи по питанию?
Начинающему может быть и понятно, а специалисту хотя бы с небольшим опытом очевидно, что ошибка где-то в вашей программе. Вот уже и конфигурация всплыла... О конфигурации чего вы теперь ведете речь?
QUOTE (Dmitry Dubrovenko @ Jun 14 2013, 19:20) *
Вы хотите сказать, что в порт регистр DDRx можно записать "1" и он не переключится на выход?
Откуда вы такое взяли? Я утверждаю, что если порт переключился на выход, значит кто-то где-то записал единицу в соответствующий разряд DDR. И надо искать кто и где это делает, а не валить все на некорректную работу элементарных команд или узлов кристалла.
QUOTE (Dmitry Dubrovenko @ Jun 14 2013, 19:20) *
И вообще, найдите хотя бы пяток человек, которые Ресет отключают. А некоторые об этом и не знают.
При чем здесь вывод RESET? Он у вашей тиньки совмещен с пятым, а не третьим битом порта C. Или вам не нужно найти причину неправильного поведения вашей программы, а важно лишь поспорить, причем совершенно все равно - о чем?
QUOTE (Dmitry Dubrovenko @ Jun 14 2013, 19:20) *
Некоторые также не понимают, зачем выводить информацию в DDRx, а не в PORTx.
Некоторые могут и не понимать. Хотели открыть нам Истину - не вышло. Для организации выхода типа "открытый коллектор". Весь грамотно написанный программный I2C строится именно так. Неграмотных реализаций полно и в интернете и на этом форуме они всплывали тоже.
QUOTE (Dmitry Dubrovenko @ Jun 14 2013, 19:20) *
Поскольку это - софтовый UART, необходимо, что б все смены уровней происходили через одинаковые интервалы,
Нет, не необходимо. Если это софтовый UART. Достаточно, чтобы длительность каждого битового интервала укладывалась в допуски, т.е. чтобы в конце десятого бита "разбег" между приемником и передатчиком был не более половины бита. Это дает +-2.5% на длительность каждого бита для каждой стороны (+-2.5% для приемника и +-2.5% для передатчика).
Dmitry Dubrovenko
Цитата(_Артём_ @ Jun 15 2013, 00:11) *
А смысл в этой точности?
Неужели надо объяснять, что погрешности перемножаются?
Зачем, имея погрешность генераторов и линий, накладывать ещё погрешность программы?
Я поставил задачу её исключить.
Разумеется, если кто-то считает, что это - лишнее, может этого не делать.
Но, это - действительно оффтоп.

Цитата(_Артём_ @ Jun 15 2013, 00:11) *
Остаётся ошибка в программе
Давайте рассуждать.
Установлено, что ошибка происходит при считывании данных из регистра DDRB (вместо "0" считывается "1")
Как Вы (и многие другие) утверждаете, где-то в другом месте программы, происходит запись в этот регистр "1".
При этом порт продолжает работать на вход.
Такое может быть?
Впрочем, стопроцентную гарантию обеспечивает только страховой полис, и раз уж Вы (и остальные) так на этом настаиваете, давайте возмём под сомнение в/у утверждение, и подумаем, каким образом данные могут записаться не в тот регистр, в который предназначались?




Цитата(Сергей Борщ @ Jun 15 2013, 01:38) *
Даташит на вашу ATtiny45, стр. 55
Three I/O memory address locations are allocated for each port, one each for the Data Register – PORTx, Data Direction Register – DDRx, and the Port Input Pins – PINx. The Port Input Pins I/O location is read only, while the Data Register and the Data Direction Register are read/write.
Это переводится, как: "Портом называется совокупность ног ввода-вывода и связанных с ними регистров PORTx, PINx, DDRx"?

Цитата(Сергей Борщ @ Jun 15 2013, 01:38) *
Ни слова про порт.
Невнимательно смотрите.
Стр.206: "In Port", "Out Port".
Но, если Вам так принципиально, будем считать, что Вы - правы, и давайте больше к этому вопросу не возвращаться (и так половина оффтопа в теме).

Цитата(Сергей Борщ @ Jun 15 2013, 01:38) *
Во- первых в эррате нет ни слова про то, что "регистр DDR может иногда читаться неправильно" или "команда EOR иногда может работать неправильно".
Это Вы к чему?
Если б они там были, этой бы темы и не существовало.

Цитата(Сергей Борщ @ Jun 15 2013, 01:38) *
если бы описанные вами ошибки в кристалле имели место - они бы уже были много раз найдены, описаны в эррате
Ну, покажите, где в еррате написанно, что вместе с ресетом надо отключать SPI?
Или где написанно, что для некоторых кристаллов STK-500 меняет функционал выводов?

Цитата(Сергей Борщ @ Jun 15 2013, 01:38) *
кристаллы пошли бы в мусорку, ибо с такими дефектами ни одна программа сложнее "мигания одним светодиодом" не могла бы работать.
Вот те раз!
Даже моя программа и то работает, не говоря уже о "миллионах" которые не лезут в такие "дебри".

Цитата(Сергей Борщ @ Jun 15 2013, 01:38) *
При чем здесь вывод RESET?
См. выше.

И вот, что я Вам хочу сказать.
Если Вами движет желание действительно помочь, Вам действительно интересна данная тема, и Вы хотите, что б был диалог, то:
1. Прочтите тему с начала (что б не спрашивать то, о чём сказано в начале)
2. Говорите от себя, а не за "миллионы" (по-моему, так должен поступать любой хомо-сапиенс)
Ваша основная мысль - "ошибка в программе" вполне ясна. Безусловно, я её ещё раз тщательно проверю.
И, если у Вас не возникнет других мыслей, не надо устраивать оффтоп, который, уж извините, я буду просто игнорировать.


Сергей Борщ
QUOTE (Dmitry Dubrovenko @ Jun 15 2013, 13:59) *
Давайте рассуждать.
Установлено, что ошибка происходит при считывании данных из регистра DDRB (вместо "0" считывается "1")
Как Вы (и многие другие) утверждаете, где-то в другом месте программы, происходит запись в этот регистр "1".

Нет. Это вам кажется, что вместо 0 считывается 1. Остальные участники дискусии пытаются вас убедить в том, что 1 считывается именно потому, что он был туда (случайно) записан вашей программой.
QUOTE (Dmitry Dubrovenko @ Jun 15 2013, 13:59) *
Впрочем, стопроцентную гарантию обеспечивает только страховой полис, и раз уж Вы (и остальные) так на этом настаиваете, давайте возмём под сомнение в/у утверждение, и подумаем, каким образом данные могут записаться не в тот регистр, в который предназначались?
Ваше знание классиков делает вам честь. Причин же может быть великое множество. Некоторые из них, связанные с прерываниями, я пытался вам изложить. Не видя исходника гадать можно до потери сознания (однако, боюсь, найдется совсем немного желающих ковыряться в ассемблерном исходнике даже если вы его покажете).
QUOTE (Dmitry Dubrovenko @ Jun 15 2013, 13:59) *
Это переводится, как: "Портом называется совокупность ног ввода-вывода и связанных с ними регистров PORTx, PINx, DDRx"?
Вы не поверите...

QUOTE (Dmitry Dubrovenko @ Jun 15 2013, 13:59) *
Стр.206: "In Port", "Out Port".
Я понял. Это рудимент с времен i8080, когда адресные пространства делились на "память" и "порты ввода-вывода". И тогда действительно периферийные устройства подключались к процессору как устройства ввода-вывода и адресовались только командами IN и OUT. Сейчас же "смешались в кучу кони, люди" и используется более общее название "регистры специального назначения". Портами же принято называть нечто, "торчащее ногами наружу". И именно в таком ключе написана вся остальная документация на контроллер.
QUOTE (Dmitry Dubrovenko @ Jun 15 2013, 13:59) *
Это Вы к чему?
Если б они там были, этой бы темы и не существовало.
Это я к тому, что если бы был повод, то они бы там были. Просто по теории вероятностей если бы такая ошибка существовала, ее уже давно нашли бы. Если бы вы работали с инженерными образцами кристаллов - такую возможность можно было бы допустить, но в этом случае вы бы писали не сюда, а непосредственно в Атмел по прямому каналу в отдел разработок или как он там называется (в свое время я писал подобные письма в Texas Instruments по поводу первых образцов флешовых MSP430).
QUOTE (Dmitry Dubrovenko @ Jun 15 2013, 13:59) *
Ну, покажите, где в еррате написанно, что вместе с ресетом надо отключать SPI?
Или где написанно, что для некоторых кристаллов STK-500 меняет функционал выводов?
Оппа... Давайте вы изложите проблему более подробно, я распаяю в макетку имеющийся у меня ATtiny85 и мы попробуем разобраться с этим вопросом отдельно. У меня есть некоторая уверенность, что все не так страшно, как вам кажется.
QUOTE (Dmitry Dubrovenko @ Jun 15 2013, 13:59) *
Даже моя программа и то работает, не говоря уже о "миллионах" которые не лезут в такие "дебри".
Простите, а что здесь дебри - команда "Исключающее ИЛИ" или чтение регистра DDRx?

QUOTE (Dmitry Dubrovenko @ Jun 15 2013, 13:59) *
Ваша основная мысль - "ошибка в программе" вполне ясна. Безусловно, я её ещё раз тщательно проверю.
Спорю на пиво. Перешлю вам 1.5л красного имбиного Ingver Alus, если виноватым окажется не ваша программа. Если же ошибка в программе - вы мне пересылаете 1.5л вашего хорошего нефильтрованного. Принимаете?
Dmitry Dubrovenko
Цитата(Сергей Борщ @ Jun 16 2013, 02:47) *
1 считывается именно потому, что он был туда (случайно) записан вашей программой.
Почти Ваша правда. "1" не считывается, но дело действительно было в программе.

Цитата(Сергей Борщ @ Jun 16 2013, 02:47) *
Вы не поверите...
Не поверю.

Цитата(Сергей Борщ @ Jun 16 2013, 02:47) *
Это рудимент с времен i8080
Это "рудимент" терминалогии Атмела, которые выделили их в отдельную область и назвали "I/O Register"

Цитата(Сергей Борщ @ Jun 16 2013, 02:47) *
ее уже давно нашли бы
Так может и нашли, но я не читал.

Цитата(Сергей Борщ @ Jun 16 2013, 02:47) *
Давайте вы изложите проблему более подробно
Проблема 1: При отключённом Ресете, но включённом последовательном программировании, на в/у PB3, если он настраивался на вход, висело 1,75V. Сегодня опять попробовал, но всё заработало нормально (экспериментировал со старой программой, ещё до того, как исправил). Поэтому остаётся записать в "загадки".
Проблема 2: STK-500 не хочет программировать ATtiny 2313a по HVPP
Проблема 3: Для некоторых кристаллов, в STK-500 меняется функционал выходных портов. Проблема решена переделкой адаптера.
Проблема 4: При использовании конвертера USB-COM, необходимо устанавливать Jungo, иначе Студия не видит STK-500 (как программатор), хотя может заливать прошивку в сам программатор.

Цитата(Сергей Борщ @ Jun 16 2013, 02:47) *
а что здесь дебри
Отключение Ресета, да и вообще высоковольтное программирование. Правда "дебри", наверное, не совсем правильное выражение.

Цитата(Сергей Борщ @ Jun 16 2013, 02:47) *
Принимаете?
Поздняк метаться. cheers.gif
P.S.: Кстати, пива не жалко и так, но вот с пересылкой, это - такой гемор.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.