Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
23.03.2007, 14:08
|
|
Частый гость
Регистрация: 18.07.2006
Сообщений: 17
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Опрос АЦП через программный SPI AVR
Описание:
Необходимо опрашивать два последовательных АЦП (AD7476) одновременно (чем меньше задержка, тем лучше).
Попробовал переделать код от ATMELa:
//START 1
asm("cbi 0x15,5");//SCK to "0"
asm("sbic 0x13,4");//бит по первому каналу
asm("inc %Il");
asm("sbic 0x13,2");//бит по второму каналу
asm("inc %Ul");
asm("sbi 0x15,5");//SCK to "1"
asm("lsl %Il");
asm("rol %Ih");
asm("lsl %Ul");
asm("rol %Uh");
//и так 16 раз
Проблема: не работает, блин. По одному из каналов показывает число в два раза больше(сдвиг влево, наверное)
Вопрос: обычный, что делать?
__________________
Кривые руки компенсируются прямыми извилинами
|
|
|
|
23.03.2007, 15:57
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,955
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Re: Опрос АЦП через программный SPI AVR
Сообщение от Iamuser
|
Проблема: не работает, блин. По одному из каналов показывает число в два раза больше(сдвиг влево, наверное)
Вопрос: обычный, что делать?
|
Почитать даташит.
1) считывание надо делать не по спаду, а по фронту
2) последний 16-й такт - данные не брать
3) ну и наверное - сперва сдвигать, потом inc.
-- Прилагается рисунок: --
|
|
|
|
23.03.2007, 16:25
|
|
Частый гость
Регистрация: 18.07.2006
Сообщений: 17
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Ув.nml
Делал так:
asm("sbic 0x13,4");
asm("inc %Il");
asm("sbic 0x13,2");
asm("inc %Ul");
//Повтор следующей части
asm("cbi 0x15,5");//SCK to "0"
asm("lsl %Il");
asm("rol %Ih");
asm("lsl %Ul");
asm("rol %Uh");
asm("sbi 0x15,5");//SCK to "1"
asm("sbic 0x13,4");
asm("inc %Il");
asm("sbic 0x13,2");
asm("inc %Ul");
---------------
Все равно не работает, только сбой сразу в обоих каналах.
В ступор вводит тот факт что один АЦП опрашивается правильно. Проблема может быть в временах SPI?
Подскажите пожалуйста, в какой момент времени считывать данные и как долго они будут держаться после фронта? И если не трудно, объясните пожалуйста разницу между временами t4 и t7.
Даташит читаю уже несколько дней. Указанную Вами страничку распечатал и повесил рядом с монитором.
__________________
Кривые руки компенсируются прямыми извилинами
|
|
|
|
23.03.2007, 17:04
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,955
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Сообщение от Iamuser
|
В ступор вводит тот факт что один АЦП опрашивается правильно. Проблема может быть в временах SPI?
Подскажите пожалуйста, в какой момент времени считывать данные и как долго они будут держаться после фронта? И если не трудно, объясните пожалуйста разницу между временами t4 и t7.
|
Данные выставляются по переходу в 0, и держатся до следующего перехода в 0. Потому их и читать по переходу в 1 - в это время они уж точно действительны. И тогда наплевать на t4 и t7... Разбираться с ними лениво и смысла нету.
|
|
|
|
23.03.2007, 17:57
|
|
Частый гость
Регистрация: 18.07.2006
Сообщений: 17
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Подправил программу, кажется работает. Результат можно назвать 15-разрядным двуканальным SPI-приемником. Почему 15 а не 16, незнаю, ну и ладно. Главное что работает.
nml, большое спасибо!
Конечный код (если кому надо):
CLI();
asm("eor %Il,%Il");//Il=0
asm("eor %Ih,%Ih");//Ih=0
asm("eor %Ul,%Ul");//Ul=0
asm("eor %Uh,%Uh");//Uh=0
asm("cbi 0x15,3");//CS to "0"
//START 1
asm("cbi 0x15,5");//SCK to "0"
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("sbi 0x15,5");//SCK to "1"
asm("sbic 0x13,4");
asm("inc %Il");
asm("sbic 0x13,2");
asm("inc %Ul");
//START 2
asm("cbi 0x15,5");//SCK to "0"
asm("lsl %Il");
asm("rol %Ih");
asm("lsl %Ul");
asm("rol %Uh");
asm("sbi 0x15,5");//SCK to "1"
asm("sbic 0x13,4");
asm("inc %Il");
asm("sbic 0x13,2");
asm("inc %Ul");
//START 3
//то же что и START2
//START 4
//то же что и START2
//START 5
//то же что и START2
//START 6
//то же что и START2
//START 7
//то же что и START2
//START 8
//то же что и START2
//START 9
//то же что и START2
//START 10
//то же что и START2
//START 11
//то же что и START2
//START 12
//то же что и START2
//START 13
//то же что и START2
//START 14
//то же что и START2
//START 15
//то же что и START2
asm("cbi 0x15,5");//SCK to "0"
asm("lsl %Il");
asm("rol %Ih");
asm("lsl %Ul");
asm("rol %Uh");
asm("sbi 0x15,5");//SCK to "1"
asm("sbic 0x13,4");
asm("inc %Il");
asm("sbic 0x13,2");
asm("inc %Ul");
//START 16
asm("cbi 0x15,5");//SCK to "0"
asm("sbi 0x15,5");//SCK to "1"
asm("sbi 0x15,3");//CS to "1"
I=Ih*0xFF+Il;
U=Uh*0xFF+Ul;
SEI();
__________________
Кривые руки компенсируются прямыми извилинами
|
|
|
|
23.03.2007, 18:06
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,955
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Сообщение от Iamuser
|
Подправил программу, кажется работает. Результат можно назвать 15-разрядным двуканальным SPI-приемником. Почему 15 а не 16, незнаю, ну и ладно. Главное что работает.
|
Я только одного не пойму - зачем там ассемблерные вставки. Нормальный компилятор кода лишнего не насует, а читаться будет куда легче.
|
|
|
|
23.03.2007, 18:15
|
|
Частый гость
Регистрация: 18.07.2006
Сообщений: 17
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
1. Си знаю чють хуже, чем хотелось бы.
2. Дальше вычисляю мощность, написал пару строчек 16-разрядного умножителя (16р*16р=16р), типа такого:
Код:
|
p=Uh*Il+Ul*Ih;
asm("mul %Il,%Ul");
asm("mov %Il,R1");
asm("mul %Ih,%Uh");
asm("mov %Ih,R0");
p=p+Il+Ih*0xFF; |
Как это сделать на Си,читать нехочется. Язык конечно хороший, только навороченный.
__________________
Кривые руки компенсируются прямыми извилинами
|
|
|
|
23.03.2007, 18:29
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,955
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Сообщение от Iamuser
|
Как это сделать на Си,читать нехочется.
|
А придется... ![Весело](images/smilies/icon_laugh.gif)
На Си это напишется просто.
|
|
|
|
23.03.2007, 18:33
|
|
Частый гость
Регистрация: 18.07.2006
Сообщений: 17
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Ага, результат будет 32битный, потом нужно сдвигать или делить.
А мне нужно будет их потом 10мс/20мкс штук сложить, в unsigned Long не влезет:(
__________________
Кривые руки компенсируются прямыми извилинами
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:12.
|
|