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

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

|
Что-то, как говорится, либо лыжи не едут, либо... В общем, не удаётся настроить PB3 в ATtiny45 на вход. На выход работает нормально, как переключаю на вход, сразу откуда-то берётся 1.75V, соответственно, при опросе, воспринимается, как постоянный "0". Вроде уж все альтернативные модули принудительно отключил. Ничего не меняется. При этом, на симуляторе - всё в порядке. Клок - PLL, но пробовал и внутренний RC.
--------------------
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, 21:38
|

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

|
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% для передатчика).
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 15 2013, 10:59
|

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

|
Цитата(_Артём_ @ 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. Говорите от себя, а не за "миллионы" (по-моему, так должен поступать любой хомо-сапиенс) Ваша основная мысль - "ошибка в программе" вполне ясна. Безусловно, я её ещё раз тщательно проверю. И, если у Вас не возникнет других мыслей, не надо устраивать оффтоп, который, уж извините, я буду просто игнорировать.
--------------------
Obligatus servus.
|
|
|
|
Сообщений в этой теме
Dmitry Dubrovenko ATtiny45 настройка PB3 Apr 21 2013, 14:27 _Артём_ Цитата(Dmitry Dubrovenko @ Apr 21 2013, 17... Apr 21 2013, 15:20 Dmitry Dubrovenko Цитата(_Артём_ @ Apr 21 2013, 19:20) Наве... Apr 21 2013, 19:10 ILYAUL Зачем RESET убил?
Именно ими и преключает альтерн... Apr 21 2013, 20:41 Dmitry Dubrovenko Цитата(ILYAUL @ Apr 22 2013, 00:41) Зачем... Apr 22 2013, 17:32 ILYAUL Первые два вопроса было не Вам.
Что на пин подклю... Apr 22 2013, 18:14 Dmitry Dubrovenko Цитата(ILYAUL @ Apr 22 2013, 22:14) Первы... Apr 23 2013, 17:36  zombi Цитата(Dmitry Dubrovenko @ Apr 23 2013, 20... Apr 23 2013, 20:54   Dmitry Dubrovenko Ребяты! Вы чего?
Как отсутствие подтяжки даст ... Apr 25 2013, 19:35    zombi Цитата(Dmitry Dubrovenko @ Apr 25 2013, 22... Apr 25 2013, 20:19 ILYAUL ЦитатаА кому? Артёму
ЦитатаКнопка, пока разбираюс... Apr 23 2013, 17:44 Dmitry Dubrovenko Цитата(ILYAUL @ Apr 23 2013, 21:44) Тогда... Apr 23 2013, 18:08 ILYAUL Нога судя по всему в воздухе Apr 23 2013, 19:03 ILYAUL Вы схемку подключения кнопочки не ленитесь показат... Apr 25 2013, 20:49 Dmitry Dubrovenko Друзья!
Вы прочтите с самого начала.
Как можно... Apr 26 2013, 16:45 zombi 1. Чем меряете 1.75V ?
2. Есть ли кроме PB3 еще вх... Apr 26 2013, 20:11 Dmitry Dubrovenko 1. Тестером/осциллографом
2. Есть. Работают.
3. Ну... Apr 27 2013, 17:33 zombi Цитата(Dmitry Dubrovenko @ Apr 27 2013, 20... Apr 27 2013, 19:20  Dmitry Dubrovenko Цитата(zombi @ Apr 27 2013, 23:20) А рези... Apr 28 2013, 11:23         _Артём_ Цитата(Dmitry Dubrovenko @ Jun 14 2013, 19... Jun 14 2013, 16:54          Dmitry Dubrovenko Цитата(_Артём_ @ Jun 14 2013, 20:44) И ка... Jun 14 2013, 17:00           _Артём_ Цитата(Dmitry Dubrovenko @ Jun 14 2013, 20... Jun 14 2013, 20:11           Сергей Борщ QUOTE (Dmitry Dubrovenko @ Jun 15 2013, 13... Jun 15 2013, 22:47            Dmitry Dubrovenko Цитата(Сергей Борщ @ Jun 16 2013, 02:47) ... Jun 16 2013, 20:12 Maik-vs Как-то сложно всё у ваc в 20м сообщении.
Нельзя п... Jun 14 2013, 10:57
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|