Ср июн 03, 2009 07:50:52
Чт сен 22, 2011 15:24:14
Вт сен 27, 2011 14:11:01
Вт сен 27, 2011 14:14:57
Igor_67 писал(а):Я тут вчера в барахле покопался у себя и отыскал старенький FM тюнер, который в комп на шину ISA ещё. Там микруха стоит TEA5757H. По даташиту на нее посмотрел, какая нога за что отвечает, поснимал лишние элементы с платы, дабы ток не кушала, подключил - заработало! Поймал переменником все станции, которые у нас есть в регионе. Но здесь такая фиговина: эта микра предназначена как раз для электронного управления перестройкой частоты. Имеется три сигнала: BUS CLOCK, DATA (IN/OUT), WRITE ENABLE. Вроде всё понятно, только данные там передаются пачками по 24 бита в каждой. Так вот, у меня вопрос: Как мне организовать передачу данных в TEA5757 из МК AVR (Mega 16 или Mega 32)? Подскажите, плиз, а то вчера весь вечер голову ломал, но безуспешно. Если можно, кусочек кода скиньте пжалста, лучше на ВАСИКе или АСМе.
Привожу диаграмму процесса записи/чтения из ДШ:
И ещё несколько нужных вещей из ДШ: таблицы и тайминги.
Пт фев 26, 2016 07:25:01
Вс мар 06, 2016 14:48:30
Пт окт 06, 2017 11:14:39
#define we 2 //write enable pin
#define dat 3 //data pin
#define clk 4 //clock pin
#define button1 11
#define button2 12
#define search_preset 10 //кнопка preset-search
#define AM_FM 9 //кнопка переключения диапазона
#define gd 1 //глобальная задержка
boolean search = 0; //бит функции поиска
boolean band_switch = 0; //0-FM 1-AM
byte cykl = 0; //для цикла for
unsigned int freq = 9072; //переменная частоты, для АМ-прямой счёт, для FM-умножение на 12.5 170=B10101010 9072-102.7Mhz
unsigned int freqroll = 0;
byte controlroll = 0;
byte control = B10000010; //байт настроек-контроля, отправка СЛЕВА-НАПРАВО биты 23-16
////////////////23------16
////////////////B10000000 - FM, поиск вверх, >5мкВ, стерео
////////////////B00000000 - FM, поиск вниз, >5мкВ, стерео
////////////////B10010000 - MW, поиск вверх, >28мкВ
////////////////B00010000 - MW, поиск вниз, >28мкВ
void RecivData(){ //функция чтения данных из микры, помещаем принятое в freqroll и controlroll
controlroll = 0;
freqroll = 0;
pinMode(dat, INPUT_PULLUP); //ногу на вход
//strt_rcv:
digitalWrite(we, LOW);
delay(gd);
//if(digitalRead(dat) == 1) goto strt_rcv; //проверка состояния 24-го бита
////////////////////////////////////////////////////
for(cykl=0; cykl<=7; ++cykl){ //цикл приема контрольного байта
digitalWrite(clk, HIGH);
delay(gd);
digitalWrite(clk, LOW);
controlroll = controlroll << 1;
bitWrite(controlroll, 0, digitalRead(dat));
delay(gd);
//Serial.println(controlroll, BIN);
}
////////////////////////////////////////////////////
for(cykl=0; cykl<=15; ++cykl){ //цикл приема значения частоты
digitalWrite(clk, HIGH);
delay(gd);
digitalWrite(clk, LOW);
freqroll = freqroll << 1;
bitWrite(freqroll, 0, digitalRead(dat));
delay(gd);
}
}
void SendData(boolean search_sw, byte cntrl, unsigned int frq){ //функция отправки данных в микру
pinMode(dat, OUTPUT); //ногу на выход
controlroll = cntrl;
freqroll = frq;
digitalWrite(we, HIGH);
delay(gd);
digitalWrite(dat, search_sw); //отправка 24-го бита поиска
delay(gd);
digitalWrite(clk, HIGH);
delay(gd);
digitalWrite(clk, LOW);
delay(gd);
////////////////////////////////////////////////////
for(cykl=0; cykl<=7; ++cykl){ //цикл отправки контрольного байта
digitalWrite(dat, bitRead(controlroll, 7));
delay(gd);
digitalWrite(clk, HIGH);
delay(gd);
digitalWrite(clk, LOW);
delay(gd);
controlroll = controlroll << 1;
}
////////////////////////////////////////////////////
for(cykl=0; cykl<=15; ++cykl){ //цикл отправки значения частоты
digitalWrite(dat, bitRead(freqroll, 15));
delay(gd);
digitalWrite(clk, HIGH);
delay(gd);
digitalWrite(clk, LOW);
delay(gd);
freqroll = freqroll << 1;
}
delay(gd);
digitalWrite(we, LOW);
}
// the setup function runs once when you press reset or power the board
void setup() {
// start serial port
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(we, OUTPUT); //WE
pinMode(dat, OUTPUT); //Data
pinMode(clk, OUTPUT); //Clock
digitalWrite(we, LOW);
digitalWrite(dat, LOW);
digitalWrite(clk, LOW);
pinMode(button1, INPUT_PULLUP); //кнопка1
pinMode(button2, INPUT_PULLUP); //кнопка2
pinMode(search_preset, INPUT_PULLUP); //кнопка preset-search
pinMode(AM_FM, INPUT_PULLUP); //кнопка выбора диапазона
SendData(search, control, freq); //Запуск тюнера
}
// the loop function runs over and over again forever
void loop() {
///////////////////////////////////////////////////////////// КНОПКА PRESET-SEARCH
if (digitalRead(search_preset) == LOW) {
search = !search;
digitalWrite(LED_BUILTIN, HIGH);
delay(300);
}
///////////////////////////////////////////////////////////// КНОПКА выбора диапазона
if (digitalRead(AM_FM) == LOW) {
if (band_switch == 0) { //переключаем в АМ
bitSet(control, 4);
//bitSet(control, 5); //КВ
freq = 1455;
band_switch = 1;
goto out_z;
}
if (band_switch == 1) { //переключаем в FM
bitClear(control, 4);
freq = 9072;
band_switch = 0;
}
out_z:
digitalWrite(LED_BUILTIN, HIGH);
delay(300);
}
///////////////////////////////////////////////////////////// КНОПКА1 вверх по частоте
if (digitalRead(button1) == LOW) {
digitalWrite(LED_BUILTIN, HIGH);
bitSet(control, 7); //ставим 7ой бит - поиск вверх
freq = freq + 8;
SendData(search, control, freq);
}
///////////////////////////////////////////////////////////// КНОПКА2 вниз по частоте
if (digitalRead(button2) == LOW) {
digitalWrite(LED_BUILTIN, HIGH);
bitClear(control, 7); //убираем 7-ой бит - поиск вниз
freq = freq - 8;
SendData(search, control, freq);
}
delay(20);
RecivData();
//long fo = freqroll * 12.5;
//unsigned int fo2 = freqroll - 455;
Serial.println(freqroll, DEC);
Serial.println(controlroll, BIN);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
}
Вс окт 15, 2017 15:29:42