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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Интересная функция задержки, Вопрос по ассемблеру
SasaVitebsk
сообщение Aug 28 2006, 20:07
Сообщение #16


Гуру
******

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



Цитата(prottoss @ Aug 28 2006, 22:56) *
Потоки, работающие по прерываниям и так отработают свое.. О какой точности идет речь? Между tst _Stm1 и brne PC-1 может возникнуть прерывание, которое сведет всю вашу точность на нет. И, наконец, можете описать, или придумать, хотя бы одну ситуацию, где нельзя прикрутить sleep хотя бы в режиме idle?


Можно, но это сути не меняет.

Давайте просто проэкспериментируем:

Итак условия задачи:
atmega8, частота 14372800
16-ти битный таймер занят, ну например, "опросом датчиков". То есть режим CTC, прерывание 4мс.
В голове надо сформировать следующую диаграму на порт b.outx
"1" - 500мс, "0" - 300мс, "1" - 200мс, "0"

По версии НЕИЗВЕСТНОГО АВТОРА это выглядело примерно так.

1) Версия ассемблера atmel.

В прерывании
.....
dec cnt_ms
.....

В голове
.....

.equ wt_tim1 = 4 ; 4ms

....
.macro setout ; задать таймаут
ldi cnt_ms,@0/4 ; установить время таймаута
tst cnt_ms
brne PC-1
.endm

.....
sbi portb,outx
setout 500
cbi portb,outx
setout 300
sbi portb,outx
setout 200
cbi portb,outx
......

Подведём итоги:
Задействовано регистров - 1
стек - 0
длина проги в прерывании - 2байта/1такт
общая длина проги - 28 байт
число строк программы - 14
==================================================

Попробуем на С


В прерывании
.....
cnt_ms--;
.....

В голове
.....

#define wt_tim1 = 4 // 4ms


.....
PORTB |= (1<<OUTX);
cnt_ms = 500/wt_tim1;
while(cnt_ms);
PORTB &= ~ (1<<OUTX);
cnt_ms = 300/wt_tim1;
while(cnt_ms);
PORTB |= (1<<OUTX);
cnt_ms = 200/wt_tim1;
while(cnt_ms);
PORTB &= ~ (1<<OUTX);
......

Подведём итоги:
Задействовано переменных - 1
длина проги в прерывании - 2байта/1такт
общая длина проги - хх байт
число строк программы - 12

================================================

Предложите Ваш вариант. Я с удовольствием воспользуюсь красивым решением этой задачи.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 28 2006, 20:42
Сообщение #17


Гуру
******

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



Я предложу, но объясните мне, непонятливому, зачем Вы используете прерывание?


--------------------
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 28 2006, 20:49
Сообщение #18


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(prottoss @ Aug 28 2006, 23:56) *
Потоки, работающие по прерываниям и так отработают свое.. О какой точности идет речь? Между tst _Stm1 и brne PC-1 может возникнуть прерывание, которое сведет всю вашу точность на нет.

Потоки отработали свое, и например сохранили метку времени в регистре ICR, будем ждать
когда ее кто-нибудь испортит, или обработаем как можно быстрее ?
prottoss все, кто спорит здесь с Вами, имеют в виду всего лишь то, что
такой код вполне имеет право на существование, а Вы утверждаете, "никогда".
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Aug 28 2006, 21:09
Сообщение #19


Гуру
******

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



Цитата(singlskv @ Aug 28 2006, 23:49) *
Потоки отработали свое, и например сохранили метку времени в регистре ICR, будем ждать
когда ее кто-нибудь испортит, или обработаем как можно быстрее ?
prottoss все, кто спорит здесь с Вами, имеют в виду всего лишь то, что
такой код вполне имеет право на существование, а Вы утверждаете, "никогда".


Кстати есть ещё причина защиты НЕИЗВЕСТНОГО АВТОРА.
Дело в том, что настоящий конструктор - это не чистый программист.
Он должен видеть чуть дальше. Конечно красивое решение в программе всегда приятно и воспринимается как личная победа, но ...

Если кто-нибудь когда-нибудь будет разбирать исходники моей последней завершённой темы (а я ей доволен), то он увидит несколько "явных некрасивых решений".
Задача: atmega8. Приборная панель. 6 датчиков/ 6 шаговых двигателей-стрелок.

1) "Ну нафига он в одно прерывание от таймера засунул чтение АЦП и вывод на двигатели"
2) "Ну зачем он использует промежуточные ячейки - образы портов - при работе с двигателями"
3) "В форумах мне рекомендовали правила работы с АЦП: выставляем канал - ждём готовности - читаем значение. А у него всё наоборот..."
Наверняка найдутся и другие вопросы. Да у меня самого бы нашлись ... smile.gif

