monos 0 24 августа, 2008 Опубликовано 24 августа, 2008 · Жалоба Столкнулся с такой задачей: Необходимо было оцифровать сигнал с потенциометра и затем отмаштабировать цифровой результат. Как это сделать я так и не придумал, поэтому пришлось масштабировать аналоговый сигнал. Хотелось бы все таки делать это (масштабирование) программно. Камень использовал пик16ф886. Подскажите начинающему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rlab 0 24 августа, 2008 Опубликовано 24 августа, 2008 · Жалоба т.е нужно умножить, например на 0,12345? можно сделать так, умножить на 12345, разделить на 100000, при этом тип данных должен быть соответствующий, long например. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
monos 0 24 августа, 2008 Опубликовано 24 августа, 2008 · Жалоба Спасибо. Если не затруднит, дайте примерчик на си для понимания, как правильно задать этот (long) тип данных. А как сделать "смещение нуля" программно? Так, как нужно, чтобы отмаштабированный сигнал имел заданные минимальное и максимальное значения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rlab 0 24 августа, 2008 Опубликовано 24 августа, 2008 · Жалоба long value; const long offset=-10; // -10 adc попугаев const long mul= 12345; // 0,12345 const long div=100000; value=readADC(); value+=offset; value*=mul; value/=div; showOnLcdLong(value); showOnLcdByte((char)value); вот собственно и полный пример: http://electronix.ru/forum/index.php?act=A...st&id=16863 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
monos 0 24 августа, 2008 Опубликовано 24 августа, 2008 · Жалоба Видимо, я сильно начинающий:) : понял принцип, а как применить к моему случаю-- понял не совсем. У меня задача следующая: необходимо результат ацп поместить 8-разрядный регистр PR (он задает длительность импульса шим модуля ССР). При этом, 8<PR<48. У пиков ацп 10-разрядное (результат ацп читается из спаренного 16-разрядного регистра- старший байт и младший байт) т.е. результат будет в диапазоне 0...1024. В Вашем примере задается 32-разрядный тип данных, надо ли это в моем случае? Помогите разобраться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rlab 0 24 августа, 2008 Опубликовано 24 августа, 2008 · Жалоба ну тогда можно просто делить на 25, без округления 1023/25=40,92 = 40 0/25=0 добавить смещение 8 и готово, в результате 8 ~ 48, тогда хватит и 16 бит, если есть возможность перевести АЦП в 8 бит режим, то наверное можно ещё проще, но это уже сами считайте :) з.ы. только что заметил... больше 8, меньше 48... значит смещение 9, коэф соотв тоже надо пересчитать.. но смысл тот же calculation.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
monos 0 25 августа, 2008 Опубликовано 25 августа, 2008 · Жалоба Принцип понял, спасибо. Вы правы, наверное, будет лучше не читать два младших бита ацп и оперировать восьмиразрядным словом: такая возможность есть. Надо только продумать, как оперативно изменять мин и мах значения при наладке железа. А в пэдээфке, как понял, три варианта вычисления? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rlab 0 25 августа, 2008 Опубликовано 25 августа, 2008 · Жалоба сначала идёт расчёт коэф, потом 3 варианта расчёта, 1й с типом double, 2й через целочисленную арифметику с округлением, 3й - то же что и 2й (только через 1/к) но без округления Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
monos 0 25 августа, 2008 Опубликовано 25 августа, 2008 · Жалоба 2Sergey Reva Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Ie0nid 0 22 сентября, 2008 Опубликовано 22 сентября, 2008 · Жалоба Спасибо всем кто помог с регистрами USART. Подскажите пожалуйста еще один такой нюансик. Я пытался подключитть клавиатуру к УСАРТУ в синхронном режиме, у него есть стробирующие импульсы - 11 штук, идут они одновременно с данными, следовательно получается нужные 11 бит. (1 стартовый, стоповый, бит четности, и 8 бит данных). Естественно у меня ни чего не получилось. Такой вопрос, УСАРТ принимает очередной бит данных каким образом? По каждому стробу? И следующее, данные, я так понимаю, он считывает по уровню при появлению фронта строба. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 22 сентября, 2008 Опубликовано 22 сентября, 2008 · Жалоба На ресиве не спроста 1 висит а потом в 0 проваливается - это как раз стартовый бит - сигнал того, что началася транзакция. Кстати, а что это за клаиватура что через UART работает ? Клавы ж на PS/2 интерфейсе... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Ie0nid 0 23 сентября, 2008 Опубликовано 23 сентября, 2008 (изменено) · Жалоба короче штука такая. РС/2 - клавиатура имеет всего 4 провода, питание, земля, строб, и данные. Я конечно мог сделать через вход прерывания ИНТ0, посаженную на строб клавиатуры, и коротенькую функцию которая во время прерывания считывает один из входов атмела. НО у меня тогда приемник вообще мертвый получается. Ведь вроде все также, один стартовый, один стоповый, бит четности, 8 бит данных, все проверил, скорость устанавливать не стал, строб на ХСК, данные к УСАРТУ на прием. Но почему-то не принимает, кто подскажет, в чем дело? Вот коротенький листинг программы. INTERRUPT(SIG_UART0_RECV) { PORTA = UDR; _delay_loop_2(10000000000); } int main (void) //начало программы { DDRA = 0xFF; // A выход UCSRB = 0x90; // регистр состояния UARt. RXEN=1б D.1-вых, d.0-вход, в соотвествующие состояние, передача 8 бит данных UCSRC = 0x46;//синхронный режим, спадающий фронт сигнала. формат посылок восьмибитный, что соответствуют клавиатуре. UCSRA = 0x00;//режим работы USART sei(); // разрешаем общие прерывания while (1); } Изменено 23 сентября, 2008 пользователем _Ie0nid Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 23 сентября, 2008 Опубликовано 23 сентября, 2008 · Жалоба Да.. извращение есчё то.... По теме: во первых _delay_loop_2(10000000000); в прерывании не есть гут. Во вторых - вы думаете там от хорошей жизни линия клока существует ? И вообсче - попробуйте осцилом посмотреть на сигналы.. А после измерте на какой частоте идёт передача.. UART то настраивается на определённый Baudrate - а не на фронт.. Ниспадающим фронтом только ловится сатртовый бит.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Ie0nid 0 24 сентября, 2008 Опубликовано 24 сентября, 2008 · Жалоба ДОбрый день, я смотрел осцилогрофом, и вроде все так и должнно быть. Попробую рисунок вставить. рисунок загрузить не получилось. :07: Но я смотрел осцилом. Там, предположим, идет 11 импульсов строба, и штук 5 данных разной длительности. Я нажимал разные клавиши, при этом скан код данных, относительно фронта строба, действительно меняется. Так что, вроде все в порядке. картинка, один в один по книжке АТМЕЛОВ. Но вот, что по стробу он считывает лишь стартовый бит, это новость. Насколько она достоверна? ГДе можно почитать, прошу, подскажите. И еще, если он читает лишь стартовый бит по стробу, как же все остальные, они синхрятся от внутреннегго ЗГ, или как? Заранее благодарю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 24 сентября, 2008 Опубликовано 24 сентября, 2008 · Жалоба 2 _Ie0nid - делаете *.GIF и грузите сколько душе угодно ;) Касательно по стробу он считывает лишь стартовый бит Я такого не говорил -> я говорил что ниспадающий фронт на RX в UART`е и нужен для детектирования так сказать начала транзакции. Касательно того как устроен UART - попытайтесь его на каком нить HDL`е реализовать - реальная реализация не сильно будет отличаться ;) .. ..вроде все в порядке. картинка, один в один по книжке АТМЕЛОВ. Так а в чём вопрос то ?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться