Перейти к содержанию
    

Программирование ЦАП AVR

Здравствуйте, уважаемые форумчане! Всех с наступающим Новым Годом! Мне нужна Ваша помощь и совет вот по какому вопросу:

Я пробую программировать ЦАП DAC8512F с помощью SPI порта контроллера ATMega168 (кварц 20 МГц).

ЦАП подключен к контроллеру следующим образом:

19 ножка МК (PB5/SCK) - 3 ножка ЦАПа CLK;

18 ножка МК (PB4/MISO) - 5 ножка ~LD;

17 ножка МК (PB3/MOSI) - 4 ножка SDI;

16 ножка МК (PB2/~SS) - 2 ножка ~CS;

15 ножка МК (PB1) - 6 ножка ~CLR;

8 ножка ЦАП +5В;

7 ножка ЦАП GND.

 

В итоге после выполнения программы (приведена ниже) на выходе ЦАПа устанавливается 0 В, а не требуемые 100 мВ. НО после того как я тестером в режиме измерения напряжения ткну в ножку ~LD ИЛИ ножку 18 МК, на выходе ЦАПа устанавливается требуемое значение. В чем может быть проблема? почему данные в регистр ЦАПа не поступают автоматически?? Спасибо за помощь! Проблема наверняка какая нибудь не сложная. Но к сожалению не могу в ней разобраться.

 

Программа:

 

#define DACDEFAULT 100

int main(void)
{
WDT_off(); // Отключаем сторожевой таймер

IO_conf(); // Конфигурируем порты
_delay_us(5);  // Ждем 5 мкс

SPI_init(); // Инициализируем SPI
_delay_us(5);  // Ждем 5 мкс

DAC_erase();
_delay_us(5);  // Ждем 5 мкс
DAC_prog(DACDEFAULT); // Программируем ЦАП на 100 мВ
}

/* Часть программы SPI */
void SPI_init(void)
{
//Устанавливаем SPI в режиме мастера, SCL отрицательной  полярности
//Скорость FCK/64, обработка сигнала по нарастающему фронту SCL
SPCR |= (1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1);
}

void SPI_Transmit(char cData) // Передача числа 8 бит
{
// Начать передачу
SPDR = cData;
// Ожидаем завершения передачи
while(!(SPSR & (1<<SPIF)));
}

/*Инициализация ножек МК*/
void IO_conf(void)
{
// Конфигурация порта B: Выводы 1-5 на выход xx11 1110
DDRB =(1<<DDB5)|(1<<DDB4)|(1<<DDB3)|(1<<DDB2)|(1<<DDB1); 
// CS ЦАП PB2=1 (Не выбран), 
//CLR ЦАП PB1=1 (Нет очистки),
PORTB |= (1<<PB4)|(1<<PB2)|(1<<PB1);
}


/* Программирование ЦАП */
void DAC_prog(unsigned int dacData)
{
DAClevelH = (unsigned char) dacData>>8;
DAClevelL = (unsigned char) dacData;

PORTB |= (1<<PB4);
_delay_us(5);
//Выбираем ЦАП с помощью CS - логический 0
PORTB &= ~(1<<PB2);
_delay_us(5);
//Записываем данные в ЦАП
SPI_Transmit(DAClevelH); // Ожидание завершения передачи прописано в функции
SPI_Transmit(DAClevelL); // Ожидание завершения передачи прописано в функции
//Возвращаем CS в состояние логической 1
_delay_us(5);  // Ждем 5 мкс
PORTB |= (1<<PB2);
_delay_us(5);  // Ждем 5 мкс
//Переносим данные из сдвигового регистра в регистр ЦАП - лог 0
PORTB &= ~(1<<PB4);
_delay_ms(1);  // Ждем 5 мкс
PORTB |= (1<<PB4);
_delay_us(5);  // Ждем 5 мкс
}

/* Стираем ЦАП */
void DAC_erase(void)
{
PORTB |= (1<<PB4);
_delay_us(5);
PORTB &= ~(1<<PB1);
_delay_ms(1); // Ждем 1 мс
//Возвращаем CLR в состояние - логическая 1
PORTB |= (1<<PB1);
_delay_us(30); // Ждем 30 мкс
}

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

//Переносим данные из сдвигового регистра в регистр ЦАП - лог 0
PORTB &= ~(1<<PB4);
_delay_ms(1);  // Ждем 5 мкс
PORTB |= (1<<PB4);
_delay_us(5);  // Ждем 5 мкс
}

Что-то здесь не так . Вы уверены что PB4 не изменил своего состояния до PORTB &= ~(1<<PB4);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

НО после того как я тестером в режиме измерения напряжения ткну в ножку ~LD ИЛИ ножку 18 МК, на выходе ЦАПа устанавливается требуемое значение.

Похоже у вас соединены два входа (18 ножка МК (PB4/MISO) - 5 ножка ~LD;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

zombi, совершенно верно, они соединены. Я управляю входом ~LD ЦАПа с помощью 18 ножки МК. Своей фразой я просто хотел сказать, что проблема не в контакте (так как не важно, куда именно я тыркаю тестером). И микроконтроллер и ЦАП в корпусах DIP помещены в соответствующие панельки.

 

ILУAUL, ножка PB4 была поднята в лог. единицу во время конфигурации портов и после этого не опускалась. После того, как я не получил необходимые мне 100 мВ, я добавил еще раз PORTB |= (1<<PB4); в функцию void DAC_prog(unsigned int dacData) перед выбором ЦАПа "чипселектом" ~CS. На всякий случай. Но проблема, увы, не была устранена.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видел , ещё подумал , зачем ещё раз

Но как не крути складывается впечатление , что LD в ноль не падает, а при внесении щупа с входным сопротивлением и происходит запись по нулю. Звони -прозванивай . А нам дай взглянуть на ASM , что он там накомпилил компилятор.

Ошибок по инит цапа я не нашёл , вроде как усё по DS

И плату хорошо помыл от флюса

 

Похоже у вас соединены два входа (18 ножка МК (PB4/MISO) - 5 ножка ~LD;)

2 Zombi респект - вот поэтому и не работает. ( Когда ник сменишь :)

MISO: Master Data input, Slave Data output pin for SPI channel. When the SPI is enabled as a

master, this pin is configured as an input regardless of the setting of DDB4.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

( Когда ник сменишь :)

Да пытался уже, но модераторы сказали что слишком хлопотное это дело...

ну, я и забил ... :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ILYAUL, zombi, спасибо Вам большое за помощь! Не обратил внимания к сожалению на такую тонкость. Теперь буду внимательнее!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...