Поиск сообщества
Показаны результаты для тегов 'PT8211'.
Найдено: 1 результат
-
Здравствуйте друзья. Изучаю программирование на Ардуино и пытаюсь подключить к нему различные микросхемки , которые попадают мне под руку. Вот и попалась мне ЦАП РТ8211 . Дешёвая микросхема , которую я снял с поломоного спутникового ресивера. Протокол работы с ней оказался не сложный по этому посидев несколько часов я написал програмку работы с ней. Принимает она по 16 бит на вывод DIN для двух каналов . Всего 32 бита получается. По переходу с 0 на 1 вывода BCK каждый бит прописывается в ячейках цап . Битов можно передавать и больше , но останутся только последние 16 , по переходу вывода WC. Изменение состояния этого вывода с 0 на 1 сохраняет в цап последние 16 битов для правого канала , а обратный для левого. Но с использованием старшего бита MSB связана какая то загадка . Вот пример какая синусоида получилась здесь http://arduino.ru/forum/obshchii/pt8211. У меня так же получилась нормальная пила и странная синусоида. Тогда я не стал использовать значения , затрагивающие старший бит , и синусоида вышла нормальная. С прямым вычислением синуса частота получилась 298 Герц. Не много конечно , но без вычислений синуса с пилой , частота на пине WS около 20 килогерц. Синусоида получилась размахом около 1.2 Вольт. // программа работы с ЦАП РТ8211 пины 1 - BCK , 2 - WS , 3 - DIN , 4 - GND , 5 - +5V , 6 - Left Out , 7 - nc , 8 - Rite Out #define Port PORTB // оределяем рабочий порт // определим назначение пинов этого порта // для ардуино #define BCK 8 // to pin 1 тактовый сигнал #define WS 9 // to pin 2 0 - правый канал , 1- левый канал #define DIN 10 // to pin 3 16 бит данных // для соответствующих пинов порта #define PORT_BCK B001 // тактовый сигнал #define PORT_WS B010 // 0 - правый канал , 1- левый канал #define PORT_DIN B100 // 16 бит данных #define Dt 5 // полупериод в мкс для BCK #define MAX 32768.0 //65535.0 используем меньшие значения не затрагивая старший 16 бит #define ZER 16384.0 //32768.0 #define pi_pi 6.2831853 #define st 0.340261 //volatile byte w =1 ; // micros() // возвращает количество микросекунд разрешение 4 микросекунды void setup() { // put your setup code here, to run once: pinMode ( BCK , 1 ); pinMode ( WS , 1 ); pinMode ( DIN , 1 ); pinMode ( 13 , 1 ) ; noInterrupts(); } void loop() { // put your main code here, to run repeatedly: unsigned int in , tt ; float r_ad ; double sinus ; boolean f = 0 ; for ( r_ad = 0 ; r_ad <= pi_pi ; r_ad += st) { // будем линейно увеличивать данные для ЦАП //tt = micros(); //while ( micros()-tt < 20); //digitalWrite(13, f); sinus = sin(r_ad); sinus = ZER * sinus + ZER; in = (unsigned int)sinus; BUS_Send (in) ; // отправим данные в ЦАП f = !f ; // моргаем 13 пином //interrupts(); } } void BUS_Send ( word Data_In ) { // volatile byte i ; byte Bus_Out , i = 0 ; word temp , sdvig = 32768 ; unsigned long Timer ; boolean D = 1 , flag = 1 ; Bus_Out = Port & ~(PORT_BCK + PORT_WS + PORT_DIN) ; //сбрасвываем линии while ( i <= 31 ) { //Передаём 16 бит в правый канал 31 и 16 нулей в левый if ( flag ) { // флаг правого левого канала //Bus_Out = Port & ~PORT_DIN ; if ( Data_In & sdvig ) { // определяем что передаём DIN , 0 или 1 Bus_Out |= PORT_DIN; // PORT_DIN * D ; // Выводим DIN } else Bus_Out &= ~PORT_DIN; sdvig >>= 1 ; // сдвигаем позицию следущего бита из Data_In } else Bus_Out &= ~PORT_DIN ; Port = Bus_Out ; //на этом моменте BCK = 0 , DIN установлен // sdvig >>= 1 ; // сдвигаем позицию следущего бита из Data_In Bus_Out |= PORT_BCK ; // подготавливаем переход BCK c 0 на 1 Port = Bus_Out ; // фиксируем бит DIN переходом BCK c 0 на 1 Bus_Out = (Bus_Out & ~PORT_BCK); // подготавливаем переход BCK с 1 на 0 if ( i == 15 ) { // формирование нулей для левого канала Bus_Out |= PORT_WS ;// подготовка строба записи правого канала WS flag = 0 ; } i++; Port = Bus_Out ; } Port = Port & ~PORT_WS; // строб записи левого канала WS } PT8211.rar