Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATmega8A + ADS1244
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
pavel-pervomaysk
Всем привет.
Не получается правильно состыковать эти 2 чипа.

CODE
.equ ads_port = PORTD //
.equ ads_pin = PIND //
.equ ads_ddr = DDRD //
// Распиновка ног
.equ ads_clk = PD3 // Serial Clock Output
.equ ads_di = PD4 // Serial Data Input


read_ads: // чтение
sbi ads_port,ads_clk // CLK -> 1 импульс
nop
nop
nop
cbi ads_port,ads_clk // CLK -> 0
nop
nop
nop
ads_wait: //
sbic ads_pin,ads_di //
rjmp ads_wait //
ads_start: //
ldi loop2,3 //
ldi yl,low (ads_h) //
ldi yh,high(ads_h) //
result: //
rcall ads1244 //
st Y+,data //
dec loop2 //
brne result //

sbi ads_port,ads_clk // CLK -> 1 импульс
nop
nop
nop
cbi ads_port,ads_clk // CLK -> 0
nop
nop
nop

ret //

ads1244: //
clr data // очищаем регистр перед приемом байта
ldi loop,8 // bit counter
read_ads_c: // цикл
lsl data // data << 1
sbi ads_port,ads_clk // CLK -> 1 импульс
nop
nop
nop
cbi ads_port,ads_clk // CLK -> 0
nop
nop
nop
sbic ads_pin,ads_di // Пропускаем следующую команду, если на входе Di низкий уровень
inc data // data = + 1
dec loop // bit counter - 1
brne read_ads_c // если счетчик цикла > 0, переходим к началу цикла
ret // выход



Это код для чтения АЦП.
Читает мусор. Возможно из-за того что неверно входы АЦП подключил...

Прикрепляю схему, сделал на отдельной платке. Частота опорника 4,3320 МГц, 2,4576 МГц у меня пока нет...
Как подключить ноги АЦП AINN AINP чтобы мерить постоянное напряжение ?



ILYAUL
QUOTE (Павлик @ Oct 3 2011, 14:57) *
Как подключить ноги АЦП AINN AINP чтобы мерить постоянное напряжение ?


Из даташит
When measuring unipolar (or ”single-ended” signals) with respect toground, connect the negative input (AINN) to ground and
connect the input signal to the positive input (AINP).

И всё таки купите System Clock Input: Typically 2.4576MHz.

pavel-pervomaysk
Посадил AINN на землю , AINP оставил подтяжку на корпус 10к + 10n.
Читаю 3 байта после того, ка на DOUT будет лог. 0, получаю мусор ...
Может кто работал с этой микросхемой и есть свои особенности ?
Палыч
Цитата(Павлик @ Oct 3 2011, 18:43) *
AINP оставил подтяжку на корпус 10к + 10n.
Подтяжку - для чего/с какой целью? Измеряемый сигнал Вы куда подаёте?

Цитата(Павлик @ Oct 3 2011, 18:43) *
Читаю 3 байта после того, ка на DOUT будет лог. 0, получаю мусор ...
Точно: читаете 3 байта? В программе, текст которой приведен в первом посте - только 8 бит (1 байт).
Зачем выдаёте импульс на SCLK в начале чтения, перед ожиданием низкого уровня на DRDY? Для того, чтобы DRDY поднялся в единицу? Для этого: по окончанию чтения трёх байт (24 бит) нужно выдать двадцать пятый импульс в соответствии с рисунком 13 из DS. Т.е. импульс в начале - перенести на "после чтения" результата.
ILYAUL
QUOTE (Палыч @ Oct 3 2011, 20:07) *
Для этого: по окончанию чтения трёх байт (24 бит) нужно выдать двадцать пятый импульс в соответствии с рисунком 13 из DS. Т.е. импульс в начале - перенести на "после чтения" результата.

Вот я тоже над этим думал. У него нет выхода из подпрограммы ADS1244 (нормального) . Поэтому прога просто "вылетает" на начало READ_ADS: после всех подсчётов и первый неожидано для себя становится последним.
Кстати какой кварц у проца и выдерживаются тайминги SPI?

QUOTE
Точно: читаете 3 байта? В программе, текст которой приведен в первом посте - только 8 бит (1 байт).