Отвечаю по порядку.
1) При работе с ШД включенными по 3-ёх точечной схеме по одному двигателю ток может достигать 40ма. По шести - 240. В момент переключения возможны выбросы и чтение АЦП лучше привязать к циклу переключения обмоток.
2) Расчёт состояний на обмотках предусматривает ветвления. При 6 двигателях их набирается много. Я по прерыванию сразу вывожу образы портов (расчитанные в предыдущем прерывании). А потом формирую новые. Поэтому временные диаграмы на двигателях стоят так, как будто их аппаратным способом обрабатывали. Это даёт возможность точно расчитывать тайминги при разгоне/торможении.
Ещё одна причина - 3 двигателя - 9 точек. На один порт не вешается. И одновременный вывод невозможен, а задержки вывода на разные ноги одного двигателя могут привести к сбоям.
3) На самом деле удобнее работать как раз на оборот: Читаю текущее значение по текущему каналу. Сохраняю (или обрабатываю). Изменяю номер канала и вывожу его. К началу следующего прерывания, измерение гарантировано будет завершено. А я не буду тратить время на бессмысленное ожидание.

Как видите объяснения есть (мои, и я не претендую на безошибочность суждений), но они, на самом деле, далеки от программирования.
Зато, голова - маленькая иммитация OS.... smile.gif Четыре паралельных задачи..... Обмен только ч/з данные.... Вот здесь я пытался (в силу своих слабых сил и слабых сил камня) быть программистом. smile.gif
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 28 2006, 21:12
Сообщение #20


Гуру
******

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



Цитата(singlskv @ Aug 29 2006, 04:49) *
Потоки отработали свое, и например сохранили метку времени в регистре ICR, будем ждать
когда ее кто-нибудь испортит, или обработаем как можно быстрее ?
prottoss все, кто спорит здесь с Вами, имеют в виду всего лишь то, что
такой код вполне имеет право на существование, а Вы утверждаете, "никогда".
Это где же я говорил "никогда"? Любой код, пусть даже самый абсурдный имеет право на существование...


--------------------
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Aug 28 2006, 21:18
Сообщение #21


Гуру
******

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



Цитата(prottoss @ Aug 28 2006, 23:42) *
Я предложу, но объясните мне, непонятливому, зачем Вы используете прерывание?


Я не использую прерывание. Прерывание используется для ДРУГОЙ ЦЕЛИ!!! Почитайте мой первый пост. Я писал, что так иногда делают, когда уже есть прерывание! И я в него вставляю одну команду. Одну для каждой метки!!!
Безусловно иначе - это глупо.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 28 2006, 21:21
Сообщение #22


Гуру
******

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



Цитата(SasaVitebsk @ Aug 29 2006, 04:07) *
Давайте просто проэкспериментируем:
Итак условия задачи:
atmega8, частота 14372800
16-ти битный таймер занят, ну например, "опросом датчиков". То есть режим CTC, прерывание 4мс.
В голове надо сформировать следующую диаграму на порт b.outx
"1" - 500мс, "0" - 300мс, "1" - 200мс, "0"
По версии НЕИЗВЕСТНОГО АВТОРА это выглядело примерно так.
1) Версия ассемблера atmel.
В прерывании
.....
dec cnt_ms
.....

В голове
.....

.equ wt_tim1 = 4 ; 4ms

....
.macro setout ; задать таймаут
ldi cnt_ms,@0/4 ; установить время таймаута
tst cnt_ms
brne PC-1
.endm

.....
sbi portb,outx
setout 500
cbi portb,outx
setout 300
sbi portb,outx
setout 200
cbi portb,outx
......

Подведём итоги:
Задействовано регистров - 1
стек - 0
длина проги в прерывании - 2байта/1такт
общая длина проги - 28 байт
число строк программы - 14
==================================================

Попробуем на С


В прерывании
.....
cnt_ms--;
.....

В голове
.....

#define wt_tim1 = 4 // 4ms


.....
PORTB |= (1<<OUTX);
cnt_ms = 500/wt_tim1;
while(cnt_ms);
PORTB &= ~ (1<<OUTX);
cnt_ms = 300/wt_tim1;
while(cnt_ms);
PORTB |= (1<<OUTX);
cnt_ms = 200/wt_tim1;
while(cnt_ms);
PORTB &= ~ (1<<OUTX);
......

Подведём итоги:
Задействовано переменных - 1
длина проги в прерывании - 2байта/1такт
общая длина проги - хх байт
число строк программы - 12

================================================
Предложите Ваш вариант. Я с удовольствием воспользуюсь красивым решением этой задачи.




Ну а чем плох вот такой вариант на С?

Код


#define delay1  3000// сдесь поставте свои значения задрержек
#define delay2  2000// так как эти от фонаря
#define delay3  1000//

#define OUTX 1


