Страница 1 из 1

Синтезатор на TEA5757, помогите с кодом

Добавлено: Чт июл 30, 2009 10:44:20
Igor_67
Мяу, товарищи! :))
Возникла такая проблема. Пишу программу для управления синтезатором на основе Баскома.
Синтезатор TEA5757. Там управление идет по трем проводам.
1. WREN - чтение/запись (0 - чтение, 1 - запись)
2. BUS-CLK - частота тактирования (200 кГц)
3. DATA - данные
вот код:
$regfile "m16def.dat"
$crystal = 4000000
$hwstack = 32
$swstack = 8
$framesize = 24

Dim Count As Byte
Dim Fm_count As Byte
Dim Datte As Long
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim F As Single
Dim S As String * 5

Config Scl = Portc.0
Config Sda = Portc.1
Config Portd.7 = Input
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Porta.1 = Output
Reset Porta.1

Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.2 , Rs = Porta.0
Config Lcd = 16 * 2

Wren Alias Portd.4
Clock Alias Portd.5
Outp Alias Portd.6
Knopka Alias Pind.7

Reset Wren
Reset Clock
Reset Outp

Gosub M1
Set Wren
Gosub M2
Shiftout Outp , Clock , Datte , 2 , 25
Set Clock
Waitms 50
Reset Wren

End


M1:
Restore Dat1
Read S
Lcd S ; " MHz"
Return

M2:
Restore Dat20
'For A = 1 To 2
Read Datte
'Next A
Return

Dat1:
Data "101.0" , "101.9" , "102.4" , "102.9" , "103.9" , "104.4" , "104.9" , "105.4" , "105.9" , "106.4"

Dat20:
Data &B1100000000010001011101000
Проблема в том, что при подаче 1 на WREN, синтезатор вообще затыкается ( видимо, включается режим MUTE, как написано в даташите). При последующей подаче 0 на WREN, все остается как было, т.е. - тишина. Поэтому не могу проверить правильность кода. Кто знает, как это сделать? И вообще правильно ли написан код?
BUS-CLK должен быть 200 кГц при тактовой частоте МК - 4 МГц. Страницы 7-11 в даташите (ДШ прилагается).
Как это лучше организовать?
Можно не в BASCOMе. Хоть на АСМе, хоть на СИ, пофигу.
Кто поможет старому больному коту? :cry:
Есть подозрение, что у меня с тактированием напутано. Тактирование должно осуществляться по по фронту сигнала. И сначала передается LSB.

Добавлено: Чт июл 30, 2009 17:03:26
kalobyte
муть какая-то с этим бейсиком
процедура передачи у тебя неправильная вроде
там нужен сдвиг побитный и не от 1 до 2,а по количеству засылаемых бит
даташит не смотрел, обычно 16 бит

что-то типа
EN_ON // макрос выставляет 1 на выводе разрешения записи синтезатора
for (i=0; i<15;i++){
PORTD&=data<<i;
CLK // макрос дергает клок с нужной задержкой
}
EN_OFF

Добавлено: Пт июл 31, 2009 10:55:40
Igor_67
kalobyte.. А поподробнее про макросы можно?
Мне их самому писать или есть готовые?
А насчет побитового сдвига, так у меня и сделано. сдвигается 25-битовая переменная в команде Shiftout. А for-next цикл от 1 до 2 закомментирован. Это надо было для эксперимента/отладки.

Добавлено: Пт июл 31, 2009 11:00:05
МитяРа
Мяу Igor_67..
Макрос, это частоповторяющийся кусок программы, который ОДИН раз описывается,
а потом просто вызывается по имени, а транслятор сам подставит его каждый раз при трансляции..
Это удобно, что-бы не загромождать программу одинаковыми кусками..
Макросов может быть несколько...

Добавлено: Сб авг 01, 2009 18:20:51
kalobyte
синтаксис бейсика некошерный
непонятно там, куда чего двигается

макросы у тебя тут есть при помощи сет и ресет
правильный синтакс и вообще стиль программирования

Код: Выделить всё

#define SYNT_PORT PORTD
#define SYNT_EN_PIN 0
#define SYNT_CLK_PIN 1
#define SYNT_DATA_PIN 2

#define EN_ON SYNT_PORT=(1<<SYNT_EN_PIN)
#define EN_OFF SYNT_PORT=(0<<SYNT_EN_PIN)

#define CLK {
SYNT_PORT=1<<SYNT_CLK_PIN
delay_us(5);
SYNT_PORT=0<<SYNT_CLK_PIN
}

потом используеш просто
EN_ON
в цикле выдираеш каждый бит и шлеш его в порт, как я выше написал
т.е. установил бит в 1 или 0 на SYNT_DATA_PIN
вызываеш CLK
и все это в цикле
потом
EN_OFF

http://pira.cz/plllcd.htm
вот пример с немного запутанным кодом функции посыла данных, но попробуй сам вкурить

Добавлено: Сб авг 01, 2009 18:38:44
urry

Код: Выделить всё

#define SYNT_PORT PORTD
#define SYNT_EN_PIN 0
#define SYNT_CLK_PIN 1
#define SYNT_DATA_PIN 2

#define EN_ON() SYNT_PORT|=(1<<SYNT_EN_PIN)
#define EN_OFF() SYNT_PORT&=~(1<<SYNT_EN_PIN)
#define CLK_ON() SYNT_PORT|=(1<<SYNT_CLK_PIN)
#define CLK_OFF() SYNT_PORT&=~(1<<SYNT_CLK_PIN)

#define CLK() { \
CLK_ON(); \
delay_us(5); \
CLK_OFF(); }

Добавлено: Вс авг 02, 2009 12:15:37
Igor_67
Спасибо, буду разбираться!