По идее точно . Из подпрограммы он возвращается на st.... где вычитает другой счётчик до 3 и возвращается в ads1244. Где -то как-то протокол обмена выдержан, если в ads1244 поставить ret , а вместо непонятного ret - rjmp ads wait:
pavel-pervomaysk
Читаю как раз 3 байта верно, а не 1 байт.
Ошибка была при инициализации линии CLK , включена была подтяжка, АЦП было в режиме sleep.
Устранил, сделал просто.

Частоту МК ставил 1 МГц, 8МГц, 16,93МГц. Делал задержки между клоками, результат одинаков.
Скрин анализатора прикрепляю.

CODE
read_ads: // чтение
sbic ads_pin,ads_di //
rjmp read_ads //
rcall ads1244 //
sts ads_h,data //
rcall ads1244 //
sts ads_m,data //
rcall ads1244 //
sts ads_l,data //
sbi ads_port,ads_clk // CLK -> 1 импульс
nop
nop
nop
cbi ads_port,ads_clk // CLK -> 0
ads_wait2: //
sbis ads_pin,ads_di //
rjmp ads_wait2 //
ret //


ads1244: //
clr data // очищаем регистр перед приемом байта
ldi loop,8 // bit counter
read_ads_c: // цикл
lsl data // data << 1
sbi ads_port,ads_clk // CLK -> 1 импульс
nop
nop
nop
cbi ads_port,ads_clk // CLK -> 0
nop
nop
nop
sbic ads_pin,ads_di // Пропускаем следующую команду, если на входе Di низкий уровень
inc data // data = + 1
dec loop // bit counter - 1
brne read_ads_c // если счетчик цикла > 0, переходим к началу цикла
ret // выход


ILYAUL
1. Чётко посадите оба входа на GND
2. Частота на SCLK должна представлят ЧЁТКИЙ меандр. т.к правильные данные появляются только через 50 нс после положительного фронта. Поэтому Вам надо строго придерживаться меандра.
3. После подачи положительного фронта 24 импульса - оставьте его в этом состоянии и посмотрите данные. Должны быть 000.
4. Подайте Ваше питание 5В на положительный вход
5. Сбросьте SCLK в ноль - дождитесь DOUT прочитайте - на "выходе" должно быть FFF

NOP - добавьте или удалите для получения меандра, это зависит от времени которое затратит МК на команды. Например SBIS SBIC -1 или 3 такта
, CLR один такт. RET - естесвенно не считать
CODE
ads1244:                 //
     clr    data              // очищаем регистр перед приемом байта
     ldi    loop,8            // bit counter
     read_ads_c:              // цикл
     sbi    ads_port,ads_clk  // CLK -> 1 импульс
     nop
     nop
     nop
     nop ;;; Где здесь должны появиться данные
     nop
     nop
     nop
     nop
     cbi    ads_port,ads_clk  // CLK -> 0
     sbic   ads_pin,ads_di    // Пропускаем следующую команду, если на входе Di низкий уровень
     inc    data              // data = + 1
     lsl    data              // data << 1  
     dec    loop              // bit counter - 1
    brne   read_ads_c        // если счетчик цикла > 0, переходим к началу цикла
    ret                      // выход
pavel-pervomaysk
2. Полный бред, такое первый раз слышу biggrin.gif .
Проблему нашел, дело было в кривых руках ...
Точнее, делитель сигнала CLK, перепутал резисторы, поставил на место и все работает.
Судя по ДШ на АЦП данные появляются после первого спада, а не фронта как советовали выше.

Всем спасибо.
Для архива, может кому понадобится.
Частота Атмеги 16,9344 МГц.

CODE
// Модуль для работы с ADS1244
// Размер данных 24 бит (Только чтение)

// Инициализация пинов сдесь ставим свои данные
.equ ads_port = PORTD //
.equ ads_pin = PIND //
.equ ads_ddr = DDRD //
// Распиновка ног
.equ ads_clk = PD3 // Serial Clock Output
.equ ads_di = PD4 // Serial Data Input





read_ads: // чтение
sbic ads_pin,ads_di //
rjmp read_ads //
rcall ads1244 //
sts ads_h,data //
rcall ads1244 //
sts ads_m,data //
rcall ads1244 //
sts ads_l,data //
sbi ads_port,ads_clk // CLK -> 1 25ц импульс
nop
nop
nop
cbi ads_port,ads_clk // CLK -> 0
ret //


