-
- Запретите прерывания, посмотрите не лезет ли у вас на выход сигнал из других блоков МК и приучите себя читать выведенное значение через регистр PORTB. Boвa(767 знак., 15.03.2019 10:47 - 11:20)
- 2) При выводе данных ваши данные могут не успеть добраться до вывода и вы читаете прошлое значение с порта - Что то новенькое , это каким транспортом данные добираются что могут не успеть? - m16_home(15.03.2019 11:26)
- Речь про конвейер процессора. - fk0(15.03.2019 12:54)
- В даташите есть диаграмма таймингов работы пинов, там действительно или 1 или 2 cpu-clk происходит процесс коммутации пинов. - Тигр(15.03.2019 12:07)
- Унутренним, #@$, конвейером! Уже перетирали про эту мелкую пакость в ряде новых AVR и TINY. В том числе MBedder писал. Т.е. командами ASM подряд выводим "1" и "0" и получаем полное отсутствие импульсов на порту. De_User(130 знак., 15.03.2019 11:31 - 11:35)
- Эта фигня была замечена только на тыньках , со свежими мегами было всё ОК на тот момент. Вот дискуссия на телесиськах --> - m16_home(15.03.2019 15:18, ссылка, ссылка)
- В описании команд для вывода регистра в PORT требуется 1 такт. ЕМНИП, "ногодрыганьем" на "новой" ATmega88 удалось гарантировано переключать только с интервалом в 3 (три) такта. De_User(750 знак., 15.03.2019 15:32 - 15:51, ссылка)
- Это давно известный эффект R-M-W (Read-Modify-Write), проявляющийся при записи в ОТДЕЛЬНЫЙ(Е) БИТ(Ы), но не в весь порт. Аналогичное происходит и в PIC'ах - недаром в новых устроили отдельные регистры PORTx (вх) и LATx (вых) - MBedder(15.03.2019 15:42)
- правильно, эту фишку я знаю в AT90Sxxxx такой хни не было , но тут спич о записать-прочесть. - m16_home(15.03.2019 11:54)
- Задержка вывода была еще в древних AVR поэтому NOPы нужны и там, но новый внутренний конвейер еще и "интеллектуален" он дополнительно "срезает углы" выбрасывая последовательные установку/сброс битов. - Boвa(15.03.2019 11:42 - 11:45)
- Эта фигня была замечена только на тыньках , со свежими мегами было всё ОК на тот момент. Вот дискуссия на телесиськах --> - m16_home(15.03.2019 15:18, ссылка, ссылка)
- По п.2 в некоторых AVR даже два NOP нужны, иначе "данные могут не успеть добраться до вывода и читается прошлое значение порта" - De_User(15.03.2019 11:02)
- Если линия нагружена на относительно большую емкость, то данные доберутся только к третьему (а то и к десятому) NOP, а если закорочена на землю то возможно и никогда не доберутся. - Boвa(15.03.2019 11:06 - 11:09)
- Согласен! ЕМНИП эффект был замечен при тактовой частоте 20 МГц, так что ёмкость запросто может влиять. - De_User(15.03.2019 11:08)
- Если линия нагружена на относительно большую емкость, то данные доберутся только к третьему (а то и к десятому) NOP, а если закорочена на землю то возможно и никогда не доберутся. - Boвa(15.03.2019 11:06 - 11:09)
- 2) При выводе данных ваши данные могут не успеть добраться до вывода и вы читаете прошлое значение с порта - Что то новенькое , это каким транспортом данные добираются что могут не успеть? - m16_home(15.03.2019 11:26)
- Нет, не нормально. Адрес второго операнда проверить нужно. De_User(404 знак., 15.03.2019 05:20 - 10:56)
- Спасибо, буду разбираться в отладчике. - Тигр(15.03.2019 05:41)
- Для обычных AVR и xMega есть отличия в портах и командах. Ваш какой? - De_User(15.03.2019 10:06)
- Спасибо, буду разбираться в отладчике. - Тигр(15.03.2019 05:41)
- У вас тут всё верно написано, видимо, всё же где-то в программе ошибка и реальное действие программы не соответствует тому что вы написали. Считывание PINB никак не может приводить к изменению состояния пинов. Только DDRB или PORTB. - Ralex(15.03.2019 10:37)
- +1 - m16_home(15.03.2019 10:40)
- А если он PINB не читал, а записал в него? - Ксения(15.03.2019 10:40)
- Тогда нога инвертируется :) Но это не у всех аврках - Звероящер(15.03.2019 12:09)
- В некоторых имеется такая фишка с помощью SBI CBI изменить PORTB - Ilyaul(15.03.2019 11:48)
- как? m16_home(15.03.2019 10:43)
- a вот так: - Ксения(15.03.2019 11:52, картинка)
- это опечатка, в этом же шите выше чёрным по белому m16_home(15.03.2019 12:04)
- А это тоже опечатка: ? - Ксения(15.03.2019 13:36, картинка)
- нет, это другой камень . выше вы привели скрин из шита меги640...2560 а этот скрин меги328, не так ли? - m16_home(15.03.2019 14:52)
- В том случае, когда вопрошающий умалчивает об информации, существенно влияющей на ответ, то отвечающий имеет право заполнить это умолчание по своему вкусу. Т.е., поскольку топикстартер не указал свой МК, то я была вправе интерпретировать его Ксения(373 знак., 15.03.2019 19:33)
- Ксюша, Вы как всегда прелестны (без иронии, от души) - m16_home(16.03.2019 00:43)
- В том случае, когда вопрошающий умалчивает об информации, существенно влияющей на ответ, то отвечающий имеет право заполнить это умолчание по своему вкусу. Т.е., поскольку топикстартер не указал свой МК, то я была вправе интерпретировать его Ксения(373 знак., 15.03.2019 19:33)
- нет, это другой камень . выше вы привели скрин из шита меги640...2560 а этот скрин меги328, не так ли? - m16_home(15.03.2019 14:52)
- А это тоже опечатка: ? - Ксения(15.03.2019 13:36, картинка)
- это опечатка, в этом же шите выше чёрным по белому m16_home(15.03.2019 12:04)
- Ну написано ещё не значит что нельзя записать. Но это уже архитектурно-зависимая вещь, Ralex(255 знак., 15.03.2019 10:52)
- Ну написано ещё не значит что нельзя записать. а зачем писать в регистр read only? - m16_home(15.03.2019 11:14)
- Случайно. Перепутав порядок операндов в асме, например. - Ralex(15.03.2019 12:01)
- Ну написано ещё не значит что нельзя записать. а зачем писать в регистр read only? - m16_home(15.03.2019 11:14)
- a вот так: - Ксения(15.03.2019 11:52, картинка)
- Ошибка типичная - человек перепутал регистры PORTB и PINB. Правило такое: управляют уровнями, присваивая новое значение PORTB. А когда порт опрашивают, читают PINB. Тогда как топистертер, скорее всего, сделал наоборот - присвоил PINB новое Ксения(138 знак., 15.03.2019 10:20)
- Я пишу так: in R1,portb или in R1,portb-PIN Ещё out portb-DDR,r1 У них у всех pin-ddr-port лежат в последовательных адресах. По-моему так нагляднее. - maik-vs(15.03.2019 14:52)
- В примере на Asm выводы порта читаются в регистр (in r16,PINB). Последующей, второй командой из регистра можно отправлять куда угодно. - De_User(15.03.2019 10:59, ссылка)
- как порту PINB можно что либо присвоить если он доступен только для чтения? - m16_home(15.03.2019 10:39)
- в последних AVR запись 1 в PINX приводит к инверсии того самого вывода - Andrey190(15.03.2019 10:51)
- Ух ты ! А можно подробнее ? - Тигр(15.03.2019 12:12)
- В даташите есть картинка со схемой порта, с триггерами, мультиплексорами и т.д. И там видно. - maik-vs(15.03.2019 14:46)
- например для mega328p 13.2.2 Toggling the Pin Andrey190(173 знак., 15.03.2019 12:33)
- даже если PORTx настроен на ввод? - m16_home(15.03.2019 11:11)
- Немного не так. По идее, инвертируется значение в соответствующем бите регистра PORTх, направление передачи меняться не должно. - Boвa(15.03.2019 13:25)
- Даже если на вход. - Звероящер(15.03.2019 12:41)
- кстати да. раньше не обращал внимание на это. соответственно подтяжка будет выключаться или включаться. при выключенной подтяжке может ловиться 0 - Andrey190(15.03.2019 12:37)
- Разные чудеса случаются, если писать куда попало. PINB указан как только для чтения, последствия записи в него не описаны. - De_User(15.03.2019 11:12)
- и я о том же - m16_home(15.03.2019 11:15)
- Ух ты ! А можно подробнее ? - Тигр(15.03.2019 12:12)
- в последних AVR запись 1 в PINX приводит к инверсии того самого вывода - Andrey190(15.03.2019 10:51)
- Запретите прерывания, посмотрите не лезет ли у вас на выход сигнал из других блоков МК и приучите себя читать выведенное значение через регистр PORTB. Boвa(767 знак., 15.03.2019 10:47 - 11:20)