Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
akl
Друг Кота
Сообщения: 4475
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Вычёркиваете из схемы фиксированные производителем лапы (RESET, OC1B, AIN0, AIN1, ADC6, ADC7). Оставшиеся лапы назначаете самостоятельно, с учётом возможности совмещения функций ввода-вывода (индикация-кнопки).
Реклама
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Сообщение amd9800 »

В том то и дело что ни одного целого порта не остается для семисегментного индикатора и думаю как же быть?
Неудобно работать с пинами с разных портов.
Ну если так уж быть как объединить скажем 5 пинов одного порта и 3 другого порта как один целый 8 битовый массив?
Чтоб сразу записать 8 битовое значение.
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Выключать, чтобы не было непредсказуемого поведения пока будете загружать регистры. Это крайне необходимо если ШИМ у вас управляет силовыми ключами иначе можно силовые ключи пожечь и т.д. и т.п.

Если вы это делаете в самом начале после сброса то дополнительно отключать не нужно, таймер и так стоит.
А если в прошивке используется "программный сброс" переходом на нулевое прерывание то это делать просто необходимо.
Учитывая целый ряд обстоятельств, лучше его отключить даже если знаете что он отключен - кто его знает куда потом в будущем пойдет этот код...
ни одного целого порта не остается для семисегментного индикатора и думаю как же быть?
немного доработать аппаратную часть, добавить регистр сдвига для сегментов - он потребует всего 3-х выводов от контроллера. В другом случае, если это решение неприемлемо - написать подпрограмму(назвать её что-то вроде set_segment) которая на входе возьмет один байт и распихает его по нужным портам используя логические выражения и прочее - да хоть побитно. Изменяя аппаратную конфигурацию достаточно будет просто переписать эту подпрограмму. Впрочем этот вариант универсален - программу переписывать не надо, а подпрограмма может с такой же эффективностью работать и с внешним регистром сдвига.
Контактная информация:
Родился
Сообщения: 10
Зарегистрирован: Пн июн 30, 2014 14:47:24

Сообщение Wanderer123 »

Добрый день! Попросили сделать УЗО с выводом на семисегментный индикатор тока утечки (дифференциального тока) в диапазоне 1-100мА. Хочу все это сделать на ATmega8. Как вывести данные с МК на индикатор я знаю, но как подружить трансформатор тока и АЦП МК нет. Буду благодарен за любую информацию. Заранее спасибо!
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Ну так, там не просто трансформатор а дифференциальный трансформатор. да очень просто, с него подаете напряжение через обязательный ограничитель(чтобы не спалить МК) прямо на вход АЦП, и измеряете с частотой примерно 50*16гц, со входного напряжения можно взять сигнал перехода через ноль - привязать моменты начала накопления сумм к переходу через ноль, итого у вас каждый период сетевого напряжения будет значение тока просуммированного 16 раз за период. Останется поделить его на 16(обычный логический сдвиг вправо, но вообще делить стоит после умножения чтобы не потерять младшие разряды числа) и умножить на коэффициент пропорциональности(зависит от коэфициента трансформации, нагрузки трансформатора тока и т.д. - этот коэфициент поддается рассчету при помощи обычной арифметики) и у тебя получится ток. Только учти, АЦП не измеряет отрицательные значения а значит у тебя измерено будет ровно в 2 раза меньше номинала - т.е. надо будет умножить показания еще на два.
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

ibiza11 писал(а):так 4.56мкс :)) только пакет то извне надо задавать)
Дак он извне и задаётся, просто я добавил код для переустановки пакета, чтобы молотил постоянно.
Этот кусок :

Код: Выделить всё

   if(!--BitNum){
     BitNum=16;
     Packet=0xAAAA;
   }
можно убрать. Тогда будет "одиночный выстрел" и съэкономится ещё несколько тактов (уберётся условие).Хотя нет, вру, условие убрать не получится. Нужно контролировать окончание передачи.
ibiza11 писал(а): мне кажется вариант akl тут несомненно лидер по скорости.
Не могу спорить, т.к. не знаю ассемблера АВР. Но, сдаётся мне, что там в передаче фигурирует всего один байт.
В принципе, можно ещё немного подукоротить время выполнения, сделав побайтовый вывод данных. Выиграем время за счёт сдвига переменной.
Сделать можно всё, даже на ЯВУ, но нужно хорошо знать свой ассемблер и компилятор, и то, во что он разворачивает код.
Реклама
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Сообщение amd9800 »

ibiza11 писал(а):Изображение
не могу понять чем отличается режим 11 от 9.

В протеусе я получаю один и тот же результат.

Хотя у 11 написано только phase correct, а у 9 еще и frequency, то меняя значение в OCR1A частота меняется в обеих режимах.
Мудрый кот
Аватара пользователя
Сообщения: 1815
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Найдите 10 отличий :) Вторая колонка с права на лево.
Запись в регистр OCR1A может производиться сразу при выполнении команды вывода в порт в/в (immediate), а может буферизироваться и производиться, когда счётчик находиться в "нижней" (bottom) или "верхней" (top) точке счёта. Чтобы не было искажения импульсов, когда запись в порт в/в производится в середине цикла счёта.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт июн 26, 2014 15:27:55

Сообщение Starmarik »

Друзья, у меня вопрос. Можно ли использовать выход RESET микроконтроллера для перезапуска контроллера часто? Я сделал таймер для аквариума, запускается с момента подачи питания, и чтоб корректировать, сместить временной интервал, нужно его перезапустить. Я сделал на одном выходе обнуление переменных, работает прекрасно. Но смущает, что RESET болтается без дела, а целый порт для обнуления переменных задействован. Не будет ли вреда контроллеру, если я буду перезапускать его RESETом?
Chettuser

