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

 
 
> Формирование сигнала определенного вида длительностью 1,5 мкс
Sprite
сообщение Jun 6 2008, 19:07
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Доброго всем времени суток! Программирую atmga8535 с кварцем на 16 Мгц.
Возникла такая задача:

Имеется входной сигнал вида 1.
Нужно получить сигнал вида 2:

Прикрепленное изображение


Длительность нулевых уровней сигнала 2 - строго фиксированная и составляет 1,5 мкс. Нулевой уровень сигнала 2 должен заканчивается в момент смены фронта сигнала 1.
Проблема в том, что частота сигнала 1 заранее не известна и может меняться в пределах 10-20 кГц.
Думаю, что придется использовать таймер 1 и захватывать сигнал по ICP.
Уважаемые эксперты, какой режим таймера выбрать?
Буду очень признателен за изложение алгоритма (хотя бы на словах)!
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
otrog
сообщение Jun 7 2008, 04:47
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



Для работы с временами порядка микросекунд просто необходимо писать на ассемблере, и размещать все переменные в регистрах.
Если с асмом туго, рекомендую Algorithm Builder - графический ассемблер. Осваивается буквально за часы.
Успехов.


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
Sprite
сообщение Jun 7 2008, 06:35
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Цитата(otrog @ Jun 7 2008, 11:47) *
Для работы с временами порядка микросекунд просто необходимо писать на ассемблере, и размещать все переменные в регистрах.
Если с асмом туго, рекомендую Algorithm Builder - графический ассемблер. Осваивается буквально за часы.
Успехов.


После компиляции программы посмотрел я lss-файл:
Код
ISR(TIMER1_COMPA_vect) //Прерывание по сравнению сигнала
{
190:    1f 92           push    r1
192:    0f 92           push    r0
194:    0f b6           in    r0, 0x3f; 63
196:    0f 92           push    r0
198:    11 24           eor    r1, r1
19a:    8f 93           push    r24
19c:    9f 93           push    r25
19e:    ef 93           push    r30
1a0:    ff 93           push    r31
    OCR1A = bound[count];
1a2:    e0 91 68 00     lds    r30, 0x0068
1a6:    ff 27           eor    r31, r31
1a8:    ee 0f           add    r30, r30
1aa:    ff 1f           adc    r31, r31
1ac:    e0 5a           subi    r30, 0xA0; 160
1ae:    ff 4f           sbci    r31, 0xFF; 255
1b0:    80 81           ld    r24, Z
1b2:    91 81           ldd    r25, Z+1; 0x01
1b4:    9b bd           out    0x2b, r25; 43
1b6:    8a bd           out    0x2a, r24; 42
    count++;
1b8:    80 91 68 00     lds    r24, 0x0068
1bc:    8f 5f           subi    r24, 0xFF; 255
1be:    80 93 68 00     sts    0x0068, r24
    
    //Режим TOGGLE (инвертирование состояния вывода OC1A в последующем прерывании по сравнению)
    TCCR1A|=_BV(COM1A0);
1c2:    8f b5           in    r24, 0x2f; 47
1c4:    80 64           ori    r24, 0x40; 64
1c6:    8f bd           out    0x2f, r24; 47
    TCCR1A&=~_BV(COM1A1);
1c8:    8f b5           in    r24, 0x2f; 47
1ca:    8f 77           andi    r24, 0x7F; 127
1cc:    8f bd           out    0x2f, r24; 47
1ce:    ff 91           pop    r31
1d0:    ef 91           pop    r30
1d2:    9f 91           pop    r25
1d4:    8f 91           pop    r24
1d6:    0f 90           pop    r0
1d8:    0f be           out    0x3f, r0; 63
1da:    0f 90           pop    r0
1dc:    1f 90           pop    r1
1de:    18 95           reti


И понял, что получается полная лажа sad.gif
Всего выполняется 37 asm-операций, а максимум должно быть 24. Как быть?

Может лучше такой вариант?:
1) Вызывать прерывания по захвату два раза в период (т.е. по возрастающему и ниспадающему фронтам).
2) При захвате каждого фронта определять прерывания по сравнению
3) В прерывании по сравнению делать задержку на 24 такта (т.е. 24 команды "nop")

