Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Сб фев 24, 2024 15:22:13
Добрый день.
Уважаемые КОТы, помогите разобраться. Необходимо последовательно снять с сигнал с 2-х каналов микросхемки. если запускаешь один канал измернений (к примеру А0), то все четко снимает, точность поражает...а вот если снимаешь последовательно с нескольких каналов (например А0 потом А1) относительно GND, то показания выводит с последнего съема причем на оба канала... какой вторым поставишь , такой и будет... уже голову сломал, вроде все делаю по даташнику ... во вложении помещаю свой код. что я делаю неверно? Прикладные библиотеки управления индикаторами и I2C выкладывать нет смысла, они написаны по стандартному протоколу...
- Вложения
-
- main.c
- (1.64 KiB) Скачиваний: 15
-
- main.c
- (1.64 KiB) Скачиваний: 11
Сб фев 24, 2024 19:04:02
а подождать, пока закончится преобразование - это тебя не касается?
только запустил преобразование, и тут же пытаешься прочитать результат.
Сб фев 24, 2024 19:26:08
Вводил и ожидание до 100 млСек... Безрезультатно. Снял осцилограмы с даталинии, 3-й байт отличается от 12, значит конфигурационный байт отправляется корректно. К тому же ответка тоже отличается 8-9 байты отличаются от 17-18. если закомментировать одну из этих строчек
AMPERAGE = ADS1115(0) * 10;
VOLTAGE = ADS1115(1) * 2;
то все как и должно быть, преобразования происходят. Все отображается но только один параметр, а вот 2 последовательно не хотят... отображения последнего происходят...
Я тут внимательно просмотрел даташник, я совсем забыл за тайминг свичей мультиплексора... хотя там не сказано какой тайминг конкретно, но его то я не учел, вероятно поэтому последнее измерение и работает, так как после последнего обращения идет большая пауза и у мультиплексора есть время переключится а вот на первое обращение в стеке для переключения времени как раз и не хватает...на измерение нужно всего 8 мкСек они там есть(смотрел осликом... даже больше). Спасибо что намекнули на тайминги.
Сб фев 24, 2024 20:15:55
Не прерывайте I2c (
I2C_Stop();) между командами.
- Код:
...
I2C_SendByte(0b10000011); //младший конфигурационный байт
-> I2C_Stop();
I2C_Start();
I2C_SendByte(0b10010000);
I2C_SendByte(0b00000000);
I2C_Stop();
...
Попробуйте. Фрагмент кода ниже: из вашего кода. Не искал каких-либо несоответствий в данных.
Однако добавьте и время на преобразование.
- Код:
if (adress == 1)
{
I2C_Start();
I2C_SendByte(0b10010000);// передаем адрес устройства и бит записи
I2C_SendByte(0b00000001);// address pointer register определяем передачу конфигурационных регистров.
I2C_SendByte(0b11010101);//старший конфиг байт
I2C_SendByte(0b10000011); //младший конфигурационный байт
I2C_Stop();
I2C_Start();
I2C_SendByte(0b10010000);
I2C_SendByte(0b00000000);
I2C_Start();
I2C_SendByte(0b10010001);
x1 = I2C_ReadByte();//считывание старщего байта с АЦП
x2 = I2C_ReadLastByte();
I2C_Stop();
}
Ссылка:
https://www.ccsinfo.com/forum/viewtopic.php?t=56983- Код:
i2c_start(); // Configuration of registers
i2c_write(address);//address of device last bit R/W read=1 write=0
i2c_write(0x01);//address point Register 0x1
i2c_write(0x80);//Config register MSB 3rd bit 0- 0x80
i2c_write(0x83);//Config register LSB - 0x83
i2c_stop();
delay_ms(130);
i2c_start();
i2c_write(address);//address of device R/W
i2c_write(0x00);// 0x00
i2c_start();
i2c_write(address | 1); //0x91
msb=i2c_read();
lsb=i2c_read(0);
i2c_stop();
Сб фев 24, 2024 20:41:05
Витаха писал(а):на измерение нужно всего 8 мкСек
где ты такое нашел?
Витаха писал(а):Вводил и ожидание до 100 млСек... Безрезультатно.
без ожидания окончания преобразования точно будет безрезультатно.
Сб фев 24, 2024 20:48:10
The ADS111x offer programmable output data rates. Use the DR[2:0] bits in the Config register to select output
data rates of 8 SPS, 16 SPS, 32 SPS, 64 SPS, 128 SPS, 250 SPS, 475 SPS, or 860 SPS.
Conversions in the ADS111x settle within a single cycle; thus, the conversion time is equal to 1 / DR.
Да, и время относительно велико.
SPS - samples per second
Сб фев 24, 2024 21:00:48
veso74 писал(а):где ты такое нашел?
Даташник стр 19
Добавлено after 5 minutes 35 seconds:veso74 писал(а):Да, и время относительно велико.
SPS - samples per second
The ADS111x offer programmable output data rates. Use the DR[2:0] bits in the Config register to select output
data rates of 8 SPS, 16 SPS, 32 SPS, 64 SPS, 128 SPS, 250 SPS, 475 SPS, or 860 SPS.
Conversions in the ADS111x settle within a single cycle; thus, the conversion time is equal to 1 / DR.
Да, и время относительно велико.
SPS - samples per second
Я использую 64 измерения в секунду, это и визуально комфортно, и точность на приемлемом уровне
Добавлено after 2 minutes 16 seconds:Re: ADS1115_ATMEGA8 Не работают последовательно каналы измеренийПарни, спасибо, что откликнулись. Я тут человек новый, еще не сориентировался с интерфейсом форума. Попробую тайминги проставить. Надеюсь поможет.
Добавлено after 2 minutes 2 seconds:Re: ADS1115_ATMEGA8 Не работают последовательно каналы измеренийКстати, прерывания в даташнике опять же, я все делаю по даташиту(во всяком случае стараюсь) Там есть диаграммы чтения и записи, я по ним писал.
- Вложения
-
- Безымянный.jpg
- (42.08 KiB) Скачиваний: 17
Сб фев 24, 2024 21:18:55
Витаха писал(а):Даташник стр 19
это длительность сигнала ALERT/RDY, а не время преобразования.
veso74 писал(а):the conversion time is equal to 1 / DR.
для твоих 64 измерений в секунду время преобразования равно 1 / 64 = 0,015625 сек, или 15,625 мсек.
Добавлено after 11 minutes 18 seconds:Re: ADS1115_ATMEGA8 Не работают последовательно каналы измеренийда, и я в твоем тексте вижу 128 SPS, а не 64.
Сб фев 24, 2024 21:22:33
Да, спасибо, уже прочитал. а "в моем случае" то я экспериментировал. Вообще я использую 64. Значит поставлю 20 млСек. Надеюсь не очень сильно отобразится на скорости... Либо увеличу скорость...
Вс фев 25, 2024 08:01:35
у тебя прерывание таймера по переполнению происходит гораздо чаще, чем длится одно измерение. а в прерывании должно пройти 2 измерения.
если на одно измерение сделать задержку 20 мс, то, с запасом, нужно прерывание таймера сделать через 50 мс.
Вс фев 25, 2024 13:44:01
Парни, всем спасибо за участие, все получилось... Правда почему-то заработало при 64 Гц опросе задержка 80 млСек, глянул на осциллограмму и прослезился. Там сплошные пропуски. Видимо прерывания семисегментника накладываются на прерывания по 16-ти битному таймеру плюс задержки , и таймера срывают I2c передачу. видимо придется ставить 2 МК один чтоб рулил семисегментниками в режиме слейва, и по I2C принимал циферки, которые нужно выводить и тогда все будет гуд.
Вс фев 25, 2024 14:04:22
Вариант: подключите семисегментные индикаторы к TM1637, MAX7219 и т.п.
Вс фев 25, 2024 14:44:27
Витаха, у тебя пока не закончит работу прерывание по TIMER1_OVF, никакое прерывание для семисегментника не начнется. вот и имеешь большие пропуски.
не в обиду будет сказано, но твой код называется говнокод.
и от себя добавлю - не просто, а в квадрате.
Пн фев 26, 2024 08:59:25
Витаха, у тебя пока не закончит работу прерывание по TIMER1_OVF, никакое прерывание для семисегментника не начнется. вот и имеешь большие пропуски.
не в обиду будет сказано, но твой код называется говнокод.
и от себя добавлю - не просто, а в квадрате.
Я это понимаю, я только начал освоение микроконтроллеров, это , можно сказать, мое четвертое устройство. Но я научусь. Разберусь обязательно. До этого я 30 лет не писал программы, и с Си столкнулся впервые. еще год назад для меня микроконтроллер это была магия... сейчас я погряз по уши в ЮАРТ СПАЙ, И2С, таймеры, прерывания и т д... Это очень мне интересно))))
На Счет ТМ1637, и МAXIM, хорошие микросхемы, но их нужно покупать, ТМ1637 не подходит, она максимум для 6 разрядов, проще подключить к отдельному МК, коих у меня лежат сейчас в загашнике(Закупился при случае подешевке). И по тойже И2С передавать. теперь вопрос , как сделать чтоб вторая мега была слейвом? Буду разбираться. Спасибо всем, теперь я знаю немного больше...
Вт фев 27, 2024 11:29:33
Витаха, чтобы МК мог делать другую работу (например, обрабатывать индикацию), нельзя в прерывании таймера ждать окончания всех преобразований по АЦП.
в моих изделиях в прерывании таймера сначала читается результат преобразования по одному каналу и потом запускается преобразование по другому каналу.
понятно, что интервал таймера должен превышать время преобразования, чтобы к следующему прерыванию преобразование гарантированно закончилось.
но для этого нужна переменная, которая определяет очередность каналов, и нужно в main после всей инициализации запустить преобразование первого канала.
в прерывании после чтения результата изменяем переменную, определяющую номер канала, результат которого нужно считывать, и запускаем преобразование с другим номером канала.
таким образом, прерывание от таймера работает короткое время, и не мешает другой работе, в том числе такой, как своевременное обслуживание индикации.
Ср фев 28, 2024 12:21:41
ещё добавлю, если не хочется, чтобы прерывание индикации помешали критичному процессу (например передаче данных) - можно этот процесс начинать сразу за переключением индикатора - тогда на передачу будет гарантированный кусок свободного от прерываний таймера времени...
если время передачи больше времени между сменой разрядов индикации - можно процесс притормозить в некритичном для передачи месте
можно, конечно и прерывания отключать, но мигающий экран - зрелище неэстетичное
сам когда делаю устройства с дин. индикацией - эту самую индикацию и использую как арбитр процессов
Вт мар 12, 2024 12:28:21
Все сделал. За динамическую индикацию отвечает один камушек(закупился на али по дешевке), за ацп другой. все нормально работает, все успевает... Всем спасибо за участие. Ребята, вы очень помогли. я только в начале пути освоения микроконтроллеров....
Ср мар 13, 2024 09:25:01
понятно, моя подсказка впрок не пошла.
а это всё легко делается на одном камушке...
Сб мар 30, 2024 07:48:03
Вообще любая программа для МК без ос включает обычно минимум две части: источники событий и цикл обработки событий.
Источники событий это обычно то, что делается в прерываниях, а обработчики - в фоновом цикле.
Это позволяет очень сильно разгрузить прерывания.
И уж точно делать обмен по i2c или spi с ожиданием в прерывании не стоит.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.