Atmega и мультиплексор

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Atmega и мультиплексор

Сообщение isx »

доброй ночи) подкажите пожалуйста принцип программирования адресов мультиплексора в атмеге. если можно то на примере кусочка кода, или хотя бы источник какой нибудь, ато уже пар идёт с неприличного места :)) Язык СИ.
Реклама
Аватара пользователя
Antifritz
Прорезались зубы
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Re: Atmega и мультиплексор

Сообщение Antifritz »

А конкретней можно: какая Atmega? Мультиплексор АЦП или какой?
Реклама
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Atmega и мультиплексор

Сообщение isx »

Не знал что принципиально :dont_know: . Атмега 8-16, мультиплексор CD4051.
И ещё вопрос. При подключение к ноге АДЦ атмеги мультиплексора её скорость опроса падает в 8 раз (8 входов у этого мультиплексора) или мультиплексор начинает работать со скоростью в 8 раз большей чем у АДЦ меги?
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: Atmega и мультиплексор

Сообщение IfoR »

Так в даташите все объяснено в картинках:
К ногам 13, 14, 15, 12, 1, 5, 2, 4 (Проставлено в порядке их нумерации от 0 до 7) подключаются коммутируемые входы\выходы. Установкой номера коммутируемого вывода на шине 11, 10, 9 мы устанавливаем, какой коммутируемый вывод нужно подсоединить к выводу 3 (общий ввод\вывод). Установкой высокого уровня сигнала на выводе 6 можно переключить вывод в высокоимпедансное состояние (по простому, отключить вывод от схемы). Вывод 16 подсоединяется к питанию. Выводы 7 и 8 - к земле.

Вопрос про скорость не совсем понял. Скорость никак не меняется. Мультиплексор лишь переключает выводы.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Atmega и мультиплексор

Сообщение ibiza11 »

isx, по моему Вы что то конкретно путаете.
Ставим плюсы: )
Реклама
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: Atmega и мультиплексор

Сообщение IfoR »

Не, ну я могу включить свои экстрасенсорные способности и предположить, что человек хочет подсоединить к мультиплексору 8 аналоговых входов и вывести 1 аналоговый к АЦП ATmega (ещё + 3 вывода для выбора входа) и потом их все опрашивать.
Опрашивать все 8 входов нельзя. Для этого необходимо 8 модулей АЦП. У ATmega он только 1 (может максимум 2, не знаю). Да и мультиплексор в таком случае был бы не нужен. Опрос каждого входа происходит по очереди и соответственно, суммарное время опроса всех 8 входов будет в 8 раз больше, чем потребовалось бы на опрос одного входа.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Реклама
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Atmega и мультиплексор

Сообщение isx »

Про даташит то понятно, у меня именно с кодом СИ проблема. Сейчас атмега уменя посылает сигнал 0хСС1, при нажитии кнопки подключенной к АДЦ1, а мне нужно подключить к мультиплексору, чтоб она отправляла к примеру 0хС20 - 0хС27.

Про скорость. Сейчас опрос состояния выхода АДЦ1 происходит каждые 5мс. Мультиплексор отправляет данные о состоянии выхода "пакетами", тоесть сначала состояние первого, затем поочерёдно дописывая все остальные.
Теория 1: Если опрос одного входа мультиплексора происходит в момент опроса АДЦ1, то "пакет" отправится только через 8 циклов.
Теория 2: Опрос мультиплексором всех его входов происходит в момент опроса АЦП1. Тогда задержка будет тоже, так как моментально сформировать "пакет" он врядли сможет.
Теория 3: Частота опроса входов мультиплексора в разы больше частоты опроса состояния АДЦ1. Тогда "пакет" из восьми состояний мультиплексора будет передаваться при каждом опросе АДЦ1, соответственно можно судить об увеличении производительности входа АДЦ1 мультиплексора в 8 раз.
Какая из них верная, и ести ли она тут вообще? :))
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: Atmega и мультиплексор

Сообщение IfoR »

Я не понимаю. Либо вы что-то недоговариваете, либо вы не понимаете сущность мультиплексора. Мультиплексор никакие "пакеты" передавать не может. Он лишь коммутирует выводы.
Вы хоть объясните, что хотите сделать-то.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Atmega и мультиплексор

Сообщение isx »

Как бы по короче. Есть устройство, отсылающее миди команды на компьютер. Комонда зависит от того, какая кнопка нажата. К АДЦ0 Атмеги подключен мультиплексор, который даёт 8 входов. Нужно подключить мультиплексоры к АДЦ1 - АДЦ5, так как входов не хватет, и возможно ли это вообще?
Аватара пользователя
МитяРа
Модератор
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Re: Atmega и мультиплексор