ads1244: // чтение байта с ADS1244
clr data // очищаем регистр перед приемом байта
ldi loop,8 // bit counter
read_ads_c: // цикл
lsl data // data << 1
sbi ads_port,ads_clk // CLK -> 1 импульс
nop
nop
nop
cbi ads_port,ads_clk // CLK -> 0
nop
nop
nop
sbic ads_pin,ads_di // Пропускаем следующую команду, если на входе Di низкий уровень
inc data // data = + 1
dec loop // bit counter - 1
brne read_ads_c // если счетчик цикла > 0, переходим к началу цикла
ret // выход
ILYAUL
QUOTE (Павлик @ Oct 4 2011, 12:02) *
Судя по ДШ на АЦП данные появляются после первого спада, а не фронта как советовали выше.

Полный бред - Внимательно изучите Fig 12 особенно время t5 да и вообще все таймиги которые там приведены - очень полезно и если Вы внимательно посмотрите мой код , то данные там считываются по спаду.
pavel-pervomaysk
t5 = 50ns, но зачем заморачиваться, если четкий выход есть после спада ?
ILYAUL
QUOTE (Павлик @ Oct 4 2011, 18:03) *
t5 = 50ns, но зачем заморачиваться, если четкий выход есть после спада ?

А если у Вас спал через 49,9 ns . Все тайминги производитель даёт не просто так , а гарантирует , что при их соблюдении устройство соответствует своим техническим характеристикам и для разработчика всё становится значительно проще , если он уверен в том , что соблюдает все условия работы устройства. Поиск возникших проблем значительно сокращается.
pavel-pervomaysk
При моей тактовой менее 60ns не получится никак.
Но мне интерестно от куда вывод про четкий меандр клока взят, тоже из ДШ на АЦП ?
ILYAUL
QUOTE (Павлик @ Oct 4 2011, 19:08) *
При моей тактовой менее 60ns не получится никак.
Но мне интерестно от куда вывод про четкий меандр клока взят, тоже из ДШ на АЦП ?

B с той же картинки
pavel-pervomaysk
Там такого не написано, так что не будем об этом.
В итоге скажу что именно ADS1244 фуфло, 24 бита, реально по дш обещают 20, в итоге имеем 15 бит с трудом.
ILYAUL
QUOTE (Павлик @ Oct 5 2011, 09:55) *
Там такого не написано, так что не будем об этом.
В итоге скажу что именно ADS1244 фуфло, 24 бита, реально по дш обещают 20, в итоге имеем 15 бит с трудом.

t4 = 100 ns для положительной и отрицательной длительности импульса.
Попробуйте поставить рекомендуемый ими кварц и ещё раз проверьте разрядность данных
pavel-pervomaysk
Попробую позже, кварц на 2,4576 стоит зараза 1,25$ .
Но все таки имея 4 АЦП прийдется их использовать по назначению.
Результат отпишу.
777777
Цитата(Павлик @ Oct 5 2011, 09:55) *
В итоге скажу что именно ADS1244 фуфло, 24 бита, реально по дш обещают 20, в итоге имеем 15 бит с трудом.

Боюсь, что "дело было не в бобине"...

Не знаю как там у вас с обычными средствами устранения шумов - толстые земли, конденсаторы по питанию, ликвидация паразитных токов по земле и т.п. - но главной частью сигма-дельта АЦП является его цифровой фильтр. И его настройка является главной задачей разработчика. Вы же на него плюнули (т.к. поставили первый попавшийся кварц) после чего заявляете что этот АЦП - фуфло.
pavel-pervomaysk
NOTES: (1) Load on DRDY/DOUT = 20pF || 100kΩ. (2) Values given for fCLK = 2.4576MHz. For different
CLK frequencies, scale proportional to CLK period. For example, for fCLK = 4.9152MHz, t8 → 33.333ms.

тоесть можно смело цеплять 4.9152MHz и все должно работать, запас по частоте есть.
Выводы AINP AINN вместе закорочены на корпус, по питанию 5 вольт стоит тантал 10мКф, по питанию 3,3 вольт стоит тантал 47 мКф, 100нан по питанию стоят везде как и нужно, четкий ноль на выходе не наблюдается.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.