спасибо, хорошо разъясняешь. но только я пока не завёл дисплей. не хочет работать ни в какую. 6606 который. светятся всегда все сегменты. вход гашения экрана работает. тактовый генератор работает, клавиатура сканируется, а на команды/данные не реагирует...Mixer писал(а):Допустим есть дисплей, состоящий из 2х символов. Каждый символ - 7 палочек (сегментов) + точка. Т.е., чтобы отобразить нам что-то на дисплее, надо отправить на контроллер 2 байта (2 * 8 бит) состояния этих сегментов. Допустим нам надо отобразить цифру "12". Чтобы переконвертировать это число в формат дисплея, сначала берем "1" (кидаем в аккумулятор) и вызываем conv_table. Все, теперь в аккумуляторе у нас сконвертированный байт для дисплея (0x9F). Отправляем на контроллер дисплея. Тоже самое делаем с "2". Вобщем, я к чему клоню. На контроллер всегда отправляется последовательность 0 и 1, который всегда можно разбить на части. С 0 по 7 бит, допустим, будет первый символ, с 8 по 15 - второй символ и т.д. Берешь по одной циферке, вызываешь таблицу и отправляешь полученные данные на контроллер. Если кроме цифр нужно конвертить что-то еще (шкала уровня звука и т.д.) - можно для них написать отдельную таблицу. Не знаю, понятно написал или нет...
Подключение PIC к PT6523
Re: Подключение PIC к PT6523
Re: Подключение PIC к PT6523
По какой схеме собирал? Какая программа у тебя?
Вобщем полистал даташит. Делаешь так:
1. Собираешь схему как на 15 стр.
2. Передаешь данные дисплея (светодиод + сегменты)
2.1. Устанавливаешь бит данных DATA
2.2. Щелкаешь CLOCK
2.3. Повторяешь пункты 2.1 и 2.2 для всех 40 сегментов
3. Передаешь комманду (смотри пункты 2.1 и 2.2)
4. Щелкаешь LOAD
5. Устанавливаешь BLANK в 0
Пример программы, гореть будут все сегменты на COM-A + светодиод
Вариант посложнее, будут гореть только первые 9 сегментов COM-A + светодиод
Вобщем полистал даташит. Делаешь так:
1. Собираешь схему как на 15 стр.
2. Передаешь данные дисплея (светодиод + сегменты)
2.1. Устанавливаешь бит данных DATA
2.2. Щелкаешь CLOCK
2.3. Повторяешь пункты 2.1 и 2.2 для всех 40 сегментов
3. Передаешь комманду (смотри пункты 2.1 и 2.2)
4. Щелкаешь LOAD
5. Устанавливаешь BLANK в 0
Пример программы, гореть будут все сегменты на COM-A + светодиод
Код: Выделить всё
list p = 16F628A
;--------------------------------------------------
; B0 - LOAD
; B1 - DATA
; B2 - CLOCK
; B3 - BLANK
;--------------------------------------------------
TRISA equ 0x05 ; (1-й банк)
TRISB equ 0x06 ; (1-й банк)
PORTA equ 0x05 ; (0-й банк)
PORTB equ 0x06 ; (0-й банк)
CMCON equ 0x1F ; (0-й банк)
STATUS equ 0x03 ;
CBLOCK 0x20
COUNT ; счетчик циклов
COM_B ; команда
endc
;--------------------------------------------------
org 0x00 ;
goto init_io ;
;--------------------------------------------------
init_io ;
movlw 0x07 ;
movwf CMCON ; CMCON = 0x07
clrf PORTA ; PORTA = 0
clrf PORTB ; PORTB = 0
bsf STATUS,5 ; 1-й банк
clrf TRISA ; TRISA = 0
clrf TRISB ; TRISB = 0
bcf STATUS,5 ; 0-й банк
;--------------------------------------------------
main ;
movlw 0x02 ;
movwf COM_B ; COM_B = 0x02
; 0x02 для COM-A
; 0x03 для COM-B
; передаем данные дисплея
movlw 0x29 ;
movwf COUNT ; COUNT = 0x29
data_loop ;
bcf PORTB,1 ; DATA = 0
bsf PORTB,2 ; CLOCK = 1
bcf PORTB,2 ; CLOCK = 0
decfsz COUNT,1 ; COUNT = COUNT - 1
goto data_loop ;
; передаем комманду
movlw 0x04 ;
movwf COUNT ; COUNT = 0x04
com_loop ;
bcf PORTB,1 ; DATA = 0
btfsc COM_B,0 ; если COM_B(0) = 0, пропустить след. команду
bsf PORTB,1 ; DATA = 1
bsf PORTB,2 ; CLOCK = 1
bcf PORTB,2 ; CLOCK = 0
rrf COM_B,1 ; COM_B = COM_B >> 1
decfsz COUNT,1 ; COUNT = COUNT - 1
goto com_loop ;
; загружаем данные на дисплей (LOAD)
bsf PORTB,0 ; LOAD = 1
bcf PORTB,0 ; LOAD = 0
; включаем дисплей (BLANK)
bcf PORTB,3 ; BLANK = 0
;--------------------------------------------------
end
Код: Выделить всё
list p = 16F628A
;--------------------------------------------------
; B0 - LOAD
; B1 - DATA
; B2 - CLOCK
; B3 - BLANK
;--------------------------------------------------
TRISA equ 0x05 ; (1-й банк)
TRISB equ 0x06 ; (1-й банк)
PORTA equ 0x05 ; (0-й банк)
PORTB equ 0x06 ; (0-й банк)
CMCON equ 0x1F ; (0-й банк)
STATUS equ 0x03 ;
CBLOCK 0x20
COUNT ; счетчик циклов
COM_B ; команда
SEG_ST ; статус сегмента
endc
;--------------------------------------------------
org 0x00 ;
goto init_io ;
;--------------------------------------------------
init_io ;
movlw 0x07 ;
movwf CMCON ; CMCON = 0x07
clrf PORTA ; PORTA = 0
clrf PORTB ; PORTB = 0
bsf STATUS,5 ; 1-й банк
clrf TRISA ; TRISA = 0
clrf TRISB ; TRISB = 0
bcf STATUS,5 ; 0-й банк
;--------------------------------------------------
main ;
movlw 0x02 ;
movwf COM_B ; COM_B = 0x02
; 0x02 для COM-A
; 0x03 для COM-B
movlw 0x0A ; ПОМЕНЯТЬ ЗНАЧЕНИЕ!
movwf COUNT ; COUNT = 0x0A
sublw 0x29 ; W = 0x29 - W
bsf SEG_ST,0 ; SEG_ST(0) = 1
call data_loop ;
movwf COUNT ; COUNT = W
bcf SEG_ST,0 ; SEG_ST(0) = 0
call data_loop ;
movlw 0x04 ;
movwf COUNT ; COUNT = 0x04
goto com_loop ;
data_loop ;
bcf PORTB,1 ; DATA = 0
btfsc SEG_ST,0 ; если SEG_ST(0) = 0, пропустить след. команду
bsf PORTB,1 ; DATA = 1
bsf PORTB,2 ; CLOCK = 1
bcf PORTB,2 ; CLOCK = 0
decfsz COUNT,1 ; COUNT = COUNT - 1
goto data_loop ;
return ;
com_loop ;
bcf PORTB,1 ; DATA = 0
btfsc COM_B,0 ; если COM_B(0) = 0, пропустить след. команду
bsf PORTB,1 ; DATA = 1
bsf PORTB,2 ; CLOCK = 1
bcf PORTB,2 ; CLOCK = 0
rrf COM_B,1 ; COM_B = COM_B >> 1
decfsz COUNT,1 ; COUNT = COUNT - 1
goto com_loop ;
; загружаем данные на дисплей (LOAD)
bsf PORTB,0 ; LOAD = 1
bcf PORTB,0 ; LOAD = 0
; включаем дисплей (BLANK)
bcf PORTB,3 ; BLANK = 0
;--------------------------------------------------
end
PIC16F628A
Re: Подключение PIC к PT6523
да вроде я так и делал.
только я на Си...
пробовал сначала data потом соманду и наоборот... там в даташите в двух местах по разному вроде нарисовано.
светятся все сегменты и всё. не гасятся нифига.
blank не использую. да он и в панельке не задействован. вывод вроде в воздухе висит..
попробую твой текст, его в mplab?
только я на Си...
пробовал сначала data потом соманду и наоборот... там в даташите в двух местах по разному вроде нарисовано.
светятся все сегменты и всё. не гасятся нифига.
blank не использую. да он и в панельке не задействован. вывод вроде в воздухе висит..
попробую твой текст, его в mplab?
Re: Подключение PIC к PT6523
В какой среде делаешь? Прикрепи листинг и схему.
Там надо придерживаться схемы отправки со стр. 11. Я тоже сначала не понял в чем прикол. Оказалось, автор имел ввиду, что когда ты кидаешь D1 (стр. 11), он улетает на первый бит данных (стр. 14), D2 на второй, D3 на третий и т.д. А на стр. 14 изобразили стандартную нумерацию битов - младшие справа, старшие слева. Короче заполнение идет справа налево. Вот такая пьянка
BLANK, если я правильно понял, гасит (1) или зажигает (0) дисплей . RESET на землю подтянут? TEST в оригинальной схеме (на майфуне) на че подтянут?
Проверял в MPLab, да.
Там надо придерживаться схемы отправки со стр. 11. Я тоже сначала не понял в чем прикол. Оказалось, автор имел ввиду, что когда ты кидаешь D1 (стр. 11), он улетает на первый бит данных (стр. 14), D2 на второй, D3 на третий и т.д. А на стр. 14 изобразили стандартную нумерацию битов - младшие справа, старшие слева. Короче заполнение идет справа налево. Вот такая пьянка
BLANK, если я правильно понял, гасит (1) или зажигает (0) дисплей . RESET на землю подтянут? TEST в оригинальной схеме (на майфуне) на че подтянут?
Проверял в MPLab, да.
PIC16F628A
Re: Подключение PIC к PT6523
делаю в mikroC
в оригинальной схеме и blank и test сидят на gnd.
reset как в даташите.
схема и исходники на основе того что было в этой теме.
по осцилографу вроде всё нормально передаётся
в оригинальной схеме и blank и test сидят на gnd.
reset как в даташите.
схема и исходники на основе того что было в этой теме.
по осцилографу вроде всё нормально передаётся
Код: Выделить всё
unsigned short i, j, OLD_B;
void set_address()
{
for (i = 0; i < 4; i++)
{
OLD_B.F7 = 0;
PORTB = OLD_B;
OLD_B.F4 = 1;
PORTB = OLD_B;
OLD_B.F4 = 0;
PORTB = OLD_B;
}
}
void set_display()
{
PORTB = OLD_B;
for (i = 0; i < 50; i++)
{
if (i == j)
{
OLD_B.F7 = 1;
}
else
{
OLD_B.F7 = 0;
}
PORTB = OLD_B;
OLD_B.F4 = 1;
PORTB = OLD_B;
OLD_B.F4 = 0;
PORTB = OLD_B;
}
}
void set_control()
{
OLD_B.F4 = 0; //CLOCK в 0
OLD_B.F7 = 0;
OLD_B.F6 = 0; //CE в 0
PORTB = OLD_B; //Передаем значение в порт
OLD_B.F6 = 1; //CE в 1
PORTB = OLD_B;
OLD_B.F6 = 0; //CE в 0
PORTB = OLD_B;
}
void main()
{
CMCON = 0x7; //все компараторы отключены
PORTA = 0b00000000; //данные порта А
TRISA = 0b00000000; //настройка порта А
PORTB = 0b00000000; //данные порта В
TRISB = 0b00000000; //настройка порта В
OLD_B = 0b00000000;
while(1)
{
for (j = 0; j < 50; j++)
{
set_display();
set_control();
Delay_ms(250);
}
}
}
Re: Подключение PIC к PT6523
Вобщем-то, не удивительно, что схема не работает. Код полностью не рабочий. Скопировали не разобравшись.
Примеры... Делают тоже самое, только на Си (среда mikroC). Поскольку схемки я так и не увидел, использовал подключение портов по умолчанию (в начале кода подписано какой порт и за что отвечает).
Пример программы, гореть будут все сегменты на COM-A + светодиод
Вариант посложнее, будут гореть только первые 9 сегментов COM-A + светодиод
P.S.: На будущее - оформляйте код соответствующим тегом (кнопка CODE) и в соответствии с правилами
Примеры... Делают тоже самое, только на Си (среда mikroC). Поскольку схемки я так и не увидел, использовал подключение портов по умолчанию (в начале кода подписано какой порт и за что отвечает).
Пример программы, гореть будут все сегменты на COM-A + светодиод
Код: Выделить всё
unsigned short i, OLD_B, COM_B;
// B0 - LOAD
// B1 - DATA
// B2 - CLOCK
// B3 - BLANK
void main()
{
CMCON = 0x07;
PORTA = 0x00;
PORTB = 0x00;
TRISA = 0x00;
TRISB = 0x00;
OLD_B = 0x00;
COM_B = 0x02; //0x02 для COM-A
//0x03 для COM-B
while(1)
{
for (i = 0; i < 41; i++)
{
OLD_B.F1 = 1; //DATA = 1
PORTB = OLD_B;
OLD_B.F2 = 1;
PORTB = OLD_B; //CLOCK = 1
OLD_B.F2 = 0;
PORTB = OLD_B; //CLOCK = 0
}
for (i = 0; i < 4; i++)
{
OLD_B.F1 = (COM_B >> i) & (0x01); //DATA
PORTB = OLD_B;
OLD_B.F2 = 1;
PORTB = OLD_B; //CLOCK = 1
OLD_B.F2 = 0;
PORTB = OLD_B; //CLOCK = 0
}
OLD_B.F0 = 1;
PORTB = OLD_B; //LOAD = 1
OLD_B.F0 = 0;
PORTB = OLD_B; //LOAD = 0
OLD_B.F3 = 0;
PORTB = OLD_B; //BLANK = 0
Delay_ms(1000);
}
}
Код: Выделить всё
unsigned short i, j, OLD_B, COM_B;
// B0 - LOAD
// B1 - DATA
// B2 - CLOCK
// B3 - BLANK
void main()
{
CMCON = 0x07;
PORTA = 0x00;
PORTB = 0x00;
TRISA = 0x00;
TRISB = 0x00;
OLD_B = 0x00;
COM_B = 0x02; //0x02 для COM-A
//0x03 для COM-B
while(1)
{
for (i = 0; i < 10; i++)
{
OLD_B.F1 = 1; //DATA = 1
PORTB = OLD_B;
OLD_B.F2 = 1;
PORTB = OLD_B; //CLOCK = 1
OLD_B.F2 = 0;
PORTB = OLD_B; //CLOCK = 0
}
for (j = i; j < 41; j++)
{
OLD_B.F1 = 0; //DATA = 0
PORTB = OLD_B;
OLD_B.F2 = 1;
PORTB = OLD_B; //CLOCK = 1
OLD_B.F2 = 0;
PORTB = OLD_B; //CLOCK = 0
}
for (i = 0; i < 4; i++)
{
OLD_B.F1 = (COM_B >> i) & (0x01); //DATA
PORTB = OLD_B;
OLD_B.F2 = 1;
PORTB = OLD_B; //CLOCK = 1
OLD_B.F2 = 0;
PORTB = OLD_B; //CLOCK = 0
}
OLD_B.F0 = 1;
PORTB = OLD_B; //LOAD = 1
OLD_B.F0 = 0;
PORTB = OLD_B; //LOAD = 0
OLD_B.F3 = 0;
PORTB = OLD_B; //BLANK = 0
Delay_ms(1000);
}
}
PIC16F628A
Re: Подключение PIC к PT6523
нифига не работает.
и мой код и твой принципиально рабатающие (возможно я что то удалил когда выкладывал, а так не знаю с чего он показался не работающим ). то есть портами дёргают как надо. но вот только работать дисплей не хочет.
пример работы твоего кода на картинке
сверху вниз
Load
Data
clock
с бланком всё таки разобрался. он сидит на земле. плохо что родной схемы магнитолы не нашёл.
предположительно это панель от pioneer keh8250
и мой код и твой принципиально рабатающие (возможно я что то удалил когда выкладывал, а так не знаю с чего он показался не работающим ). то есть портами дёргают как надо. но вот только работать дисплей не хочет.
пример работы твоего кода на картинке
сверху вниз
Load
Data
clock
с бланком всё таки разобрался. он сидит на земле. плохо что родной схемы магнитолы не нашёл.
предположительно это панель от pioneer keh8250
Re: Подключение PIC к PT6523
В твоем коде слишком много ошибок, чтобы он работал. Взять хотя бы функцию set_display(), и цикл на 50. Откуда? У тебя 1 бит светодиода + 40 бит для сегментов + 4 бита команды, итого - 45 бит максимум. Функция set_control() - без комменатриев. Вообще не понятно что и куда шлет. Возможно пытается совратить контроллер дисплея на что-то не хорошее. Наверно ты хотел использовать функцию set_address() - вот она более похожа на правду, да только у тебя все 4 бита комманды - 0. Такого варианта в DS нет. И опять же нет LOAD'a. Вобщем, это только основные моменты, если не углубляться в мелочи. Вот и думай - рабочий твой код или нет.
Диаграмма, вобщем-то, ничего нового не дала. На ней все так, как и должно быть. Разве что тайминги другие (на частоте 4МГц тайминги немного другие), но в данном случае это не принципиально. Уже который пост хочется схему посмотреть, на каких портах и что болтается.
Диаграмма, вобщем-то, ничего нового не дала. На ней все так, как и должно быть. Разве что тайминги другие (на частоте 4МГц тайминги немного другие), но в данном случае это не принципиально. Уже который пост хочется схему посмотреть, на каких портах и что болтается.
PIC16F628A
Re: Подключение PIC к PT6523
схема:
B7-data
B6-load
B5-blank
B4-clock
страшное количество ошибок это следствие пробования всяких вариантов. не существенно это всё.
может что то с контроллером дисплея?
попробол другую панель, на OKI M6455 от панасоника R3035. заработала сразу.
там правда немного другой алгоритм. первые 4-ре строба данные не обрабатываются, потом 42 бита сегментов и бит перключающий группу сегментов coma/comb. вобщем если интересно даташит выкладывал.
а с M6606 что то не то, опять таки почему светятся все сегменты...
B7-data
B6-load
B5-blank
B4-clock
страшное количество ошибок это следствие пробования всяких вариантов. не существенно это всё.
может что то с контроллером дисплея?
попробол другую панель, на OKI M6455 от панасоника R3035. заработала сразу.
там правда немного другой алгоритм. первые 4-ре строба данные не обрабатываются, потом 42 бита сегментов и бит перключающий группу сегментов coma/comb. вобщем если интересно даташит выкладывал.
а с M6606 что то не то, опять таки почему светятся все сегменты...
Re: Подключение PIC к PT6523
Вобщем-то, я просил всю схему (можно было бы даже к схеме дополнительно фотку в железе приложить или даже несколько, чтоб посмотреть, насколько практика с теорией у тебя совпадают). Ну да ладно, дело твое. Надеюсь ты в коде не забыл порты поменять, т.к. у меня по умолчанию стоят другие.andm писал(а):схема:
B7-data
B6-load
B5-blank
B4-clock
Начинай все еще раз проверять - порты, код, схему, соединения и питание. В слепую трудно что-то конкретное сказать. Причин может быть тысяча - может на ресете кондер отсох, может контроллеру не хватает питания и он захлебывается во время передачи, может сам PIC сдох или еще че где отвалилось и т.д. и т.п. Смерть контроллера дисплея маловероятна (ты вроде писал, что клавиатура сканируется), хотя кто знает как его пытали Как вариант:
1. Можешь взять листинг, где на все сегменты выставляются в 1 и поменять на 0. И посмотреть - погаснут, не погаснут...
2. Поиграться с COM_B (0x02 или 0x03), за отсутствием схемы не знаю что и где у тебя висит (мож все на CОM-B висит, а мы на COM-A ломимся)
PIC16F628A