Сообщение МитяРа »

Насколько знаю, МИДИ-сигнал не аналоговый, а цифровой - тогда при чём тут АЦП.. :dont_know:
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Atmega и мультиплексор

Сообщение isx »

http://radiokot.ru/forum/viewtopic.php? ... &start=460
Вот она, нашёл наконец то...
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Atmega и мультиплексор

Сообщение Engineer_Keen »

Я думаю тут просто речь идет о миди-клавиатуре или чем-то подобном. Т.е. :кнопки (40 шт) -> 5х4051 -> АЦП меги -> протокол-миди в комп.

PS: А, ну так и есть...
Последний раз редактировалось Engineer_Keen Вт янв 17, 2012 12:21:19, всего редактировалось 1 раз.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Atmega и мультиплексор

Сообщение isx »

Я был бы очень признателен если бы кто нибудь объяснил как происходит назначение адресов и опрос мультиплексора на примере этого проекта. Код программный там очень маленький.
Мне не просто сделать надо, я понять хочу, но информации очень мало в интернете (только одна ссылка с более менее, но не совсем понятным описанием).
На том же сайте есть исходники этого устройства. В самом низу находятся строки управляющие сигналами от мультиплексора. Если кому не трудно, напишите пожалуйста коментарии к ним (их там не много). Вам знающим прооще, а я уже третью неделю голову ломаю...
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Atmega и мультиплексор

Сообщение Engineer_Keen »

Конкретно про тот проект не могу сказать, но принцип элементарный.
1) Устанавливаем канал АЦП в регистре ADMUX
2) Устанавливаем конкретный адрес в 4051, выводом данных в порт МК, к которому подключены адресные линии 4051
3) Запускаем преобразование АЦП, читаем, обрабатываем.
4) Если надо меняем канал АЦП и\или адрес 4051, повторяем п.3
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Atmega и мультиплексор

Сообщение isx »

А на каком моменте происходит назначение адреса (типа 0хХХ) конкретному входу 4051?
Аватара пользователя
МитяРа
Модератор
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Re: Atmega и мультиплексор

Сообщение МитяРа »

isx писал(а):на каком моменте происходит назначение адреса (типа 0хХХ) конкретному входу 4051
Engineer_Keen писал(а):2) Устанавливаем конкретный адрес в 4051, выводом данных в порт МК, к которому подключены адресные линии 4051
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Atmega и мультиплексор

Сообщение isx »

А можете на примере этого проекта:
/////////// ADC
if (freeslot > 0) { //adc check
// check analog input
if (channel == 0) {
if (7 == mux_n) { mux_n = 0; } else { mux_n++; }
// Выставление адресов на мультиплексор. Я так понимаю channel == 0 это назначение АДЦ0.
PORTB &= 0b11100011;
PORTB |= mux_n << 2; // change mux input line PB4..PB2
_delay_ms(1); // Здесь я так понял назначаются А В и С мультиплексора на соответствующие выходы АтМеги.
}

value = adc(channel); // 0..1023 Проверка текущего состояния входов мультиплексора?
// hysteresis
if (adcOld[channel+mux_n] - value > 7
|| adcOld[channel+mux_n] - value < -7) {

adcOld[channel+mux_n] = value; //Сравнение с прошлым состоянием, но процесс сам понять не смог..

// MIDI CC msg
midiMsg[iii++] = 0x0b;
midiMsg[iii++] = 0xb0+(midiPst[channel+mux_n] & 0x0F); // chanel
midiMsg[iii++] = midiPst[channel+mux_n+0x10]; // control# Понял что эти 3 строки назначают адрес, но как не понимаю..

// Инвертирование значения кнопок Зачем оно тут понятия не имею
if ( (channel == 0) && (mux_n > 4) && (mux_n <= 7) ) { En = (~value >> 3) & 0x7F; } else { En = value >> 3; }
midiMsg[iii++] = En;



#if LCD_CONNECTED > 0

// Формируется строка вида CC# X [VAL] X-номер контролла, VAL-значение
str = "CC# ";
LCDGotoXY(0,0);
LCDstring(str,4);

lci = channel+mux_n+0x30;
if (lci > 0x39) lci += 7;
LCDGotoXY(4,0);
LCDsendChar(lci);

str = " [";
LCDGotoXY(5,0);
LCDstring(str,2);

LCDGotoXY(7,0);
myitoa(En, buffer);
LCDstring(buffer,3);

lci = strlen(buffer);

str = "] ";
LCDGotoXY(lci+7,0);
LCDstring(str,4-lci);

// Спецсимволы во вторую строку
lci = En >> 4;
LCDGotoXY(channel+mux_n,1);
LCDsendChar(lci);

#endif



}
if (channel == 0) {
if (7 == mux_n) { channel++; }
} else { channel++; }

if (6 == channel)
channel = 0; Зачем эти 5 строк вообще не представляю, особенно ввели в замешательство 6 == channel. Что они вообще значат?

} // endof adc check
if (iii > 0) {
// Включается подсветка LCD
#if LED_ANOD > 0
PORTC |= 0b01000000;
#else
PORTC &= ~0b01000000;
#endif
// на ~3 секунды
canter = 900;

// Отправляется МИДИ-пакет
usbSetInterrupt(midiMsg, iii);
}
} // usbInterruptIsReady()
}
return 0;
}
}
"Наклонным и подчёркнутым шрифтом" я отметил работу ЛСД (правильно?).
Жирным отмечены мои мысли :)
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Atmega и мультиплексор

