Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
09.01.2012, 19:22
|
|
Частый гость
Регистрация: 13.02.2011
Сообщений: 22
Сказал спасибо: 41
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Помогите начинающему с АЦП MCP3421
Здраствуйте. Я новичок-любитель в МП-програмировании и пока что еще учусь, поэтому нужна помощь профи!!
Задача состоит в подключении АЦП (MCP3421) к ATMEGA8 и через I2C правильно считать информацию с АЦП. Но пока что не получаеться правильно отладить считывание данных.
Вот есть функции для использования I2C но не понятно что за переменные должны быть заместь unsigned char, на что и ругаеться компилятор (CodeVisonAVR). Подскажите как правильно это сделать или где это можно узнать.
Код:
|
i2c_start();
i2c_write(unsigned char);
i2c_read(unsigned char);
i2c_stop(); |
Прошу строго не судить.
Заранее спасибо.
|
|
|
|
09.01.2012, 19:41
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Помогите начинающему с АЦП MCP3421
А что, CV AVR программу не написала?
...странно как-то...
|
|
|
Сказали "Спасибо" omercury
|
|
|
10.01.2012, 09:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Помогите начинающему с АЦП MCP3421
Сообщение от KruBoHic
|
unsigned char
|
Сюда .
|
|
|
Сказали "Спасибо" omercury
|
|
|
10.01.2012, 21:24
|
|
Частый гость
Регистрация: 13.02.2011
Сообщений: 22
Сказал спасибо: 41
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помогите начинающему с АЦП MCP3421
Исходя из
Цитата:
|
unsigned char i2c_read(unsigned char ack)
reads a byte from the bus.
The ack parameter specifies if an acknowledgement is to be issued after the byte was read.
Set ack to 0 for no acknowledgement or 1 for acknowledgement.
|
использовал следующий код
Код:
|
int t;
i2c_start();
t = i2c_read(1);
i2c_stop(); |
Но в результате с АЦП так не чего и не получил (пробовал i2c_read(1) и i2c_read(0) ).
Хотя на осцилографе пакет даных постоянно отправляеться.
Что не так делаю???
|
|
|
|
11.01.2012, 00:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Помогите начинающему с АЦП MCP3421
Сначала неплохо бы проинициализировать MCP3421, задать режимы работы, дать команду на считывание и уж потом пытаться что-то читать из неё...
Не всё, увы, так просто...
Вот здесь есть доки на АЦП и аппнот (AN1156) по использованию подобных АЦП...
Должно спасти положение.
P.S. А встроенного АЦП недостаточно?
Последний раз редактировалось omercury; 11.01.2012 в 01:04.
|
|
|
Сказали "Спасибо" omercury
|
|
|
11.01.2012, 01:25
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Помогите начинающему с АЦП MCP3421
В дейташите на MCP3421 на стр.20 приведён пример чтения микросхемы.
Так вот, для того, чтобы прочитать 3 байта результата преобразования (18-bit) нужно сделать следующее:
Код:
|
i2c_start(); - начало процедуры I2C
i2c_write(0xD1); - запись адреса АЦП + запрос на чтение
resH = i2c_read(1); - чтение старшего байта результата
resM = i2c_read(1); - чтение среднего байта результата
resL = i2c_read(0); - чтение младшего байта результата
i2c_stop(); - конец процедуры I2C |
Но для получения результата надо сначала стартовать само преобразование в АЦП.
Для настройки и старта АЦП нужно записать определённый байт в регистр конфигурации MCP3421. Для этого нужно:
Код:
|
i2c_start(); - начало процедуры I2C
i2c_write(0xD0); - запись адреса АЦП + запрос на запись
i2c_write(config); - запись байта конфигурации + старт
i2c_stop(); - конец процедуры I2C |
По истечении определённого времени АЦП-преобразование закончится и можно его считывать, как указано в начале поста.
Последний раз редактировалось Yurkin2007; 11.01.2012 в 01:40.
|
|
|
Сказали "Спасибо" Yurkin2007
|
|
|
12.01.2012, 18:59
|
|
Частый гость
Регистрация: 13.02.2011
Сообщений: 22
Сказал спасибо: 41
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помогите начинающему с АЦП MCP3421
Исходя из дейташит, выбрал config равный 10011111 = 0x9F. Пока что не уверен в правильности (хотя АЦП заработал и отсылает пакеты информации) потому как не могу проверить окончательный результат. Причина в том что не понимаю как получить из 3-х байт ( resH, resM, resL) результата пребразования АЦП одно число!!!
Подскажите .
|
|
|
|
12.01.2012, 19:10
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Помогите начинающему с АЦП MCP3421
Код:
|
Result = ((0x03 & resH) ‹‹16) + (resM‹‹8) + resL; |
|
|
|
Сказали "Спасибо" Yurkin2007
|
|
|
15.01.2012, 17:50
|
|
Частый гость
Регистрация: 13.02.2011
Сообщений: 22
Сказал спасибо: 41
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помогите начинающему с АЦП MCP3421
Попробовал вывести результат Result на терминал через UART, но в итоге на выходе получил непонятно что (рис.1), хотя если выводить результирующие байты ( resH, resM, resL) по отдельности, - получаються численные значения (но это тоже не к чему не привело). Перепробовал разные варианты вывода, разные конфигурации АЦП но в итоге одно и тоже. Может я не правильно понимаю какое значение должно быть в результате или его нужно еще как то конвертировать что бы получить свои вольты.
рис.1
рис.2
Код:
|
i2c_start(); // начало процедуры I2C
i2c_write(0xD0); // запись адреса АЦП + запрос на запись
i2c_write(0x90); // запись байта конфигурации + старт
i2c_stop(); // конец процедуры I2C
while (1)
{
i2c_start(); // начало процедуры I2C
i2c_write(0xD1); // запись адреса АЦП + запрос на чтение
resH = i2c_read(1); // чтение старшего байта результата
resM = i2c_read(1); // чтение среднего байта результата
resL = i2c_read(0); // чтение младшего байта результата
i2c_stop(); // конец процедуры I2C
Result = ((0x03 & resH) ‹‹16) + (resM‹‹8) + resL;
t = Result;
a=t/1000000; // Виділити старший розряд t
b=(t-(a*1000000))/100000; // Виділити молодший розряд t
c=(t-(a*1000000)-(b*100000))/10000; // Виділити молодший розряд t
d=(t-(a*1000000)-(b*100000)-(c*10000))/1000; // Виділити молодший розряд t
e=(t-(a*1000000)-(b*100000)-(c*10000)-(d*1000))/100; // Виділити молодший розряд t
g=(t-(a*1000000)-(b*100000)-(c*10000)-(d*1000)-(e*100))/10; // Виділити молодший розряд t
j=(t-(a*1000000)-(b*100000)-(c*10000)-(d*1000)-(e*100)-(g*10))/1; // Виділити молодший розряд t
putchar(a+0x30); // Вивести на термінал старший розряд Т
putchar(b+0x30); // Вивести на термінал молодший розряд Т
putchar(c+0x30); // Вивести на термінал молодший розряд Т
putchar(d+0x30); // Вивести на термінал молодший розряд Т
putchar(e+0x30); // Вивести на термінал молодший розряд Т
putchar(g+0x30); // Вивести на термінал молодший розряд Т
putchar(j+0x30); // Вивести на термінал молодший розряд Т
putsf(" \r");
} |
P.S.: Огромная благодарность Yurkin2007 за помощь и подсказки по даной теме.
|
|
|
|
15.01.2012, 18:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 8,003
Сказал спасибо: 0
Сказали Спасибо 4,946 раз(а) в 2,374 сообщении(ях)
|
Re: Помогите начинающему с АЦП MCP3421
KruBoHic,
а в железе, на макетке, что получается?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Помогите начинающему по ATmega8515
|
Vladlen23 |
Микроконтроллеры, АЦП, память и т.д |
510 |
27.03.2012 06:08 |
помогите начинающему по WinAVR
|
umkamaks |
Микроконтроллеры, АЦП, память и т.д |
4 |
05.05.2010 21:01 |
Помогите начинающему!
|
kolira |
Микроконтроллеры, АЦП, память и т.д |
6 |
30.01.2010 15:22 |
Помогите начинающему с внешним АЦП
|
VadimL |
Микроконтроллеры, АЦП, память и т.д |
0 |
09.07.2009 15:03 |
Помогите начинающему!!!!
|
sma-etu |
Микроконтроллеры, АЦП, память и т.д |
2 |
13.12.2006 18:31 |
Часовой пояс GMT +4, время: 18:22.
|
|