#1 2015-02-26 14:25:16

3.14e
Участник
Зарегистрирован: 2015-02-26
Сообщений: 2

Тотальное недопонимание

Добрый день, от безысходности приходиться обращаться на форум и искать помощи среди тех, кто понимает хоть что-то в Ардуинах.
Дело следующее: есть Ардуин Про Микро (на Атмеге32у4), оно подключено к ЦАПу через все возможные цифровые выходы, в среде разработки я прописываю какие пины Атмеги будут выводить данные и т.д., но тут начинаются проблемы, в чем конкретно - не могу знать, но есть догадки, что либо я не правильно использую bitRead(), digitalWrite(), либо Ардуина не понимает чего от нее хотят. Конкретнее - у меня есть 12-разрядный ЦАП, который из поданных ему единиц и нулей формирует напряжение на выходе, есть зависимость кода от напряжения - в прочем, ничего нового. Так вот, когда дело подходит к перебиранию бинарных значений - напряжение отказывается принимать нужные значения и изменяется еле заметно, хотя я меняю самые значащие разряды. Если же в тупую прописать

  PORTB = B01111110;
  PORTD = B00011111;
  PORTC = B01000000;

то схемка вроде выдает что-то подобное максимальному возможному значению напряжения. Однако у меня есть 256 значений и перебирать все этим способом времени и сил не хватит.
Примерно так я пыталась осуществить подачу единиц и нулей на ЦАП:

int pin_mass [12] = {9,10,11,28,29,30,18,19,20,21,25,31};
int i;
int j;
int mass [1] = {111111111111}; // наш массив значений синуса (для начала охота разобраться хотя бы с одним числом)

void setup() 
{
  DDRB = B01111110; //делаем все порты выходными
  DDRD = B00011111;
  DDRC = B01000000;
  pinMode(1, OUTPUT); 
  
}

void loop() 
{
  i=0;
  while(i<1) // попытки получить результат хотя бы из одного значения (массив mass реализует максимальное значение напряжения, но на вольтметре все те же 1,92)
    {
      
      digitalWrite(1, HIGH); // подаем на ножку WR ЦАПа 5 вольт 
      delayMicroseconds(10);
     
     start(); 
     i++;
     
      digitalWrite(1, LOW);
      delayMicroseconds(60);
    }        
  
}

void start()
{
  j=0;
  while(j<=11)
  {
  if(bitRead(mass[i], j) == 1) //проверяем "j-ый" бит указанного значения нашего массива
        {
          digitalWrite(pin_mass [j], HIGH); // по сути это должен быть как раз вывод на определенный пин единицы, если это она
        }
      else
        {
          digitalWrite(pin_mass [j], LOW); // или нуля
        }
  j++;
  }
}

Знакомые рассказывали, что поочередная передача каждого из 12ти значений на определенный порт была бы намного легче, если бы в Ардуине было нечто схожее с ПИКом, где переменная "статус" запоминает число перед тем, как его "сдвигают", но увы слишком поздно менять установку и я все еще лелею надежды повторить подобное на своей схеме.
В общем, было бы замечательно, если кто-то подскажет что в этой ситуации можно сделать, но даже замечание правильно ли я использую вышеперечисленные функции - было бы уже огромным подарком.

Редактировался 3.14e (2015-02-26 14:34:09)

#2 2015-02-26 17:33:21

CJ
Участник
Зарегистрирован: 2015-02-22
Сообщений: 16

Re: Тотальное недопонимание

Добрый день. Если я правильно понял, то вам с помощью 12bit ЦАП нужно вывести 256 значений, т.е. 8bit. Это можно сделать с помощью порта B или D МК  ATmega32U4. Но, поскольку, МК распаян под ардуино так, что полный порт выделить нельзя, то используйте два порта по 4 бита в каждом. Удобнее всего, согласно схеме, использовать половину порта F (PF4...PF7) и половину порта D (PD0...PD3). Так вот, берёте ваше 8bit число Z, делите его на две части по 4bit, получаете два числа: Х и Y. Далее записываете в оба порта соответствующие числа командой PORT: Например PORTF=X, PORTD=Y. К пинам соответствующих портов подключаете ваш ЦАП. Таким образом, изменяя Z от 0 до 256 автоматически получите необходимое значение напряжения на выходе ЦАП.

#3 2015-02-26 19:26:19

NoName
Customer
Из Київ
Зарегистрирован: 2014-07-08
Сообщений: 1,446

Re: Тотальное недопонимание

не по теме
но
Тотальное недопонимание ) это как раз моя тема )

есть переменная
unsigned char DATA = 0x84
#define   flag1 0x02
#define   flag2 0x04

0x84 & 0x04 =  0x04 ( true etc )

if ( DATA &  flag1 )
{
 ...  func1
}
else if ( DATA &  flag2 )
{
 ... func2
}

как правильно оформить данную конструкцию? ибо не работает (
что я делаю не так ?
дебагером пройтись не могу, не коннектится,  питание не нравится.

контроллер какая то мега.  среда MPLAB X IDE, компилятор не помню )

запутался реально. interrupt  проверяется && что тоже чуток смущает...  по идеи там тоже битовая маска 

// CCP1 Interrupt Enable bit
volatile bit CCP1IE              @ ((unsigned)&PIE1*8)+2;
volatile bit CCP1IF              @ ((unsigned)&PIR1*8)+2;


if( CCP1IF&&CCP1IE )
{
   работает 
}

#4 2015-02-27 02:04:00

CJ
Участник
Зарегистрирован: 2015-02-22
Сообщений: 16

Re: Тотальное недопонимание

"есть переменная
unsigned char DATA = 0x84
#define   flag1 0x02
#define   flag2 0x04
0x84 & 0x04 =  0x04 ( true etc )
if ( DATA &  flag1 )
{
...  func1
}
else if ( DATA &  flag2 )
{
... func2
}
как правильно оформить данную конструкцию? ибо не работает (
что я делаю не так ?"


Я вообще не понял самой конструкции if и постановки задачи...

Но попытаюсь ответить...

Вы пишите так: if ( DATA &  flag1 ), т.е. пытаетесь над переменной DATA провести выделение разрядов по маске flag1 и с результатом произвести само условие If....Возникает два вопроса:
1) Где переменная, в которой хранится результат выделения разрядов?
2) Где само условие If?

Попробуйте сделать так:

А = DATA &  flag1       // "А" хранит результат выделение разрядов по маске flag1
B = DATA &  flag2       // "В" хранит результат выделение разрядов по маске flag2

// Здесь рассматриваются сами условия и действия, которые вам необходимо совершить:

if ( A [ваше условие] )
{
// выполнять действия
}

if ( B [ваше условие] )
{
// выполнять действия
}

Редактировался CJ (2015-02-27 02:22:23)

#5 2015-02-27 10:40:42

NoName
Customer
Из Київ
Зарегистрирован: 2014-07-08
Сообщений: 1,446

Re: Тотальное недопонимание

CJ привет, вопрос закрыл, благодарю ),   но кое чего непонятно,

нужно читать стандарт (.
конструкция
if (  условие 1  )
{
  func1

else if (  условие 2  )
{
  func2

по логике вещей :
если условие 1 == false and  условие 2 == true

0x84 & 0x02 = 0x0  (aka false )
0x84 & 0x04 = 0x4  ( совсем не ноль )
 
то выполнится  func2 по в моем случае это не работало

запустился более корректный синтаксис для компилятора
if ( ( DATA &  flag1) ==  flag1 )
{
...  func1
}

if ( (DATA &  flag2) == flag2  )
{
... func2
}
и изменил алгоритм чтоб убрать else.


Strict Standards это правильно, но немного напрягает )

всем спасибо за участие )

PS вариант A,B пробовал. не отработало (
делать вычитку что накомпилировал компилятор не мог.

#6 2015-02-27 21:03:47

CJ
Участник
Зарегистрирован: 2015-02-22
Сообщений: 16

Re: Тотальное недопонимание

NoName, как раз таки в конструкции if "== flag1" - и есть условие, за которое я говорил...В первом случае условия ведь не было...
Но главное, что заработало smile

Редактировался CJ (2015-02-27 21:05:55)

#7 2015-02-28 14:10:21

3.14e
Участник
Зарегистрирован: 2015-02-26
Сообщений: 2

Re: Тотальное недопонимание

CJ пишет:

Добрый день. Если я правильно понял, то вам с помощью 12bit ЦАП нужно вывести 256 значений, т.е. 8bit. Это можно сделать с помощью порта B или D МК  ATmega32U4. Но, поскольку, МК распаян под ардуино так, что полный порт выделить нельзя, то используйте два порта по 4 бита в каждом. Удобнее всего, согласно схеме, использовать половину порта F (PF4...PF7) и половину порта D (PD0...PD3). Так вот, берёте ваше 8bit число Z, делите его на две части по 4bit, получаете два числа: Х и Y. Далее записываете в оба порта соответствующие числа командой PORT: Например PORTF=X, PORTD=Y. К пинам соответствующих портов подключаете ваш ЦАП. Таким образом, изменяя Z от 0 до 256 автоматически получите необходимое значение напряжения на выходе ЦАП.

самая главная проблема в том, что схема собиралась без меня и там уже все припаяно, по факту у меня есть табличка что с чем соединено, но когда я пытаюсь получить максимальное значение напряжения на выходе ЦАПа - получаю 2,3В вместо 2,5В, может это и не большая ошибка, но вот с остальными значениями вообще муть какая-то, вроде меняю самые значащие разряды, а изменения настолько незначительны, что без понятия что с ними сделать. И еще, заметила небольшую ошибку среди кучи своих:

PORTB = B01111110;
  PORTD = B00011111;
  PORTC = B01000000;

как писалось ранее, оказывается портБ отвечает за 0-7 цифр. пины, а не по бокам микросхемки(как мне хотелось бы), а некоторые подключенные у меня порты не описаны через функцию порт(Б,Ц,Д), так что, вероятнее всего, я теряю несколько цифр, что очень больно бьет по результатам .____.
На счет уточнений про 8бит, у меня есть 12 проводов от ардуины к ЦАПу и все числа, которые мне следует передавать содержат 12 знаков, 256 значений - это моя синусоида достаточно мало значений, чтобы в случае чего сделать все "руками", а не средствами ардуино, которую я, честно говоря, уже и не сильно надеюсь увидеть на осциллографе, но время поджимает и я хочу хотя бы понять что я делаю не так.

И еще, мало ли кто сталкивался с функцией bitRead - подскажите как она работает на примерах, вдруг я не правильно ее использую.

Редактировался 3.14e (2015-02-28 14:15:24)

#8 2015-02-28 16:26:59

NoName
Customer
Из Київ
Зарегистрирован: 2014-07-08
Сообщений: 1,446

Re: Тотальное недопонимание

3.14e привет,
монтаж  соединений 2 раза проверяли? )
"с остальными значениями вообще муть какая-то, вроде меняю самые значащие разряды, а изменения настолько незначительны," похоже на ошибку монтажа, либо нет соединения, либо разряды попутаны.

я бы проверил по 1 ноге, по очереди выставляя 1 от младшего к старшему  разряду, контролируя на  ногах D0-D7  ЦАПа

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела