Перейти к содержанию
    

Генератор меандра на ARM.

Здравствуйте, господа. После долгих гуглений и размышлений решил обратиться сюда.

Собственно, есть такая штука с установленным Linux (Digi Embedded Linux). Я на ней диплом сейчас пишу.

Но пока задача не связанная с дипломом.

Нужно на светодиод на плате подать сигнал заданной частоты (100 Гц - 100 kГц). Управляться это должно через Ethernet.

Как я себе это представляю: Программа на компьютере, которая формирует управляющий сигнал и передает его на плату. С этим понятно. Но вот дальше, есть много вопросов:

 

1) Как заставить программу записывать нули единицы в файл драйвера с нужной скоростью? Понял что всякие usleep и nanosleep не подходят, так как квант времени системы гораздо больше необходимой задержки (или я ошибаюсь?).

2) Если каким то образом заставить систему выполнять только процесс записи в файл драйвера, то загрузка CPU будет 100%. Как тогда можно слушать команду пришедшую от управляющей программы?

 

В общем, как так.

Буду благодарен за любые советы по этой проблеме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как вариант написать свой драйвер для мигания светодиодом, драйверу передается значение с какой частотой мигать. от управляющей программы требуется передавать только изменившиеся значение частоты мигания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужно на светодиод на плате подать сигнал заданной частоты (100 Гц - 100 kГц).

Если 100кГц, то о программном формировании забудьте навсегда. Только аппаратный таймер/ШИМ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

cpl, я тоже уже начал склоняться к написанию драйвера для gpio. Но так как драйверы не разу не писал, ни под Linux, ни под Windows, хочется как-то обойти пока это дело (хоть я понимаю что скорее всего не получится). Вот что нагуглил:

Задержка через порты ввода/вывода

Другой способ обеспечить задержку в несколько микросекунд - это порты ввода/вывода. Запись или чтение любого значения из порта 0x80 (о том, как это сделать, см. выше) обеспечивает задержку почти точно равную одной микросекунде, независимо от типа и скорости вашего процессора. Чтобы обеспечить задержку в несколько микросекунд, вы можете выполнить эту операцию несколько раз. Запись в этот порт не оказывает никакого влияния на компьютер (и некоторые драйверы используют это). Таким образом, обычно выполняется задержка в {in|out}[bw]_p() (см. asm/io.h).

 

На самом деле, операции ввода/вывода на большинство портов в диапазоне от 0 до 0x3ff тоже дают задержку около одной микросекунды. Так что, если вы, например, производите запись в параллельный порт, для обеспечения задержки, просто добавьте дополнительные inb() из порта.

 

Вопрос такой, сколько процессорного времени занимает считать функцией read() 1 байт из файла драйвера gpio? И возможно ли с помощью этого управлять временем? Тогда можно было бы запускать цикл с нужным числом вызовов этой функции.

 

aaarrr, если под аппаратное реализацией вы имеете ввиду, припаивание еще какого-то внешнего девайса, то это категорически не подходит.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

aaarrr, если под аппаратное реализацией вы имеете ввиду, припаивание еще какого-то внешнего девайса, то это категорически не подходит.

Не припаивание внешнего, а использование внутреннего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не припаивание внешнего, а использование внутреннего.

 

Это и есть написание драйвера, или я чего-то не до понимаю? Простите мне мою неосведомленность. Студент :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это и есть написание драйвера, или я чего-то не до понимаю? Простите мне мою неосведомленность. Студент :)

Процессор внутри себя содержит периферию, пригодную для формирования меандра (PWM). Вот её и нужно задействовать.

Если драйвера PWM нет, то таки да, его придется написать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо aaarrr и cpl за советы.

Пытался разобраться во внутреннем устройстве процессора. Так вот, оказывается в нем есть 4 таймера с функциями PWM. Я даже понял как ими управлять, но как мне связать выход таймера и выход к которому припаяна лампочка так, чтоб не них был один и тот же сигнал?

Прикрепил четыре файла: в timer.jpg схема таймера, в Pin.jpg номера пинов к которым подключены выходы таймеров, в Pin_Set.jpg возможные настройки этих портов и в GPBDAT.jpg описание которое меня смущает.

 

Помогите пожалуйста разобраться.

post-68530-1329202596_thumb.jpg

post-68530-1329202789_thumb.jpg

post-68530-1329203031_thumb.jpg

post-68530-1329203143_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В инициализации пинов задавайте режим работы, просто пин ввод-вывод, или альтернативная функция выход таймера например.

 

PS

Не перегрузите вывод процессора прямым подключением светодиода, а то сгорит. Подключать лучше через буфер.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу режима работы, пин светодиода (GPL10) нужно устанавливать в режим output, как я понимаю, а вот вывод таймера скорее всего в TOUT.

Так вот вопрос, возможно ли без пайки их соединить так, чтоб сигнал который появляется на GPB2(таймер 2) например, появлялся и на GPL10 (мой светодиод)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...