Сообщение отредактировал Sprite - Jun 7 2008, 06:35
Go to the top of the page
 
+Quote Post
rv3dll(lex)
сообщение Jun 7 2008, 07:05
Сообщение #4


Полное ничтожество
*****

Группа: Banned
Сообщений: 1 991
Регистрация: 20-03-07
Из: Коломна
Пользователь №: 26 354



Цитата(Sprite @ Jun 7 2008, 10:35) *
После компиляции программы посмотрел я lss-файл:
[
И понял, что получается полная лажа sad.gif
Всего выполняется 37 asm-операций, а максимум должно быть 24. Как быть?

Может лучше такой вариант?:
1) Вызывать прерывания по захвату два раза в период (т.е. по возрастающему и ниспадающему фронтам).
2) При захвате каждого фронта определять прерывания по сравнению
3) В прерывании по сравнению делать задержку на 24 такта (т.е. 24 команды "nop")


вопрос ребром - вы ассемблер знаете??

си всё всегда делает через стек - посмотрите сколько времени отнимают пуш и поп
если писать на ассемблере всё (на си наверное тоже можно - но я его не смог выучить - не дано) можно выделить регистры специально под это и сохранять только необходимые вещи
Go to the top of the page
 
+Quote Post
Sprite
сообщение Jun 7 2008, 07:50
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Цитата(rv3dll(lex) @ Jun 7 2008, 14:05) *
вопрос ребром - вы ассемблер знаете??

си всё всегда делает через стек - посмотрите сколько времени отнимают пуш и поп
если писать на ассемблере всё (на си наверное тоже можно - но я его не смог выучить - не дано) можно выделить регистры специально под это и сохранять только необходимые вещи


Спасибо за совет! Ассемблер я не знаю, но чувствую, что без него здесь не обойтись, постараюсь переписать прерывание на asm'e - скажу что получится.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Sprite   Формирование сигнала определенного вида длительностью 1,5 мкс   Jun 6 2008, 19:07
- - Flasher   Алгоритм простой- берем гадалку и пусть она говори...   Jun 6 2008, 19:26
|- - singlskv   Цитата(Flasher @ Jun 6 2008, 23:26) Алгор...   Jun 6 2008, 19:54
- - Flasher   Итак в рамках темы обсуждаем как писать гадалок. О...   Jun 6 2008, 20:00
|- - singlskv   Цитата(Flasher @ Jun 7 2008, 00:00) Итак ...   Jun 6 2008, 20:09
- - DRUID3   По маразму задачи, я так понимаю, что это ВУЗовско...   Jun 6 2008, 22:07
- - domowoj   Что-то подобное делал на частоте 100Гц. В вашем сл...   Jun 7 2008, 01:35
|- - Sprite   Цитата(domowoj @ Jun 7 2008, 08:35) Что-т...   Jun 7 2008, 04:29
- - rv3dll(lex)   на сколько я понимаю что автор не понял что говоря...   Jun 7 2008, 04:15
- - INT1   Если бы знал, где упаду(отрицательный перепад) , т...   Jun 7 2008, 04:25
- - Ledmaster   Цитата(Sprite @ Jun 7 2008, 01:07) Доброг...   Jun 7 2008, 07:44
|- - rv3dll(lex)   Цитата(Ledmaster @ Jun 7 2008, 11:44) Пац...   Jun 7 2008, 08:12
|- - Ledmaster   Цитата(rv3dll(lex) @ Jun 7 2008, 14...   Jun 7 2008, 09:40
- - MrYuran   Я знаю как надо поступить. 1. засекаем входной ...   Jun 7 2008, 08:44
- - Sprite   Цитата(MrYuran @ Jun 7 2008, 15:44) Я зна...   Jun 9 2008, 14:35


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

 


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


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