реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> За сколько времени реально осуществляется переключение направления порта?, в мегах, тинях?
SasaVitebsk
сообщение Mar 3 2006, 19:41
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 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е.
Пока.
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 3 2006, 21:26
Сообщение #17


кекс
******

Группа: Свой
Сообщений: 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: простите уж и меня за резкость, очевидно я тоже в своем предыдущем высказывании допустил непростительную вольность.. smile.gif
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 5 2006, 12:43
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(defunct @ Mar 4 2006, 01:26) *
В таком случае вы должны сразу изъясняться технически верно, желательно со ссылками на техн. документацию, а не пользоваться голословными утверждениями типа:


Когда выясняешь какой-то вопрос, то результат запоминается а процесс -- не очень. smile.gif С Вами бывало?
С данным вопросом я разбирался очень давно. smile.gif Сейчас попытаюсь вспомнить заново.

Если понадобятся ссылки на документацию, то я их найду, но пока попробуйте поверить на слово. Лишнего времени у меня как и у других нет. Теперь по сути.

На самом деле 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 по моему. Проверять сейчас некогда. Попробуйте сами. smile.gif
Всё равно лучше запоминаются те факты которые установлены самими.

Внимание! Всё сказанное мной отнюдь не отменяет, а лишь дополняет сказанное другими выше.
Действительно необходимо учитывать:
1) Время ответа внешнего устройства (если имеется)
2) Быстродействие Вашего микроконтроллера
3) Имеющуюся емкостную нагрузку (и как следствие подпорку ножки)
4) Схему включения (может Вы используете одну и туже ножку)
5) Ну и особенность ядра, описанную выше.

Кстати аналогичные проблемы возникают и у др. МП.

Кстати коментарий я ставил (и обычно ставлю smile.gif ) для себя, а не для других. Чтобы легче было вспомнить. Я не занимаюсь обучением других. Отсюда и проблемы с пониманием. smile.gif

Сообщение отредактировал SasaVitebsk - Mar 5 2006, 12:49
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 5 2006, 13:14
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



SasaVitebsk
Ну, зачем же так дезинформировать общественность? sad.gif
Выполнение типичной команды AVR занимает 1 такт. В этот же такт происходит выборка следующей команды. См. даташит на мегу128, релиз 2467J, стр. 13 "Instruction Execution Timing".


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 5 2006, 13:29
Сообщение #20


Профессионал
*****

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



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


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Mar 5 2006, 13:49
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 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-х тактный, или я не прав? В первом такте выборка из ФЛЭШ(памяти программ), во втором - выполнение инструкции , выбранной в прошлом такте, и выборка следующей инструкции и т.д



--------------------
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 5 2006, 14:15
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 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 тактные, в зависимости от выполнения условия.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 5 2006, 16:00
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Ребята если я дезинформировал общественность, то извиняйте. То, что я писал я не из пальца высосал. Где-то прочитал. Я поищу источник. Хотя я не удивлюсь если в последних кристаллах что-то изменилось. Данная прога и ещё одна с аналогичным построением работала на ATMEGA163 и ATMEGA8515. С другой стороны выполнение команды за такт, - не совсем характерно. Необходимо выбрать команду инкрементировать указатель команд, выбрать значение сделать что-то со значением и т.д. Внутренних тактов должно быть более одного. Иногда применяют умножение частоты. Но не в AVR. AVR статическая. Хотя всё это уже из области раздумий. Поищу более точное описание.

Тем не менее при вводе-выводе надо также учитывать особенности связанные именно с AVR. О чём я и писал! А именно вставлять програмную задержку м/у выводом и вводом. Я не рекомендую финты ушами которые делал я. В данном случае изделие я использовал как вспомогательное и в серию оно не планировалось. А необходимо было получить максимальное быстродействие.

А детали конвеера я уточню. smile.gif
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 5 2006, 17:04
Сообщение #24


Профессионал
*****

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



AVR это RISC, вся прелесть в том и состоит, что команды простые но очень быстрые.Хитроумных трюков с микрокодом в нем нет, как пишется,
так и работает. Если действительно лезть в глубины можно найти свободное ядро на VHDL и посмотреть как все делаеться.
Задержку надо ставить когда сигнал сомнительный - нечеткий фронт, большая емкость итп. - клавиатуры, микрики всякого рода делители напряжения.
Если сигнал - четкий логический уровень, все хватается с пол-пинка, без всяких задержек.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Mar 5 2006, 17:31
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 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);


--------------------
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 5 2006, 17:56
Сообщение #26


Профессионал
*****

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



И что мы видим - к key_port подключены RC-цепочка кнопки и резисторы.То о чем я говорил.
Я в свое время имел немало сексу ISM-трансиверами, ридерами магнитных карточек, клавиатур итп. Везде ловил уровень одним тактом. В принципе считаю экспериментально доказанным,что это работает.
На самом деле спор этот смысла не имеет - надо писать без нопов имея в виду, что в случае проблем надо будет вставлять задержку и далеко не всегда один такт, это сильно зависит от конкретной схемы и скорости контроллера.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Mar 5 2006, 18:57
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 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


--------------------
Go to the top of the page
 
+Quote Post
prottoss
сообщение Mar 5 2006, 19:35
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 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


--------------------
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 5 2006, 20:45
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(beer_warrior @ Mar 5 2006, 21:04) *
AVR это RISC, вся прелесть в том и состоит, что команды простые но очень быстрые.Хитроумных трюков с микрокодом в нем нет, как пишется,
так и работает. Если действительно лезть в глубины можно найти свободное ядро на VHDL и посмотреть как все делаеться.
Задержку надо ставить когда сигнал сомнительный - нечеткий фронт, большая емкость итп. - клавиатуры, микрики всякого рода делители напряжения.
Если сигнал - четкий логический уровень, все хватается с пол-пинка, без всяких задержек.


Как говорят классики: "человек видимо не понимает"! smile.gif
Я извинялся лишь за колличество тактов. 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!
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 5 2006, 22:24
Сообщение #30


кекс
******

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



Господа об чем спор? все верно говорит beer_warrior...
Прикрепляю рисунок из даташита с небольшими пояснениями:
Происходит изменение уровня сиганала на входе порта PINX.
Для того чтобы этот сигнал зафиксировался в защелке PINX требуется минимум 0.5 такта (T pin delay min Tpd.min) и максимум 1.5 такта (T pin delay max - Tpd.max). Команда же считывания значения регистра PINX выполняется за 1 такт. Так что никаких фокусов и никаких "особенностей ядра" - в любом случае (если остутствует внешняя дополнительная задержка) максимум за 3 такта, а в идеале за 2 такта реальное значение сигнала будет прочитано.

Сообщение отредактировал defunct - Mar 5 2006, 22:33
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01515 секунд с 7
ELECTRONIX ©2004-2016