void main(void)
{
   PORTB |= (1 << OUTX);
  __delay_cycles(delay1);
  PORTB &= ~ (1 << OUTX);
  __delay_cycles(delay2);
  PORTB |= (1 << OUTX);
  __delay_cycles(delay3);
  PORTB &= ~ (1 << OUTX);
}




ИТОГО:

*ни одной переменной

*не надо прерываний

*работает абсолютно так же

*число строк 6

*число байт кода 46


--------------------
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 28 2006, 21:39
Сообщение #23


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(prottoss @ Aug 29 2006, 01:12) *
Цитата(singlskv @ Aug 29 2006, 04:49) *
Потоки отработали свое, и например сохранили метку времени в регистре ICR, будем ждать
когда ее кто-нибудь испортит, или обработаем как можно быстрее ?
prottoss все, кто спорит здесь с Вами, имеют в виду всего лишь то, что
такой код вполне имеет право на существование, а Вы утверждаете, "никогда".
Это где же я говорил "никогда"? Любой код, пусть даже самый абсурдный имеет право на существование...

Пример:
1. Timer1 считает время (по прерываниям)
2. INT0 и Timer0 ловят код(старт и стоп) по RF каналу. (то есть должны работать
все время)
3. Основной цикл выводит текущий результат на LCD (причем без всяких там HD4XXX).
4. Когда код от RF "поймали" наполовину, перестаем выводить на LCD и
ждем(в цикле похожем на цикл автора топика ) когда получим код полностью.
5. фиксируем время.

Это, с некоторыми упрощениями логика работы некоторого девайса.
Все это работает при 1Мгц тактовой (ну типа устройство было "батарейным" -
надо было экономить).
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 28 2006, 21:47
Сообщение #24


Гуру
******

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



Цитата(singlskv @ Aug 29 2006, 05:39) *
Пример:
1. Timer1 считает время (по прерываниям)
2. INT0 и Timer0 ловят код(старт и стоп) по RF каналу. (то есть должны работать
все время)
3. Основной цикл выводит текущий результат на LCD (причем без всяких там HD4XXX).
4. Когда код от RF "поймали" наполовину, перестаем выводить на LCD и
ждем(в цикле похожем на цикл автора топика ) когда получим код полностью.
5. фиксируем время.

Это, с некоторыми упрощениями логика работы некоторого девайса.
Все это работает при 1Мгц тактовой (ну типа устройство было "батарейным" -
надо было экономить).
А при чем здесь задержки через задний проход?


--------------------
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 28 2006, 22:03
Сообщение #25


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(prottoss @ Aug 29 2006, 01:47) *
Цитата(singlskv @ Aug 29 2006, 05:39) *
Пример:
1. Timer1 считает время (по прерываниям)
2. INT0 и Timer0 ловят код(старт и стоп) по RF каналу. (то есть должны работать
все время)
3. Основной цикл выводит текущий результат на LCD (причем без всяких там HD4XXX).
4. Когда код от RF "поймали" наполовину, перестаем выводить на LCD и
ждем(в цикле похожем на цикл автора топика ) когда получим код полностью.
5. фиксируем время.

Это, с некоторыми упрощениями логика работы некоторого девайса.
Все это работает при 1Мгц тактовой (ну типа устройство было "батарейным" -
надо было экономить).
А при чем здесь задержки через задний проход?

Можно чуть-чуть по подробнее что Вы имеете ввиду ?
Цитата
перестаем выводить на LCD и
ждем(в цикле похожем на цикл автора топика ) когда получим код полностью.

автор топика всего лишь предположил что это был таймер...

Цитата
А при чем здесь задержки через задний проход?

Или может быть просто хотите пообщаться с модераторами ? blink.gif
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 28 2006, 22:16
Сообщение #26


Гуру
******

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



Цитата(singlskv @ Aug 29 2006, 06:03) *
Можно чуть-чуть по подробнее что Вы имеете ввиду ?
Я и имею ввиду задержки на прерываниях, если так можно выразится об этих задержках
Цитата(singlskv @ Aug 29 2006, 06:03) *
Или может быть просто хотите пообщаться с модераторами ? blink.gif
OFFTOP: Что вы нервничаете так? Сначала оскорбляете обидными словами, что мол работу меняй) Теперь модераторами пугаете)

Сообщение отредактировал prottoss - Aug 28 2006, 22:17


--------------------
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 28 2006, 22:29
Сообщение #27


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(prottoss @ Aug 29 2006, 02:16) *
Цитата(singlskv @ Aug 29 2006, 06:03) *

Можно чуть-чуть по подробнее что Вы имеете ввиду ?
Я и имею ввиду задержки на прерываниях, если так можно выразится об этих задержках
Цитата(singlskv @ Aug 29 2006, 06:03) *
Или может быть просто хотите пообщаться с модераторами ? blink.gif
OFFTOP: Что вы нервничаете так? Сначала оскорбляете обидными словами, что мол работу меняй) Теперь модераторами пугаете)

