|
ATmega8A + ADS1244, Не могу подключить АЦП |
|
|
|
Oct 3 2011, 10:57
|

Местный
  
Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716

|
Всем привет. Не получается правильно состыковать эти 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 чтобы мерить постоянное напряжение ?
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 3 2011, 14:21
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
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.
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Oct 3 2011, 16:07
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Павлик @ 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. Т.е. импульс в начале - перенести на "после чтения" результата.
|
|
|
|
|
Oct 3 2011, 16:23
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
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:
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Oct 3 2011, 18:51
|

Местный
  
Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716

|
Читаю как раз 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 // выход
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 3 2011, 21:34
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
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 // выход
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Oct 4 2011, 08:02
|

Местный
  
Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716

|
2. Полный бред, такое первый раз слышу  . Проблему нашел, дело было в кривых руках ... Точнее, делитель сигнала 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 // выход
Сообщение отредактировал Павлик - Oct 4 2011, 08:05
|
|
|
|
|
Oct 4 2011, 14:13
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
QUOTE (Павлик @ Oct 4 2011, 18:03)  t5 = 50ns, но зачем заморачиваться, если четкий выход есть после спада ? А если у Вас спал через 49,9 ns . Все тайминги производитель даёт не просто так , а гарантирует , что при их соблюдении устройство соответствует своим техническим характеристикам и для разработчика всё становится значительно проще , если он уверен в том , что соблюдает все условия работы устройства. Поиск возникших проблем значительно сокращается.
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|