Atmega и мультиплексор
Atmega и мультиплексор
доброй ночи) подкажите пожалуйста принцип программирования адресов мультиплексора в атмеге. если можно то на примере кусочка кода, или хотя бы источник какой нибудь, ато уже пар идёт с неприличного места
Язык СИ.
- Реклама
- Antifritz
- Прорезались зубы
- Сообщения: 222
- Зарегистрирован: Чт июл 08, 2010 01:03:40
- Откуда: Украина, Киев
Re: Atmega и мультиплексор
А конкретней можно: какая Atmega? Мультиплексор АЦП или какой?
Re: Atmega и мультиплексор
Не знал что принципиально
. Атмега 8-16, мультиплексор CD4051.
И ещё вопрос. При подключение к ноге АДЦ атмеги мультиплексора её скорость опроса падает в 8 раз (8 входов у этого мультиплексора) или мультиплексор начинает работать со скоростью в 8 раз большей чем у АДЦ меги?
И ещё вопрос. При подключение к ноге АДЦ атмеги мультиплексора её скорость опроса падает в 8 раз (8 входов у этого мультиплексора) или мультиплексор начинает работать со скоростью в 8 раз большей чем у АДЦ меги?
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: Atmega и мультиплексор
Так в даташите все объяснено в картинках:
К ногам 13, 14, 15, 12, 1, 5, 2, 4 (Проставлено в порядке их нумерации от 0 до 7) подключаются коммутируемые входы\выходы. Установкой номера коммутируемого вывода на шине 11, 10, 9 мы устанавливаем, какой коммутируемый вывод нужно подсоединить к выводу 3 (общий ввод\вывод). Установкой высокого уровня сигнала на выводе 6 можно переключить вывод в высокоимпедансное состояние (по простому, отключить вывод от схемы). Вывод 16 подсоединяется к питанию. Выводы 7 и 8 - к земле.
Вопрос про скорость не совсем понял. Скорость никак не меняется. Мультиплексор лишь переключает выводы.
К ногам 13, 14, 15, 12, 1, 5, 2, 4 (Проставлено в порядке их нумерации от 0 до 7) подключаются коммутируемые входы\выходы. Установкой номера коммутируемого вывода на шине 11, 10, 9 мы устанавливаем, какой коммутируемый вывод нужно подсоединить к выводу 3 (общий ввод\вывод). Установкой высокого уровня сигнала на выводе 6 можно переключить вывод в высокоимпедансное состояние (по простому, отключить вывод от схемы). Вывод 16 подсоединяется к питанию. Выводы 7 и 8 - к земле.
Вопрос про скорость не совсем понял. Скорость никак не меняется. Мультиплексор лишь переключает выводы.
- Реклама
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: Atmega и мультиплексор
Не, ну я могу включить свои экстрасенсорные способности и предположить, что человек хочет подсоединить к мультиплексору 8 аналоговых входов и вывести 1 аналоговый к АЦП ATmega (ещё + 3 вывода для выбора входа) и потом их все опрашивать.
Опрашивать все 8 входов нельзя. Для этого необходимо 8 модулей АЦП. У ATmega он только 1 (может максимум 2, не знаю). Да и мультиплексор в таком случае был бы не нужен. Опрос каждого входа происходит по очереди и соответственно, суммарное время опроса всех 8 входов будет в 8 раз больше, чем потребовалось бы на опрос одного входа.
Опрашивать все 8 входов нельзя. Для этого необходимо 8 модулей АЦП. У ATmega он только 1 (может максимум 2, не знаю). Да и мультиплексор в таком случае был бы не нужен. Опрос каждого входа происходит по очереди и соответственно, суммарное время опроса всех 8 входов будет в 8 раз больше, чем потребовалось бы на опрос одного входа.
Re: Atmega и мультиплексор
Про даташит то понятно, у меня именно с кодом СИ проблема. Сейчас атмега уменя посылает сигнал 0хСС1, при нажитии кнопки подключенной к АДЦ1, а мне нужно подключить к мультиплексору, чтоб она отправляла к примеру 0хС20 - 0хС27.
Про скорость. Сейчас опрос состояния выхода АДЦ1 происходит каждые 5мс. Мультиплексор отправляет данные о состоянии выхода "пакетами", тоесть сначала состояние первого, затем поочерёдно дописывая все остальные.
Теория 1: Если опрос одного входа мультиплексора происходит в момент опроса АДЦ1, то "пакет" отправится только через 8 циклов.
Теория 2: Опрос мультиплексором всех его входов происходит в момент опроса АЦП1. Тогда задержка будет тоже, так как моментально сформировать "пакет" он врядли сможет.
Теория 3: Частота опроса входов мультиплексора в разы больше частоты опроса состояния АДЦ1. Тогда "пакет" из восьми состояний мультиплексора будет передаваться при каждом опросе АДЦ1, соответственно можно судить об увеличении производительности входа АДЦ1 мультиплексора в 8 раз.
Какая из них верная, и ести ли она тут вообще?
Про скорость. Сейчас опрос состояния выхода АДЦ1 происходит каждые 5мс. Мультиплексор отправляет данные о состоянии выхода "пакетами", тоесть сначала состояние первого, затем поочерёдно дописывая все остальные.
Теория 1: Если опрос одного входа мультиплексора происходит в момент опроса АДЦ1, то "пакет" отправится только через 8 циклов.
Теория 2: Опрос мультиплексором всех его входов происходит в момент опроса АЦП1. Тогда задержка будет тоже, так как моментально сформировать "пакет" он врядли сможет.
Теория 3: Частота опроса входов мультиплексора в разы больше частоты опроса состояния АДЦ1. Тогда "пакет" из восьми состояний мультиплексора будет передаваться при каждом опросе АДЦ1, соответственно можно судить об увеличении производительности входа АДЦ1 мультиплексора в 8 раз.
Какая из них верная, и ести ли она тут вообще?
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: Atmega и мультиплексор
Я не понимаю. Либо вы что-то недоговариваете, либо вы не понимаете сущность мультиплексора. Мультиплексор никакие "пакеты" передавать не может. Он лишь коммутирует выводы.
Вы хоть объясните, что хотите сделать-то.
Вы хоть объясните, что хотите сделать-то.
Re: Atmega и мультиплексор
Как бы по короче. Есть устройство, отсылающее миди команды на компьютер. Комонда зависит от того, какая кнопка нажата. К АДЦ0 Атмеги подключен мультиплексор, который даёт 8 входов. Нужно подключить мультиплексоры к АДЦ1 - АДЦ5, так как входов не хватет, и возможно ли это вообще?
Re: Atmega и мультиплексор
Насколько знаю, МИДИ-сигнал не аналоговый, а цифровой - тогда при чём тут АЦП.. 
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Re: Atmega и мультиплексор
http://radiokot.ru/forum/viewtopic.php? ... &start=460
Вот она, нашёл наконец то...
Вот она, нашёл наконец то...
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Atmega и мультиплексор
Я думаю тут просто речь идет о миди-клавиатуре или чем-то подобном. Т.е. :кнопки (40 шт) -> 5х4051 -> АЦП меги -> протокол-миди в комп.
PS: А, ну так и есть...
PS: А, ну так и есть...
Последний раз редактировалось Engineer_Keen Вт янв 17, 2012 12:21:19, всего редактировалось 1 раз.
Re: Atmega и мультиплексор
Я был бы очень признателен если бы кто нибудь объяснил как происходит назначение адресов и опрос мультиплексора на примере этого проекта. Код программный там очень маленький.
Мне не просто сделать надо, я понять хочу, но информации очень мало в интернете (только одна ссылка с более менее, но не совсем понятным описанием).
На том же сайте есть исходники этого устройства. В самом низу находятся строки управляющие сигналами от мультиплексора. Если кому не трудно, напишите пожалуйста коментарии к ним (их там не много). Вам знающим прооще, а я уже третью неделю голову ломаю...
Мне не просто сделать надо, я понять хочу, но информации очень мало в интернете (только одна ссылка с более менее, но не совсем понятным описанием).
На том же сайте есть исходники этого устройства. В самом низу находятся строки управляющие сигналами от мультиплексора. Если кому не трудно, напишите пожалуйста коментарии к ним (их там не много). Вам знающим прооще, а я уже третью неделю голову ломаю...
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Atmega и мультиплексор
Конкретно про тот проект не могу сказать, но принцип элементарный.
1) Устанавливаем канал АЦП в регистре ADMUX
2) Устанавливаем конкретный адрес в 4051, выводом данных в порт МК, к которому подключены адресные линии 4051
3) Запускаем преобразование АЦП, читаем, обрабатываем.
4) Если надо меняем канал АЦП и\или адрес 4051, повторяем п.3
1) Устанавливаем канал АЦП в регистре ADMUX
2) Устанавливаем конкретный адрес в 4051, выводом данных в порт МК, к которому подключены адресные линии 4051
3) Запускаем преобразование АЦП, читаем, обрабатываем.
4) Если надо меняем канал АЦП и\или адрес 4051, повторяем п.3
Re: Atmega и мультиплексор
А на каком моменте происходит назначение адреса (типа 0хХХ) конкретному входу 4051?
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]
Re: Atmega и мультиплексор
А можете на примере этого проекта:
Жирным отмечены мои мысли
"Наклонным и подчёркнутым шрифтом" я отметил работу ЛСД (правильно?)./////////// 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 и мультиплексор
Почти. Установка канала АЦП происходит в процедуре чтения АЦП (int adc(uchar channel)), там channel маскируется числом 0х07 и заносится в ADMUX.isx писал(а): if (channel == 0) {
if (7 == mux_n) { mux_n = 0; } else { mux_n++; }
// Выставление адресов на мультиплексор. Я так понимаю channel == 0 это назначение АДЦ0.
Похоже на то.isx писал(а): PORTB &= 0b11100011;
PORTB |= mux_n << 2; // change mux input line PB4..PB2
_delay_ms(1); // Здесь я так понял назначаются А В и С мультиплексора на соответствующие выходы АтМеги.
Это чтение АЦПisx писал(а): value = adc(channel); // 0..1023 Проверка текущего состояния входов мультиплексора?
Видимо проверка не выходит ли разница между новым и старым значениями за пределы +-7 отсчетов АЦП. Если выходит, то старое значение меняется на новое. Наверно сделано для фильтрации.isx писал(а): // hysteresis
if (adcOld[channel+mux_n] - value > 7
|| adcOld[channel+mux_n] - value < -7) {
adcOld[channel+mux_n] = value; //Сравнение с прошлым состоянием, но процесс сам понять не смог..
Тут надо протокол миди ковырять чтобы понять смысл.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;
Просто изменение каналов и адресов подряд. Видимо мультиплексор подключен только к АЦП0, поэтому пока channel=0, меняются адреса (mux_n), а потом подряд меняются оставшиеся каналы АЦП.isx писал(а): if (channel == 0) {
if (7 == mux_n) { channel++; }
} else { channel++; }
if (6 == channel)
channel = 0; Зачем эти 5 строк вообще не представляю, особенно ввели в замешательство 6 == channel. Что они вообще значат?
Re: Atmega и мультиплексор
Могу ещё сказать, что на выходи при использовании входов мультиплексора выходят адреса 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 ?
Re: Atmega и мультиплексор
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 ?
Похоже я близок к разгадке
И ещё... В какой среде можно было бы забить эти данные и получить ответ?
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 ?
Похоже я близок к разгадке
И ещё... В какой среде можно было бы забить эти данные и получить ответ?



