MOZK12342
|
||||||
1 | ||||||
Состояние PORT не передается в PIN20.05.2017, 22:30. Показов 7290. Ответов 40
Метки нет (Все метки)
Добрый день!
Недавно я начал изучение программирования МК. Платформа Code vision, отладчик AVR studyo v.4.19. Микроконтройлер - ATMiko8. Задача: настроить PORTB на ввод, подтянуть внутренними резисторами к +, схематически подключить кнопку на массу и все это дело считывать и выполнять действие. Пишу код: Инициализация DDRB=0x00; PORTB=0xFF; после этого мне нужно проверить состояние кнопки, как я понимаю считывать состояние нужно из PINB. Проверяю условие: if(PINB.0==0) Отладчик всегда выполняет условие, т.к. PINB даже и не думал выставляться в единицы. Настраиваю порт на вывод (DDRB=0xFF)(кликами мышки в отладчике), и PINB начинает принимать состояние PORTB следующим шагом при отладке, сбрасываю DDRB и снова PINB замирает. Удивительно, что в Proteus все работает, но как работать с отладкой? Программа тренировочная - ведет счет при нажатии кнопки Код
|
20.05.2017, 22:30 | |
Ответы с готовыми решениями:
40
Не устанавливается PIN после установки PORT в 1 Модернизация китайского 4 pin разветвителя: добавление поддержки PWM на 3 pin и 2 pin вентиляторах Блок питания 8 pin или 4 pin и переходник на 8 pin? Supermicro x9dbu работает на 8-pin + 8-pin без 4-pin Какой артикул у разъема Apple ssd 6+12 pin и 7+17 pin |
1 / 1 / 0
Регистрация: 28.03.2015
Сообщений: 94
|
|
14.01.2020, 11:23 | 21 |
Нет, я ожидал что выход PIN изменит свое состояние на "высокий"одновременно с появлением высокого уровня на Port, так в самоучителе пишут, но это не произошло. Т.е. ожидаемое не совпало с увиденным. Кто косячит: я, букварь, или симулятор?
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
|
|
14.01.2020, 12:13 | 22 |
Наличие задержки между чтением и записью описано где-то в даташите. С ходу, правда, не нашел, где именно.
Микроконтроллер - штука синхронная. Любой процесс происходит у него за один такт, и о том, что было между тактами, он не знает. Более того, любая физическая система обладает инерцией, то есть порт не может переключиться мгновенно, что на чтение, что на запись. Вот и получается, что на первом такте вы записываете в порт значение, и оно только начинает меняться. И тут же считываете его. А система-то инерционная, значение в порту измениться еще не успело. Это на самом примитивном уровне. Если хотите подробностей, почитайте еще что такое буферизация, конвейер выполнения. Да и общие знания по цифровой схемотехнике лишними не будут. Добавлено через 6 минут Все-таки нашел:
Сообщение от Даташит на ATmega8, глава I/O ports
Сообщение от Евстифеев, глава 6.3 - Конфигурирование портов ввода-вывода
1
|
1 / 1 / 0
Регистрация: 28.03.2015
Сообщений: 94
|
|
15.01.2020, 09:24 | 23 |
Укажу источник моих ожиданий, в нем, со слов автора, используется Atmel Studio 6 (я использую студию 4.19), и на скрине показывается что уровни PORT и PIN становятся высокими (оба) после выполнения команды PORTD = 0b00000001; Не только показывается, но и комментируется в тексте. В студии 4.19 добиться такого я не смог. В чем причина расхождения? В студии 6 изменили механизм, или ошибка в изложении материала? Кстати, автор иногда путает местами "правый" и "левый"
http://narodstream.ru/avr-urok... m-svetodi/
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
|
|
15.01.2020, 11:51 | 24 |
Самый надежный источник информации - даташит производителя.
Если чье-то высказывание противоречит даташиту, оно скорее всего неверное. Если сомнение остается, можно еще заглянуть в errata (перечень ошибок). Если и там нет, то, в лучшем случае, высказавший наткнулся на недокументированное или неопределенное поведение. Полагаться на него нельзя, но учитывать такую неоднозначность придется. Так и в вашем случае: в одном месте пин переключается сразу, в другом через такт, а в реальности там довольно долгие переходные процессы, особенно если на ножке что-то висит. Когда увидел это: PORTD = 0b00000001; хотел сразу начать критиковать автора. Но нет, дальше он рассказывает о правильном использовании портов.Из того, что я бегло проглядел по тексту, неплохой курс. Главное на видео не отвлекаться, без него проще. Также рекомендую ознакомиться с курсом DiHalt'а, скажем, на изиэлектрониксе, да и на просторах интернета его можно найти. . Относительно портов и тому подобного: электроника не идеальна, после любого действия надо какое-то время переждать переходные процессы, чтобы потом считать не непонятный мусор, а хорошее стабильное состояние.
0
|
1 / 1 / 0
Регистрация: 28.03.2015
Сообщений: 94
|
|
15.01.2020, 18:45 | 25 |
Несомненно у автора есть способности к изложению, написано живо. Но...вот этот абзац прокомментируйте, пожалуйста. Пояснение корректное, или в нем есть опечатки? Я пытался въедливо читать, но картина в голове не сложилась. Я не прошу объяснять выражение, только оценка абзаца на корректность поданного материала.
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
|
|
16.01.2020, 09:07 | 26 |
x += y == x = x+y x *= y == x = x*y x |= y == x = x | y x &=y == x = x & y и т.д. Похоже, автор немного увлекся объяснением, в результате напутал правую и левую части. С другой стороны, подобные операторы можно было и не объяснять в рамках курса контроллеров, поскольку они специфичный для языка Си в целом и рассматриваются в соответствующих учебниках. Эта запись вполне корректна, но лучше оформить как PORTD |= (1<<0); . Так оно и выглядит проще, и нет путаницы PORTD vs PORTD0. Еще можно записать как PORTD |= _BV(0); , но мне такая запись не нравится.
0
|
27 / 22 / 5
Регистрация: 31.01.2019
Сообщений: 98
|
|
21.01.2020, 23:56 | 27 |
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
|
|
22.01.2020, 11:22 | 28 |
Ничего подобного. Моя запись выглядит как установка бита. Ваша - как сложение с магическим числом.
0
|
27 / 22 / 5
Регистрация: 31.01.2019
Сообщений: 98
|
|
22.01.2020, 11:32 | 29 |
COKPOWEHEU, Вы серьёзно?
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
|
|
22.01.2020, 12:42 | 30 |
joogorden, что поделать, не для всех очевидно, что при работе с отдельными битами лучше указывать именно отдельные биты, а не битовые маски.
Ну и учитывайте, что я комментировал пособие для начинающих. Им еще не рассказали, что вместо записи бита по номеру можно использовать именованные константы или целые макрофункции. Запись вроде TIMSK |= (1<<TOIE1), конечно, еще лучше. Но ведь и для ее использования надо понимать, что TOIE1 это всего лишь чиселко, только поименованное.
0
|
27 / 22 / 5
Регистрация: 31.01.2019
Сообщений: 98
|
||||||
22.01.2020, 17:13 | 31 | |||||
Для наглядности:
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
|
||||||
22.01.2020, 18:14 | 32 | |||||
Да, такой примитивный вариант в той статье разбирался. И, наверное, там расписано почему он не наглядный.
Для примера, какой код вы прочтете быстрее (прокомментируйте какие биты будут выставлены в каждом случае):
0
|
27 / 22 / 5
Регистрация: 31.01.2019
Сообщений: 98
|
|
22.01.2020, 18:58 | 33 |
Естественно второй вариант =)
А ещё мне больше нравится такой вариант PORTB |= 0x80; А в чём веселье то, если такие вещи как выводы описываются в начале листинга в дефайнах?
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
|
|
22.01.2020, 20:09 | 34 |
Вы не ответили какие биты там выставляются.
Впрочем, уже то, что вы не обратили на это внимания, намекает, что ошибку во второй записи вы не заметили.
0
|
27 / 22 / 5
Регистрация: 31.01.2019
Сообщений: 98
|
|
22.01.2020, 20:29 | 35 |
Забавно, не знал что мне тут тест устроили. Что то не заметил вопроса про где какие биты.
А вы как биты считаете? Нулевой бит у вас нулевой или первый? =) Да ошибку не заметил, пока вы не написали. Но это не серьезная ошибка если биты считать с права и старшие не нужны. Компилятор скушает молча, а по второму варианту будет 0x10.
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
|
|
23.01.2020, 11:02 | 36 |
Счет битов обычно начинается с нуля справа налево. Вспомните хотя бы порты PORTA0, PORTC4 и т.д.
В том-то и проблема что компилятор скушает и даже предупреждения не выдаст. То есть пропустит потенциальную ошибку, когда человек хотел выставить 5-й бит, а выставлен будет 4-й. И сиди считай нолики. В записи же со сдвигами такой проблемы нет. А ведь битовые маски бывают и больше чем 8-битные. Сейчас-то, когда я рассказал про ошибку, уже неинтересно. . Ладно, предлагаю закончить спор о вкусе фломастеров
0
|
27 / 22 / 5
Регистрация: 31.01.2019
Сообщений: 98
|
|
23.01.2020, 13:41 | 37 |
Это всем понятно. Вопрос возникнет у вас же если я вам отвечу на ваш же вопрос
Так как в байте всего 8 бит логично нулевой бит посчитать первым, а седьмой восьмым. Ноль то это же ничего.
И если я вам отвечу пятый, вы скажете что я болван. Поэтому и написал 0x10 что бы не было таких вопросов. Я с вами не спорю, а пишу что у других людей есть другие мнения отличные от ваших "истинных".
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
|
|
23.01.2020, 14:52 | 38 |
Логично нулевой бит посчитать нулевым, а не первым. Мы же начали с управления портами в AVR. Да и абстрактные биты считаются так же.
А незначащие старшие нули вообще бессмысленно считать, их там бесконечно много. Вы пытаетесь подменить понятия. Запись сдвигами обладает объективными преимуществами перед магическими числами, это не субъективное мнение. Точно так же вынесение макросов обладает объективными преимуществами перед копипастом.
0
|
27 / 22 / 5
Регистрация: 31.01.2019
Сообщений: 98
|
|
23.01.2020, 16:44 | 39 |
Это у него только наименование может быть например "D0" а по счету то он первый.
То есть вы утверждаете что во втором вашем примере нет ошибки как вы ранее утверждали? Я бы еще понял ваше утверждение, но в 26 посте что вы написали: PORTD |= (1<<(PORTD0)); Эта запись вполне корректна, но лучше оформить как PORTD |= (1<<0);. Вы имеете ввиду свой сдвиг единицы ноль раз?
0
|
2 / 2 / 0
Регистрация: 12.12.2019
Сообщений: 26
|
|
23.01.2020, 17:05 | 40 |
COKPOWEHEU, Вы грамотный человек. Но я не приветствую Ваше отношение к вопрошающим! Что за экспресс тесты? Ну и Вы же не "супермен" .)
Вы очень много пишете, очень много из написанного Вами очень интересно, но это не начальный уровень. Научитесь отвечать на вопрос прямо.) и не разводить холивар на 16 страниц форума из ничего!! (ничего личного, просто я проникся Вашим "общением")
0
|
23.01.2020, 17:05 | |
23.01.2020, 17:05 | |
Помогаю со студенческими работами здесь
40
MSI Z77A-G45 подключение через 4-Pin + 4-Pin Подключение питания 8 pin + 6 pin для GTX 760 Комп стартует от питания 4 pin, но при подключении 8 pin Можно ли сунуть в rx 570 4gb только 6 pin, а не 8 pin? Можно ли прицепить питание на процессор 4x pin когда на БП 8x pin Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |