th-under 0 25 декабря, 2014 Опубликовано 25 декабря, 2014 (изменено) · Жалоба Здравствуйте, уважаемые форумчане! Всех с наступающим Новым Годом! Мне нужна Ваша помощь и совет вот по какому вопросу: Я пробую программировать ЦАП 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 мкс } Изменено 25 декабря, 2014 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 25 декабря, 2014 Опубликовано 25 декабря, 2014 · Жалоба //Переносим данные из сдвигового регистра в регистр ЦАП - лог 0 PORTB &= ~(1<<PB4); _delay_ms(1); // Ждем 5 мкс PORTB |= (1<<PB4); _delay_us(5); // Ждем 5 мкс } Что-то здесь не так . Вы уверены что PB4 не изменил своего состояния до PORTB &= ~(1<<PB4); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 25 декабря, 2014 Опубликовано 25 декабря, 2014 · Жалоба НО после того как я тестером в режиме измерения напряжения ткну в ножку ~LD ИЛИ ножку 18 МК, на выходе ЦАПа устанавливается требуемое значение. Похоже у вас соединены два входа (18 ножка МК (PB4/MISO) - 5 ножка ~LD;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
th-under 0 25 декабря, 2014 Опубликовано 25 декабря, 2014 · Жалоба zombi, совершенно верно, они соединены. Я управляю входом ~LD ЦАПа с помощью 18 ножки МК. Своей фразой я просто хотел сказать, что проблема не в контакте (так как не важно, куда именно я тыркаю тестером). И микроконтроллер и ЦАП в корпусах DIP помещены в соответствующие панельки. ILУAUL, ножка PB4 была поднята в лог. единицу во время конфигурации портов и после этого не опускалась. После того, как я не получил необходимые мне 100 мВ, я добавил еще раз PORTB |= (1<<PB4); в функцию void DAC_prog(unsigned int dacData) перед выбором ЦАПа "чипселектом" ~CS. На всякий случай. Но проблема, увы, не была устранена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 25 декабря, 2014 Опубликовано 25 декабря, 2014 · Жалоба Видел , ещё подумал , зачем ещё раз Но как не крути складывается впечатление , что 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 26 декабря, 2014 Опубликовано 26 декабря, 2014 · Жалоба ( Когда ник сменишь :) Да пытался уже, но модераторы сказали что слишком хлопотное это дело... ну, я и забил ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
th-under 0 28 декабря, 2014 Опубликовано 28 декабря, 2014 · Жалоба ILYAUL, zombi, спасибо Вам большое за помощь! Не обратил внимания к сожалению на такую тонкость. Теперь буду внимательнее! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться