преобразовать аналог в цифру (без задержек)

stasonchi
Offline
Зарегистрирован: 10.01.2012

Здравствуйте, господа программеры! Прошу вашей помощи!

Вот непосредственно тема: моя плата (arduino nano v5 atmega328) генерирует код для передачи сигнала (фиксированное число условных байт информации), к цифровым входам подключены кнопки, и в зависимости от того, какие кнопки включены и не включены, определённый участок этого сигнала принимает значение условно говоря "0" или "1", и этот сигнал (0010101001....00010) отправляется циклически строго друг за другом, даже если ни одна из кнопок не нажата, вобщем сигнал этот отправляется строгое количество раз в секунду, никаких задержек быть не может между сигналами, иначе это приведёт к сбою синхронизации между передатчиком и приёмником. Работу приёмника изменить нельзя, так что не обращайте пожалуйста на приёмник никакого внимания.

Помимо кнопок, мне необходимо подключить некую ручку газа в 8битной дискретности, то есть если ручка газа не нажата то этому положению должен соответствовать код (00000000), а при полном нажатии мы получаем код (11111111). Соответственно в этом моём отсылаемом передатчику сигнале предусмотрено место (8бит) во всём цикле сигнала. Как преобразовать программно аналоговое значение (от 0 до 5Вольт) в цифровое (от 0 до 255), никакой трудности конечно не вызывает. Проблему создаёт то, что считывание значения с аналогового входа занимает примерно 100 микросекунд. Посылаемый код генерируется в реальном времени, и таким образом снятие показания с анагового входа "раздвигает" мой цикл кода на несколько микросекунд и нарушается синхронизация между передатчиком и приёмником (один бит моего сигнала равен 200микросекунд, то есть происходит сдвиг сигнала грубо говоря на полбита).

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

1) Программно. Если это возможно, как-то параллельно с основной программой считывать показания аналогового входа, не искажая длину цикла моей программы. Реально ли?

2) Технически. Если подключить к ардуино отдельную платку, которая будет преобразовывать аналог в цифру (5Вольт ---> 8бит), и таким образом от этой платки к ардуино пойдут 8 каналов, которые я подключу к восьми цифровым входам ардуино и получу готовый шифр, останется лишь его отправить в сигнале. Посоветуете что-нибудь(дёшево и сердито)?

Заранее огромное спасибо всем кто откликнется. Работа стоИт, а должна кипеть=)

step962
Offline
Зарегистрирован: 23.05.2011

stasonchi пишет:

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

Это что за число такое - "строгое количество"? 10? 1000? 1000000?

Цитата:

Проблему создаёт то, что считывание значения с аналогового входа занимает примерно 100 микросекунд.

Эти 100 мкс больше периода между очередными передачами информации? Меньше? Намного меньше?

Цитата:

и нарушается синхронизация между передатчиком и приёмником

Каким образом осуществляется синхронизация между передатчиком и приемником? Есть внешний задающий генератор? Один из ваших модулей раздает синхроимпульсы? Каждый из модулей использует для определения моментов начала приема/передачи свои внутренние часы?

В последнем случае ответ на поставленный вопрос вам не поможет - через пару десятков/сотен/тысяч циклов передачи приемник перестанет "понимать" передаваемую информацию. Нет в природе кварцев с абсолютно одинаковой и столь же абсолютно стабильной частотой.

Или у вас все-таки асинхронная передача данных и синхронизация требуется в пределах одного пакета?

Цитата:

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

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

"Вы мне скажите: скока вешать в граммах?" (c)

 

stasonchi
Offline
Зарегистрирован: 10.01.2012

Спасибо, что отозвались на мой клич о помощи, step962 !=)

Прошу прощения за такой несуразный по сути пост, ибо разбираться в ардуино начал буквально на днях. ПРОБЛЕМУ УЖЕ РЕШИЛ! Всё работает отлично! Ещё раз извиняюсь, очень неловко, сейчас понимаю насколько был глупым мой вопрос!!))

Проблема возникла из-за того, что я давал сигнал digitalWrite(), и делал задержку delayMicroseconds() задавая длительность бита, и как палоумный думал как же мне упихнуть в код analogRead(), чтобы не исказить длительность цикла программы))) соответственно там где надо было снять аналоговое значение я убрал delayMicroseconds() и воспользовался таймером micros() и снял себе спокойно напряжение с аналога))

Ещё раз спасибо! ТЕМА ЗАКРЫТА! ПРОШУ ИЗВИНЕНИЙ!!!