Окорблять не собирался (смайликов поставил).
Просто создалось впечатление, что Вы высказались не очень ТОЧНО(это ключевое слово),
а теперь боитесь упасть "лицом в грязь", ну и от сюда все проблеммы.
А может быть просто нужно "уточнить", что Вы имели ввиду ?
ИМХО, это куда как более достойное поведение (Все мы иногда ощибаемся,
или говорим так, что другим нас не понять).
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 28 2006, 22:44
Сообщение #28


Гуру
******

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



Цитата(singlskv @ Aug 29 2006, 06:29) *
Окорблять не собирался (смайликов поставил).
Ага, обижать человека с улыбкой, по Вашему это нормально?Ладно, проехали...
Цитата(singlskv @ Aug 29 2006, 06:29) *
Просто создалось впечатление, что Вы высказались не очень ТОЧНО(это ключевое слово),а теперь боитесь упасть "лицом в грязь", ну и от сюда все проблеммы.А может быть просто нужно "уточнить", что Вы имели ввиду ? ИМХО, это куда как более достойное поведение (Все мы иногда ощибаемся, или говорим так, что другим нас не понять).
За все, мною сказанное выше в топике я отвечаю, и я не боюсь упасть в грязь лицом) Вы тут чего то наговорили непонятного, по моему даже Вам самому) Я всего лишь сказал, что
Цитата
Я бы сказал, что функция не интересная, а наоборот - тупая. Зачем использовать прерывание, если все равно выхода из функции не будет пока переменная _Stm1 не обнулится?
и от своего мнения не отказываюсь. Так же выше в топике я привел свой вариант выполнения задержек, чем он хуже? Вы еще ни одного реального довода мне не привели, зато впечатлениями обо мне делитесь. Может быть Вам пора работу сменить, психологом например заделаться, а? Огорчает, что замусорили топик перепалкою, это и меня касается(

Сообщение отредактировал prottoss - Aug 28 2006, 22:47


--------------------
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 28 2006, 23:10
Сообщение #29


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(prottoss @ Aug 29 2006, 02:44) *
Цитата(singlskv @ Aug 29 2006, 06:29) *
Окорблять не собирался (смайликов поставил).
Ага, обижать человека с улыбкой, по Вашему это нормально?Ладно, проехали...
Цитата(singlskv @ Aug 29 2006, 06:29) *
Просто создалось впечатление, что Вы высказались не очень ТОЧНО(это ключевое слово),а теперь боитесь упасть "лицом в грязь", ну и от сюда все проблеммы.А может быть просто нужно "уточнить", что Вы имели ввиду ? ИМХО, это куда как более достойное поведение (Все мы иногда ощибаемся, или говорим так, что другим нас не понять).
За все, мною сказанное выше в топике я отвечаю, и я не боюсь упасть в грязь лицом) Вы тут чего то наговорили непонятного, по моему даже Вам самому) Я всего лишь сказал, что
Цитата
Я бы сказал, что функция не интересная, а наоборот - тупая. Зачем использовать прерывание, если все равно выхода из функции не будет пока переменная _Stm1 не обнулится?
и от своего мнения не отказываюсь. Так же выше в топике я привел свой вариант выполнения задержек, чем он хуже? Вы еще ни одного реального довода мне не привели, зато впечатлениями обо мне делитесь. Может быть Вам пора работу сменить, психологом например заделаться, а? Огорчает, что замусорили топик перепалкою, это и меня касается(

Ничего ужасного про Вас я и не расказывал, мы ведь просто обсуждали некий
"абстрактный" код, а Вы почему-то решили что это камень в Ваш огород.
ок, давайте подождем мнений других участников данного топика, и постараемся
высказываться только по существу.
Go to the top of the page
 
+Quote Post
vet
сообщение Aug 29 2006, 05:51
Сообщение #30


Знающий
****

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



prottoss
Ваш вариант хуже в смысле точности, и намного.
Повторюсь, таймер считает число тактов без привязки к программе, а программный цикл - число машинных циклов, без учета прерываний.
Считаем: если каждые 100 мкс возникает прерывание длиной 20 мкс (152 такта @8МГц + 8 тактов вход/выход), то 1-сек задержка циклами ошибется на 0.25 с. В то время, как та же задержка таймером - максимум на время выполнения какого-либо текущего прерывания.

Добавим к этому то, что, пока таймер тикает, программа может заниматься разнообразными полезными делами или вообще спать. Впрочем, это уже обсуждалось.

Сообщение отредактировал vet - Aug 29 2006, 06:02


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post

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

 


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


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