Сообщение Chettuser »

А команда RESET не? :)
Если конечно в Вашем МК она есть. :)))
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт июн 26, 2014 15:27:55

Сообщение Starmarik »

Chettuser писал(а):А команда RESET не? :)
Если конечно в Вашем МК она есть. :)))
У меня ATTINY13, собсно даже не задумывался над этим. Прекрасно работает и обнуление переменных, но меня уж очень смущает то, что нога RESET без дела :)
Chettuser

Сообщение Chettuser »

Вот так и вырастают... хакеры :)))
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт июн 26, 2014 15:27:55

Сообщение Starmarik »

Chettuser писал(а):Вот так и вырастают... хакеры :)))
:))) :))) :)))
Открыл глаза
Сообщения: 52
Зарегистрирован: Чт дек 12, 2013 02:28:20

Сообщение beniamin91 »

Добрый вечер уважаемые коты.
Помогите новичку в одном вопросе.
Нужно собрать управление инкубатором которое будет поддерживать определенную температуру и каждые 2 часа переворачивать яйца.
Как можно решить проблему что бы МК считал время и включал мотор и при этом не перестал бы смотреть за температурой?
Вот код, на синтаксис не обращайте внимания все точки с запятым потом поставлю. Как можно переделать алгоритм?

Код: Выделить всё

t = 37
c = 7200000
s = 0


if (температура < t){Включить нагреватель}
else{ if(температура > t){Выключить нагреватель} }




/////////////////нужно проверять нижнее условие по каждые 2 часа//////////////////

delay_ms(c)


if (s = 0)
   {Включить матор по часавой
    s++}
else { if(s = 1)
	{Включить матор против часавой
	 s == 0}
     } 


температура берется с датчика ds18b20
мотор будет отключатся по достижению латков яиц двум концевикам (прикрепил картинку)
Вложения
Безымянный.png
(11.38 КБ) 374 скачивания
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Про таймеры почитайте. А заодно и грамматику полистайте.
Fucking static initialization order fiasco
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт июн 26, 2014 15:27:55

Сообщение Starmarik »

beniamin91, можно сделать отсчет времени таймером. Например, как сделал я для аквариума - настройка таймера на прерывание по совпадению, вот расчет значений на 100 Гц, тоесть на 1/100 секунды -(за расчет отдельное спасибо oleg110592) 1/100 секунды равно 100Гц, Внутренний генератор тини13 9.6 MHz.
В документации есть формула из нее получается:
OCR=(Fclk/Focn*N)-1
N - коэффициент предделителя (1, 8, 64, 256, or 1024)
OCR=(9600000/100*N)-1=(9600000/(100*1024))-1= 92.75=93 . Далее в функции прерывания таймера ставишь увеличение переменной, напр. sec++, а в основном цикле пишеш отсчет времени, например, if (sec==6000){min++; sec=0} - одна минута, if (min==60){hour++; min=0} - один час. Далее условие на два часа - if(hour==2){включаем переворот яиц}, и так далее. Если интересно, то позже скину тебе код, который я делал для включения света и кормушки в аквариуме.
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

судя по коду, который предоставил beniamin91 - это его первая попытка программирования. И дальше нее он не пойдет. Ему нужно, чтобы кто-то за него написал. А это несколько в другом разделе.
Fucking static initialization order fiasco
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт июн 26, 2014 15:27:55

Сообщение Starmarik »

Pink-Pank писал(а):судя по коду, который предоставил beniamin91 - это его первая попытка программирования. И дальше нее он не пойдет. Ему нужно, чтобы кто-то за него написал. А это несколько в другом разделе.
Моя первая попытка программирования это было моргание светодиода и залоченный МК :) Но я увидел, всю мощь, так сказать, контроллеров, и изучаю дальше. Думаю, у товарища beniamin91 все еще впереди :))
Открыл глаза
Сообщения: 52
Зарегистрирован: Чт дек 12, 2013 02:28:20

Сообщение beniamin91 »

Starmarik спасибо за отзывчивость.
Я тоже думал что надо сделать с таймером но увы еще не совсем понимаю как работать с ним.
Starmarik писал(а): Если интересно, то позже скину тебе код, который я делал для включения света и кормушки в аквариуме.
буду очень признателен за код. Думаю уловлю суть работы и смогу доделать свой.
О какого мнения вы на счет регулятора температуры? По вашему такой код будет нормально держать температуру или же я совсем нечего полезного не написал?

Код: Выделить всё

if (температура < t){Включить нагреватель}
else{ if(температура > t){Выключить нагреватель} }
Pink-Pank писал(а):судя по коду, который предоставил beniamin91 - это его первая попытка программирования. И дальше нее он не пойдет.
не первая попытка и не последняя. О вы что с пелёнок занимались контролерами или же без начало сразу дошли до конца ?
Pink-Pank писал(а):Ему нужно, чтобы кто-то за него написал. А это несколько в другом разделе.
Ты не в моем голове и не знаешь что мне нужно, свои негативные эмоции держите в себе!
aam
Собутыльник Кота
Аватара пользователя
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Сообщение aam »

Скажите, а кто-нибудь пробовал анализировать протокол RF-пультов для освещения типа таких:
Изображение
?
Как они вообще работают и насколько они унифицированы?

Хотелось с помощью покупного пульта управлять самодельным контроллером для люстры.

Помимо этого видел радиомодули УАРТ. В принципе они позволили бы реализовать что угодно. Но не делать же пульт самому.
Ответить

Вернуться в «Разные вопросы по МК»