|
|
  |
ATtiny45 настройка PB3 |
|
|
|
Apr 27 2013, 19:20
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(Dmitry Dubrovenko @ Apr 27 2013, 20:33)  4. Кроме чипа ещё последовательный резистор на выходном порту. Рисовать? Как хотите. А резистор зачем? и какой его номинал ? Цитата(Dmitry Dubrovenko @ Apr 27 2013, 20:33)  3. Нужно, что б он работал входным портом, и принимал сигнал с другого МК, а не коротил его выход. Если после выполнения всех необходимых манипуляций (описанных в DS) с регистрами связанными с пином для перевода его в состояние входа этого не происходит. Значит надо спрашивать у производителя. Эх, был бы у меня такой мк я обязательно проверил бы.
|
|
|
|
|
Apr 28 2013, 11:23
|

Частый гость
 
Группа: Участник
Сообщений: 174
Регистрация: 3-11-06
Из: Санкт-Ленинград
Пользователь №: 21 949

|
Цитата(zombi @ Apr 27 2013, 23:20)  А резистор зачем? и какой его номинал ? В двух словах: так надо.  Потому что данный каскад управляет токовой петлёй. Номинал его 220Ом. Только какое отношение это имеет к входному пину? Цитата(zombi @ Apr 27 2013, 23:20)  Если после выполнения всех необходимых манипуляций (описанных в DS) Так в этом, собственно, и главный вопрос.
--------------------
Obligatus servus.
|
|
|
|
|
Jun 12 2013, 08:27
|

Частый гость
 
Группа: Участник
Сообщений: 174
Регистрация: 3-11-06
Из: Санкт-Ленинград
Пользователь №: 21 949

|
Дальнейшие эксперименты показали, что, помимо 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"?
--------------------
Obligatus servus.
|
|
|
|
|
Jun 12 2013, 10:27
|

Частый гость
 
Группа: Участник
Сообщений: 174
Регистрация: 3-11-06
Из: Санкт-Ленинград
Пользователь №: 21 949

|
Цитата(Сергей Борщ @ Jun 12 2013, 13:36)  Всегда? Подозреваю, что иногда. Напрасно подозреваете. После включения - вход. Первая же посылка - сразу "сваливается" на вывод. Цитата(Сергей Борщ @ Jun 12 2013, 13:36)  И что в программе используются прерывания. И что не все регистры корректно сохраняются/восстанавливаются в прерываниях. Это вопрос или утверждение? В любом случае: Прерывания используются. Всё сохраняется корректно (как бы, в противном случае, программа работала).
--------------------
Obligatus servus.
|
|
|
|
|
Jun 12 2013, 13:21
|

Частый гость
 
Группа: Участник
Сообщений: 174
Регистрация: 3-11-06
Из: Санкт-Ленинград
Пользователь №: 21 949

|
Цитата(Сергей Борщ @ Jun 12 2013, 15:34)  в вашем конкретном кристалле Конкретных двух кристаллах из разных партий, и разных корпусах (см. предыдущие посты). Цитата(Сергей Борщ @ Jun 12 2013, 15:34)  Вы хотели версий - я дал одну. Поскольку неправильное выполнение команды EOR, как и порча содержимого регистров, маловероятно, напрашивается вывод, что неправильно считывается содержимое порта DDRB (это, кстати, вовсе не означает, что его содержимое испорчено). Так вот, и хотелось бы услышать гуру, почему такое происходит? P.S.: А данный код как-раз и выполняется в прерывании.
Сообщение отредактировал Dmitry Dubrovenko - Jun 12 2013, 13:24
--------------------
Obligatus servus.
|
|
|
|
|
Jun 12 2013, 13:41
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
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.: А данный код как-раз и выполняется в прерывании. Вот может это прерывание происходит во время доступа к этому же регистру из основного цикла? В этом случае надо в основном цикле обращения к этому регистру (как и к любой другой разделяемой переменной) выполнять при запрещенном прерывании.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 12 2013, 14:40
|

Частый гость
 
Группа: Участник
Сообщений: 174
Регистрация: 3-11-06
Из: Санкт-Ленинград
Пользователь №: 21 949

|
Цитата(Сергей Борщ @ Jun 12 2013, 17:41)  Это не порт У AVR это называется именно "порт", с использованием соответствующих инструкций. Цитата(Сергей Борщ @ Jun 12 2013, 17:41)  Вероятность его порчи по аппаратным причинам ничтожно мала. Повторяю ещё раз: Неправильное считывание вовсе не означает повреждения регистра. Цитата(Сергей Борщ @ Jun 12 2013, 17:41)  Вот может это прерывание происходит во время доступа к этому же регистру из основного цикла? Не происходит.
--------------------
Obligatus servus.
|
|
|
|
|
Jun 14 2013, 12:05
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
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. да, когда найдете причину - не забудьте сообщить ее здесь.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 14 2013, 16:20
|

Частый гость
 
Группа: Участник
Сообщений: 174
Регистрация: 3-11-06
Из: Санкт-Ленинград
Пользователь №: 21 949

|
Цитата(Сергей Борщ @ 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)  когда найдете причину - не забудьте сообщить ее здесь. А это надо? У всех же всё и так работает. И вообще, найдите хотя бы пяток человек, которые Ресет отключают. А некоторые об этом и не знают.  Некоторые также не понимают, зачем выводить информацию в 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 не изменился. ДОЛЖЕН не изменяться, но почему-то (без принудительного сброса) меняется. В этом собственно и суть вопроса.
--------------------
Obligatus servus.
|
|
|
|
|
Jun 14 2013, 16:54
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(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 портами не являются.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|