Сообщение Engineer_Keen »

isx писал(а): if (channel == 0) {
if (7 == mux_n) { mux_n = 0; } else { mux_n++; }
// Выставление адресов на мультиплексор. Я так понимаю channel == 0 это назначение АДЦ0.
Почти. Установка канала АЦП происходит в процедуре чтения АЦП (int adc(uchar channel)), там channel маскируется числом 0х07 и заносится в ADMUX.
isx писал(а): PORTB &= 0b11100011;
PORTB |= mux_n << 2; // change mux input line PB4..PB2
_delay_ms(1); // Здесь я так понял назначаются А В и С мультиплексора на соответствующие выходы АтМеги.
Похоже на то.
isx писал(а): value = adc(channel); // 0..1023 Проверка текущего состояния входов мультиплексора?
Это чтение АЦП
isx писал(а): // hysteresis
if (adcOld[channel+mux_n] - value > 7
|| adcOld[channel+mux_n] - value < -7) {

adcOld[channel+mux_n] = value; //Сравнение с прошлым состоянием, но процесс сам понять не смог..
Видимо проверка не выходит ли разница между новым и старым значениями за пределы +-7 отсчетов АЦП. Если выходит, то старое значение меняется на новое. Наверно сделано для фильтрации.
isx писал(а): // MIDI CC msg
midiMsg[iii++] = 0x0b;
midiMsg[iii++] = 0xb0+(midiPst[channel+mux_n] & 0x0F); // chanel
midiMsg[iii++] = midiPst[channel+mux_n+0x10]; // control# Понял что эти 3 строки назначают адрес, но как не понимаю..

// Инвертирование значения кнопок Зачем оно тут понятия не имею
if ( (channel == 0) && (mux_n > 4) && (mux_n <= 7) ) { En = (~value >> 3) & 0x7F; } else { En = value >> 3; }
midiMsg[iii++] = En;
Тут надо протокол миди ковырять чтобы понять смысл.
isx писал(а): if (channel == 0) {
if (7 == mux_n) { channel++; }
} else { channel++; }

if (6 == channel)
channel = 0; Зачем эти 5 строк вообще не представляю, особенно ввели в замешательство 6 == channel. Что они вообще значат?
Просто изменение каналов и адресов подряд. Видимо мультиплексор подключен только к АЦП0, поэтому пока channel=0, меняются адреса (mux_n), а потом подряд меняются оставшиеся каналы АЦП.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Atmega и мультиплексор

Сообщение isx »

Тут надо протокол миди ковырять чтобы понять смысл.
Могу ещё сказать, что на выходи при использовании входов мультиплексора выходят адреса 0хС70-0хС77... А вот как они туда вписаны непонятно..
Просто изменение каналов и адресов подряд. Видимо мультиплексор подключен только к АЦП0, поэтому пока channel=0, меняются адреса (mux_n), а потом подряд меняются оставшиеся каналы АЦП.
С этой строкой разобрался))

if ( (channel == 0) && (mux_n > 4) && (mux_n <= 7) ) { En = (~value >> 3) & 0x7F; } else { En = value >> 3; }
midiMsg[iii++] = En;
Что получится если mux_n = 1 ?
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Atmega и мультиплексор

Сообщение isx »

uchar midiPst[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
70,71,72,73,74,75,76,77,1,2,3,4,5,6,7,0}; // Default midi-preset
// first 16 is chanels 0x00..0x0F
// second 16 is controls# 0x00..0x7F

midiMsg[iii++] = midiPst[channel+mux_n+0x10]; // control#

Чему будет равен midiMsg[iii++] при channel=0 и mux_n = 1 ?
Похоже я близок к разгадке :))

И ещё... В какой среде можно было бы забить эти данные и получить ответ?
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»