#1 Re: Програмування Arduino » Тотальное недопонимание » 2015-02-28 14:10:21

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 - подскажите как она работает на примерах, вдруг я не правильно ее использую.

#2 Програмування Arduino » Тотальное недопонимание » 2015-02-26 14:25:16

3.14e
відповідей: 7

Добрый день, от безысходности приходиться обращаться на форум и искать помощи среди тех, кто понимает хоть что-то в Ардуинах.
Дело следующее: есть Ардуин Про Микро (на Атмеге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ти значений на определенный порт была бы намного легче, если бы в Ардуине было нечто схожее с ПИКом, где переменная "статус" запоминает число перед тем, как его "сдвигают", но увы слишком поздно менять установку и я все еще лелею надежды повторить подобное на своей схеме.
В общем, было бы замечательно, если кто-то подскажет что в этой ситуации можно сделать, но даже замечание правильно ли я использую вышеперечисленные функции - было бы уже огромным подарком.

Підвал форуму