|
За сколько времени реально осуществляется переключение направления порта?, в мегах, тинях? |
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 34)
|
Mar 2 2006, 18:01
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Не совсем всё так просто. Порт действительно переключается на следующий такт. Это действительно можно увидеть в AVR Studio. А теперь тонкости: Как правило когда задают такой вопрос, то подразумевается что планируют операции ввода-вывода. Так вот операция ввода выполняется медленнее операции вывода. В связи с этим возникают иногда проблемы! Приведу пример рабочей программы, где это будет видно наглядно.
readusb: sbic pinb,RXF ; по готовности - продолжить rjmp PC-1 ; иначе повторить cbi portb,RD ; читать ; in wl,pind ; USB (особенности AVR ядра) sbi portb,RD ; завершить in wl,pind ; USB cpi wl, label ; метка? breq read1 ; если да, то ввести команду readex: clt ; иначе, - сбросить
Если не учитывать особенности ядра, то необходимо вводить там где стоит коментарий!
|
|
|
|
|
Mar 3 2006, 03:31
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(SasaVitebsk @ Mar 2 2006, 20:01)  ... Код cbi portb,RD; читать ; in wl,pind ; USB (особенности AVR ядра) sbi portb,RD; завершить Если не учитывать особенности ядра, то необходимо вводить там где стоит коментарий! Это не особенности ядра, а особенности алгоритма и частоты тактирования. Просто с более высойкой частотой тактирования вы промигиваете RD сильно быстро для USB, а командой in автор этого кода делал задержку на 2 такта. AVR и ядро AVR здесь абсолютно не при чем, вместо IN можно было спокойно применить две слудующих подряд команды NOP.
|
|
|
|
|
Mar 3 2006, 09:00
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 17-06-04
Пользователь №: 36

|
Я раз сталкнулся с этой проблемой на Mege8. Пришлось вводить задержку, причем 1-3 мкс было мало (при кварце 7.3728). Поставил 5 мкс - все четко заработало.
|
|
|
|
|
Mar 3 2006, 19:41
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(defunct @ Mar 3 2006, 07:31)  Цитата(SasaVitebsk @ Mar 2 2006, 20:01)  ... Код cbi portb,RD; читать ; in wl,pind; USB (особенности AVR ядра) sbi portb,RD; завершить Если не учитывать особенности ядра, то необходимо вводить там где стоит коментарий! Это не особенности ядра, а особенности алгоритма и частоты тактирования. Просто с более высойкой частотой тактирования вы промигиваете RD сильно быстро для USB, а командой in автор этого кода делал задержку на 2 такта. AVR и ядро AVR здесь абсолютно не при чем, вместо IN можно было спокойно применить две слудующих подряд команды NOP. Господа простите за резкость, но я не такой баран чтобы не подпирать ноги, не учитывать быстродействие подключённых устройств и т.п. Я схемотехник. И когда я привожу пример, я отвечаю за то что дополнительных схемотехнических особенностей нет! Теперь непосредственно к defunct. Посмотрите внимательно на текст проги. Я не делаю никакую задержку там где стоит коментарий. Коментарий это коментарий!!!! А если я туда добавлю два нопа как Вы предлагаете то как раз работать и не будет!!! Я их как раз убирал. Т.е будет правильным такой код cbi nop nop in sbi а код который я привёл работает не благодаря а вопреки! Потому как на момент чтения порт ещё не возвращается в "1" !!! cbi sbi in Это чётко описано в PDF на микросхему. Покрайней мере в PDFах на at90xxxxx Код я взял с реальной проги работы с ftdi245. Применял такое несколько раз. Первый раз когда столкнулся, то бился и отлаживал, выяснял причину. Потом нашёл где-то в PDFе. Пока.
|
|
|
|
|
Mar 3 2006, 21:26
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(SasaVitebsk @ Mar 3 2006, 21:41)  Это чётко описано в PDF на микросхему. Покрайней мере в PDFах на at90xxxxx Код я взял с реальной проги работы с ftdi245. Применял такое несколько раз. Первый раз когда столкнулся, то бился и отлаживал, выяснял причину. Потом нашёл где-то в PDFе. Резко высказываться вам приходится лишь потому, что в прошлый раз Вы выразились очень туманно, это касается коментария (на русском, напротив закоментированной команды in) в коде и последней строчки. Цитата cbi portb,RD; читать ; in wl,pind; USB (особенности AVR ядра) sbi portb,RD; завершить
Если не учитывать особенности ядра, то необходимо вводить там где стоит коментарий! подчеркнутое в цитате - неверно, т.к. никакой особенности ядра нет! см. даташит стр 50... Цитата Теперь непосредственно к defunct. Посмотрите внимательно на текст проги. Я не делаю никакую задержку там где стоит коментарий. Коментарий это коментарий!!!! Это все понятно. Цитата А если я туда добавлю два нопа как Вы предлагаете то как раз работать и не будет!!! Я их как раз убирал. Т.е будет правильным такой код Это тоже теперь понятно, расставляйте коментарии так, чтобы было сразу все понятно не только Вам, но также и всем кто читает Ваши сообщения. Цитата Я схемотехник. В таком случае вы должны сразу изъясняться технически верно, желательно со ссылками на техн. документацию, а не пользоваться голословными утверждениями типа: Цитата Так вот операция ввода выполняется медленнее операции вывода. PS: вообще все что Вы теперь сказали - понятно, однако не просить же у Вас прощение за то, что в прошлый раз вы высказались не достаточно ясно? PPS: простите уж и меня за резкость, очевидно я тоже в своем предыдущем высказывании допустил непростительную вольность..
|
|
|
|
|
Mar 5 2006, 12:43
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(defunct @ Mar 4 2006, 01:26)  В таком случае вы должны сразу изъясняться технически верно, желательно со ссылками на техн. документацию, а не пользоваться голословными утверждениями типа: Когда выясняешь какой-то вопрос, то результат запоминается а процесс -- не очень.  С Вами бывало? С данным вопросом я разбирался очень давно.  Сейчас попытаюсь вспомнить заново. Если понадобятся ссылки на документацию, то я их найду, но пока попробуйте поверить на слово. Лишнего времени у меня как и у других нет. Теперь по сути. На самом деле AVR (вопреки мнению начинающих) выполняет команду не за 1 такт, а за 4. Но каждая последующая команда начинает выполнятся со смещением в один такт. Т.о. якобы время исполнения команды составляет один такт. 1.2.3.4 команда1 __1.2.3.4 команда2 ____1.2.3.4 команда3 Для исполнения арифметических команд данный факт не имеет значения, но для команд ввода-вывода это не так. Давайте попробуем подумать вместе. Что делает ядро при команде "out porta,r19"? СНАЧАЛА извлекает значение из регистра и ПОТОМ выводит его в порт. (В каком такте это происходит я не знаю) А что делае команда "IN"? СНАЧАЛА вводит из порта, ПОТОМ заносит в регистр. Надеюсь то что я сейчас пишу очевидно. Предположем что ввод осуществляется во втором такте, а вывод в четвёртом. В результате получим следующую картину. 1. 2.3.X OUT где X - операция вывода __1.X.3.4 IN где X - операция ввода. Очерёдность здесь видна глазом. Всё это учтено в AVR Studio по моему. Проверять сейчас некогда. Попробуйте сами. Всё равно лучше запоминаются те факты которые установлены самими. Внимание! Всё сказанное мной отнюдь не отменяет, а лишь дополняет сказанное другими выше. Действительно необходимо учитывать: 1) Время ответа внешнего устройства (если имеется) 2) Быстродействие Вашего микроконтроллера 3) Имеющуюся емкостную нагрузку (и как следствие подпорку ножки) 4) Схему включения (может Вы используете одну и туже ножку) 5) Ну и особенность ядра, описанную выше. Кстати аналогичные проблемы возникают и у др. МП. Кстати коментарий я ставил (и обычно ставлю  ) для себя, а не для других. Чтобы легче было вспомнить. Я не занимаюсь обучением других. Отсюда и проблемы с пониманием.
Сообщение отредактировал SasaVitebsk - Mar 5 2006, 12:49
|
|
|
|
|
Mar 5 2006, 13:29
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Саш все так, да не то. Открываем даташит на М16 -Instruction Execution Timing стр.11 Figure 7. Видим - инструкция выполняеться за такт.Чуть выше описана работа 4-тактного конвейера, но там четко видно разделение fetch - execution. Необходимость дополнительной задержки обусловлена именно временем установления сигнала - напомню у мег логические уровни КМОП т.е. порог срабатывания достаточно высокий, входное сопротивление, емкость - тоже. Кроме этого стоит разделить старые девайсы с асинхронным входом и новые с синхронным, которые действительно дают задержку на такт.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Mar 5 2006, 13:49
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(beer_warrior @ Mar 5 2006, 20:29)  Саш все так, да не то. Открываем даташит на М16 -Instruction Execution Timing стр.11 Figure 7. Видим - инструкция выполняеться за такт.Чуть выше описана работа 4-тактного конвейера, но там четко видно разделение fetch - execution. Наверное, не много ошиблись (или у меня даташит другой?): Figure 6. The Parallel Instruction Fetches and Instruction Executions;
Figure 7. Single Cycle ALU Operation...
Конвейер то получается не 4-х, а 2-х тактный, или я не прав? В первом такте выборка из ФЛЭШ(памяти программ), во втором - выполнение инструкции , выбранной в прошлом такте, и выборка следующей инструкции и т.д
--------------------
|
|
|
|
|
Mar 5 2006, 14:15
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата Наверное, не много ошиблись (или у меня даташит другой?):
Figure 6. The Parallel Instruction Fetches and Instruction Executions;
Figure 7. Single Cycle ALU Operation... Я имел в виду именно Figure 7. Single Cycle ALU Operation Цитата Конвейер то получается не 4-х, а 2-х тактный, или я не прав? В первом такте выборка из ФЛЭШ(памяти программ), во втором - выполнение инструкции , выбранной в прошлом такте, и выборка следующей инструкции и т.д Да тут я притормозил, 2 такта конечно. Поэтому и инструкции ветвления 1-2 тактные, в зависимости от выполнения условия.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Mar 5 2006, 17:04
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
AVR это RISC, вся прелесть в том и состоит, что команды простые но очень быстрые.Хитроумных трюков с микрокодом в нем нет, как пишется, так и работает. Если действительно лезть в глубины можно найти свободное ядро на VHDL и посмотреть как все делаеться. Задержку надо ставить когда сигнал сомнительный - нечеткий фронт, большая емкость итп. - клавиатуры, микрики всякого рода делители напряжения. Если сигнал - четкий логический уровень, все хватается с пол-пинка, без всяких задержек.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Mar 5 2006, 17:31
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(beer_warrior @ Mar 6 2006, 00:04)  Задержку надо ставить когда сигнал сомнительный - нечеткий фронт, большая емкость итп. - клавиатуры, микрики всякого рода делители напряжения. Если сигнал - четкий логический уровень, все хватается с пол-пинка, без всяких задержек. Мне кажется не совсем так. В приведенной схеме МК сначала загоняет в регистр скан-код, по линии sdata/key_port, а потом по этой же линии считывает состояние клавиатуры. В схеме все лишнее убрано для наглядности. Ниже при веденный код не считывает состояние клавы, если убрать NOP() (макрос asm("nop")). Хотя все уровни жесткие - лог.0 и лог.1 Код
#define KEY_PORT PB5
...
// читаем состояние порта клавиатуры PORTB |= (1 << KEY_PORT); // обнуляем порт DDRB &= ~(1 << KEY_PORT); // меняем направление порта на ввод NOP();// ждем установления состояния порта // если бит порта клавиатуры установлен, обрабатываем нажатие кнопки if(PINB & (1 << KEY_PORT)) {
.....
} // меняем направление порта на вывод DDRB |= (1 << KEY_PORT);
--------------------
|
|
|
|
|
Mar 5 2006, 17:56
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
И что мы видим - к key_port подключены RC-цепочка кнопки и резисторы.То о чем я говорил. Я в свое время имел немало сексу ISM-трансиверами, ридерами магнитных карточек, клавиатур итп. Везде ловил уровень одним тактом. В принципе считаю экспериментально доказанным,что это работает. На самом деле спор этот смысла не имеет - надо писать без нопов имея в виду, что в случае проблем надо будет вставлять задержку и далеко не всегда один такт, это сильно зависит от конкретной схемы и скорости контроллера.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Mar 5 2006, 18:57
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(beer_warrior @ Mar 6 2006, 00:56)  И что мы видим - к key_port подключены RC-цепочка кнопки и резисторы. RC-цепочки нет, только резисторы. Возможно, за конденсатор Вы приняли две земли - от батарей и от резистора. Резистор к земле нужен для подтягивания уровня на key_port к земле, так как кнопки сканируются единицами, (к регистру подключены катоды 7SegLEDов через ключи). Я пробовал ставить вместо ключей TTL-буферы, а так же использовал в качестве key_port отдельную линию МК, но перед считыванием состояния кнопок (ради эксперимента) переключал на ввод, а после считывания опять на вывод - результат не изменился. Считывание порта происходило только через такт после выполнения команды SBI DDRB, key_port... Кстати, посмотрите даташит на всеми нами любимый ATmega32. Страница 50. Figure 25. Synchronization when Reading a Software Assigned Pin Value. И то что там написано немного выше, и приведенный код немного ниже. Там все написанно черным по белому.Все вышесказанное, естественно, только в том случае, если на входе нет емкостной нагрузки, и то, ну о-очень большой.
Извиняюсь, что повторил то что было уже сказанно в сообщениях выше
Сообщение отредактировал prottoss - Mar 5 2006, 19:06
--------------------
|
|
|
|
|
Mar 5 2006, 19:35
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
В довершении ко всему вышесказанному хочу привести вот такой простой код, с которым можно быстро поэксперементировать на любой макетке с минимумом деталей. Главное, чтобы был МК с двумя портами, светодиод и токоограничивающий резистор для него. К примеру возьмем мегу16. И так, садим светодиод через резистор анодом к любому пину порта В, катодом к земле. Зашиваем вот такой код: Код clr r18;
ldi r16, 0xff ldi r17, 0x00; out portb, r17; обнуляем состояние линий порта В out ddrb, r16; порт В на вывод out porta, r16; подключаем пулл-ап резисторы out ddra, r16; порт А - на вывод nop; задержка для установления состояния порта in r18, pina; читаем состояние на выводах порта (должен быть 1 во всех разрядах) out portb, r18; зажигаем светодиод а затем вот такой: Код clr r18;
ldi r16, 0xff ldi r17, 0x00; out portb, r17; обнуляем состояние линий порта В out ddrb, r16; порт В на вывод out porta, r16; подключаем пулл-ап резисторы out ddra, r16; порт А - на вывод ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;nop; задержка для установления состояния порта in r18, pina; читаем состояние на выводах порта (должен быть 1 во всех разрядах) out portb, r18; зажигаем светодиод угадайте, где светодиод загорится, а где нет :-)
Сообщение отредактировал prottoss - Mar 5 2006, 19:36
--------------------
|
|
|
|
|
Mar 5 2006, 20:45
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(beer_warrior @ Mar 5 2006, 21:04)  AVR это RISC, вся прелесть в том и состоит, что команды простые но очень быстрые.Хитроумных трюков с микрокодом в нем нет, как пишется, так и работает. Если действительно лезть в глубины можно найти свободное ядро на VHDL и посмотреть как все делаеться. Задержку надо ставить когда сигнал сомнительный - нечеткий фронт, большая емкость итп. - клавиатуры, микрики всякого рода делители напряжения. Если сигнал - четкий логический уровень, все хватается с пол-пинка, без всяких задержек. Как говорят классики: "человек видимо не понимает"! Я извинялся лишь за колличество тактов. 2-4. В любом случае не один. Всё остальное что я написал соответствует действительности. Так какая разница какое кол. тактов на самом деле? Там же я написал что всё это можно проверить в AVR Studio. Так о чём мы спорим? Набираем следующую программу. .include "m88def.inc" ldi r18,$ff out ddrb,r18 ldi r18,0 out portb,r18 ldi r18,$ff out portb,r18 in r18,pinb in r18,pinb nop nop Компилируем и выполняем её по шагам. и видим что первый in нам возвращает 0 в регистр r18, а второй $ff. Порядок вывода любой зрячий может увидеть если раскроет порт B в отладчике. Он увидит что после выполнения команды out значение $ff появится ТОЛЬКО в portB, а на PINB значение появляется на следующий такт!!! И где здесь конденсаторы????? Ещё раз утверждаю. Данное ЧЁТКО прописано в PDF!
|
|
|
|
|
Mar 5 2006, 23:22
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(SasaVitebsk @ Mar 5 2006, 22:45)  Я извинялся лишь за колличество тактов. 2-4. В любом случае не один. Всё остальное что я написал соответствует действительности. Так какая разница какое кол. тактов на самом деле? большая разница, т.к. PINX считывается не за 2 и не за 4, а за 1 такт. Цитата Порядок вывода любой зрячий может увидеть если раскроет порт B в отладчике. Он увидит что после выполнения команды out значение $ff появится ТОЛЬКО в portB, а на PINB значение появляется на следующий такт!!! 1 такт на то чтобы значение попало в защелку PINX, а далее можно читать, за 1 такт. Цитата Ещё раз утверждаю. Данное ЧЁТКО прописано в PDF! Прописано, только смотря как преподнести. Вы преподносите все это так, что задержка присутствует из-за медленного выполнения инструкции считывания. А на самом деле инструкции ввода и вывода данных порта выполняются одинаково за 1 такт. PINX - обычный синхронный регистр, который защелкивается каждым положительным фронтом SYSTEM clk - который соответствует началу выполнения команды.
|
|
|
|
|
Mar 7 2006, 00:33
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(defunct @ Mar 6 2006, 03:22)  Прописано, только смотря как преподнести. Вы преподносите все это так, что задержка присутствует из-за медленного выполнения инструкции считывания. А на самом деле инструкции ввода и вывода данных порта выполняются одинаково за 1 такт. PINX - обычный синхронный регистр, который защелкивается каждым положительным фронтом SYSTEM clk - который соответствует началу выполнения команды. Уважаемый 'defunct'. Я ни в малейшей степени не планирую завязывать перебранку.  Я думаю Вы правы. Я очень давно разбирался c этими вещами. Лет 7 назад. Возможно наложились др. МП. Но, - просто посмотрите начало темы. И вопрос. И мой первый ответ. И последний ответ с примером. Я ничего не "преподношу". Я изначально сообщил что имеется "особенность". И эта особенность не связана ни с какими конденсаторами на ножках. А связана только с организацией ввода-вывода AVR. Я ошибся в причине возникновении задержки, но сам факт остаётся фактом. Между выводом и вводом необходим такт задержки. И это надо учитывать при написании быстрых участков программы, где важно максимальное быстродействие. В ряде случаев незнание этих особенностей приводит к ошибкам. Итак прошу прощение у тех кого я ввёл в заблуждение по академическим знаниям.  Обращаю внимание тех, кого интересует практический подход.
|
|
|
|
|
Mar 7 2006, 01:15
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(SasaVitebsk @ Mar 7 2006, 02:33)  /offtop Уф.. Аж неловко как-то.. Сорри, совсем не хотел доводить дело до откровений.. Максимум что я заслужил с Вашей строны - фраза "Ок"  Цитата Но, - просто посмотрите начало темы. И вопрос. И мой первый ответ. И последний ответ с примером. Да, с практической стороны у Вас все Ок.
Сообщение отредактировал defunct - Mar 7 2006, 01:23
|
|
|
|
|
Mar 7 2006, 07:02
|

Мастер-фломастер
   
Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700

|
пока вы тут спорили - пришлось от АСКа отказаться ибо на смену направления ушло около 18 тактов здесь конечно свои заморочки во первых пара каменей 90s2313+tiny2313 а задача была связь двух этих монстров с сверх минимальным сжиранием ресурсов (т.к практически все аппаратн прелести уже подвязаны - пришлось изголяться с таймером и передавать за прерывание всего один бит ;-) аск (или как следствие смена направления у 90s уже не выдержало) ж--- а вообще господа, всем спасибо приятно, когда люди обсуждают проблему на уровне алу, и глядя, таким образом, в корень пытаясь выяснить истину ещё раз всем спасибо!!!!
Сообщение отредактировал Kovrov - Mar 7 2006, 07:04
--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|