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

Микроконтроллеры для начинающих

Столкнулся с такой задачей:

Необходимо было оцифровать сигнал с потенциометра и затем отмаштабировать цифровой результат. Как это сделать я так и не придумал, поэтому пришлось масштабировать аналоговый сигнал. Хотелось бы все таки делать это (масштабирование) программно. Камень использовал пик16ф886. Подскажите начинающему.

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


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

т.е нужно умножить, например на 0,12345? можно сделать так, умножить на 12345, разделить на 100000, при этом тип данных должен быть соответствующий, long например.

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


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

Спасибо. Если не затруднит, дайте примерчик на си для понимания, как правильно задать этот (long) тип данных.

А как сделать "смещение нуля" программно? Так, как нужно, чтобы отмаштабированный сигнал имел заданные минимальное и максимальное значения.

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


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

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

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


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

Видимо, я сильно начинающий:) : понял принцип, а как применить к моему случаю-- понял не совсем.

У меня задача следующая: необходимо результат ацп поместить 8-разрядный регистр PR (он задает длительность импульса шим модуля ССР). При этом, 8<PR<48. У пиков ацп 10-разрядное (результат ацп читается из спаренного 16-разрядного регистра- старший байт и младший байт) т.е. результат будет в диапазоне 0...1024. В Вашем примере задается 32-разрядный тип данных, надо ли это в моем случае? Помогите разобраться.

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


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

ну тогда можно просто делить на 25, без округления

1023/25=40,92 = 40

0/25=0

добавить смещение 8 и готово, в результате 8 ~ 48, тогда хватит и 16 бит, если есть возможность перевести АЦП в 8 бит режим, то наверное можно ещё проще, но это уже сами считайте :)

 

з.ы.

только что заметил... больше 8, меньше 48... значит смещение 9, коэф соотв тоже надо пересчитать.. но смысл тот же

calculation.pdf

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


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

Принцип понял, спасибо. Вы правы, наверное, будет лучше не читать два младших бита ацп и оперировать восьмиразрядным словом: такая возможность есть. Надо только продумать, как оперативно изменять мин и мах значения при наладке железа. А в пэдээфке, как понял, три варианта вычисления?

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


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

сначала идёт расчёт коэф, потом 3 варианта расчёта, 1й с типом double, 2й через целочисленную арифметику с округлением, 3й - то же что и 2й (только через 1/к) но без округления

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


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

Спасибо всем кто помог с регистрами USART. Подскажите пожалуйста еще один такой нюансик. Я пытался подключитть клавиатуру к УСАРТУ в синхронном режиме, у него есть стробирующие импульсы - 11 штук, идут они одновременно с данными, следовательно получается нужные 11 бит. (1 стартовый, стоповый, бит четности, и 8 бит данных). Естественно у меня ни чего не получилось. Такой вопрос, УСАРТ принимает очередной бит данных каким образом? По каждому стробу? И следующее, данные, я так понимаю, он считывает по уровню при появлению фронта строба.

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


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

На ресиве не спроста 1 висит а потом в 0 проваливается - это как раз стартовый бит - сигнал того, что началася транзакция.

Кстати, а что это за клаиватура что через UART работает ? Клавы ж на PS/2 интерфейсе...

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


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

короче штука такая. РС/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);

 

}

Изменено пользователем _Ie0nid

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


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

Да.. извращение есчё то....

По теме:

во первых

_delay_loop_2(10000000000);

в прерывании не есть гут.

 

Во вторых - вы думаете там от хорошей жизни линия клока существует ?

 

И вообсче - попробуйте осцилом посмотреть на сигналы..

А после измерте на какой частоте идёт передача.. UART то настраивается на определённый Baudrate - а не на фронт.. Ниспадающим фронтом только ловится сатртовый бит..

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


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

ДОбрый день, я смотрел осцилогрофом, и вроде все так и должнно быть. Попробую рисунок вставить.

рисунок загрузить не получилось. :07:

Но я смотрел осцилом. Там, предположим, идет 11 импульсов строба, и штук 5 данных разной длительности. Я нажимал разные клавиши, при этом скан код данных, относительно фронта строба, действительно меняется. Так что, вроде все в порядке. картинка, один в один по книжке АТМЕЛОВ.

Но вот, что по стробу он считывает лишь стартовый бит, это новость. Насколько она достоверна? ГДе можно почитать, прошу, подскажите.

И еще, если он читает лишь стартовый бит по стробу, как же все остальные, они синхрятся от внутреннегго ЗГ, или как?

Заранее благодарю.

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


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

2 _Ie0nid - делаете *.GIF и грузите сколько душе угодно ;)

Касательно

по стробу он считывает лишь стартовый бит

Я такого не говорил -> я говорил что ниспадающий фронт на RX в UART`е и нужен для детектирования так сказать начала транзакции.

 

Касательно того как устроен UART - попытайтесь его на каком нить HDL`е реализовать - реальная реализация не сильно будет отличаться ;) ..

..вроде все в порядке. картинка, один в один по книжке АТМЕЛОВ.

Так а в чём вопрос то ??

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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