Ви не увійшли.
3.14e привет,
монтаж соединений 2 раза проверяли? )
"с остальными значениями вообще муть какая-то, вроде меняю самые значащие разряды, а изменения настолько незначительны," похоже на ошибку монтажа, либо нет соединения, либо разряды попутаны.
я бы проверил по 1 ноге, по очереди выставляя 1 от младшего к старшему разряду, контролируя на ногах D0-D7 ЦАПа
Добрый день. Если я правильно понял, то вам с помощью 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 - подскажите как она работает на примерах, вдруг я не правильно ее использую.
NoName, как раз таки в конструкции if "== flag1" - и есть условие, за которое я говорил...В первом случае условия ведь не было...
Но главное, что заработало
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 пробовал. не отработало (
делать вычитку что накомпилировал компилятор не мог.
"есть переменная
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 [ваше условие] )
{
// выполнять действия
}
не по теме
но
Тотальное недопонимание ) это как раз моя тема )
есть переменная
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 )
{
работает
}
Добрый день. Если я правильно понял, то вам с помощью 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 автоматически получите необходимое значение напряжения на выходе ЦАП.
Добрый день, от безысходности приходиться обращаться на форум и искать помощи среди тех, кто понимает хоть что-то в Ардуинах.
Дело следующее: есть Ардуин Про Микро (на Атмеге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ти значений на определенный порт была бы намного легче, если бы в Ардуине было нечто схожее с ПИКом, где переменная "статус" запоминает число перед тем, как его "сдвигают", но увы слишком поздно менять установку и я все еще лелею надежды повторить подобное на своей схеме.
В общем, было бы замечательно, если кто-то подскажет что в этой ситуации можно сделать, но даже замечание правильно ли я использую вышеперечисленные функции - было бы уже огромным подарком.