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