Подключение PIC к PT6523

Подключение разных дисплейчиков
andm
Читатель
Читатель
Сообщения: 10
Зарегистрирован: 02 сен 2010, 11:47

Re: Подключение PIC к PT6523

Сообщение andm »

Mixer писал(а):Допустим есть дисплей, состоящий из 2х символов. Каждый символ - 7 палочек (сегментов) + точка. Т.е., чтобы отобразить нам что-то на дисплее, надо отправить на контроллер 2 байта (2 * 8 бит) состояния этих сегментов. Допустим нам надо отобразить цифру "12". Чтобы переконвертировать это число в формат дисплея, сначала берем "1" (кидаем в аккумулятор) и вызываем conv_table. Все, теперь в аккумуляторе у нас сконвертированный байт для дисплея (0x9F). Отправляем на контроллер дисплея. Тоже самое делаем с "2". Вобщем, я к чему клоню. На контроллер всегда отправляется последовательность 0 и 1, который всегда можно разбить на части. С 0 по 7 бит, допустим, будет первый символ, с 8 по 15 - второй символ и т.д. Берешь по одной циферке, вызываешь таблицу и отправляешь полученные данные на контроллер. Если кроме цифр нужно конвертить что-то еще (шкала уровня звука и т.д.) - можно для них написать отдельную таблицу. Не знаю, понятно написал или нет... :roll:
спасибо, хорошо разъясняешь. но только я пока не завёл дисплей. не хочет работать ни в какую. 6606 который. светятся всегда все сегменты. вход гашения экрана работает. тактовый генератор работает, клавиатура сканируется, а на команды/данные не реагирует...
Mixer
инженер, читатель
инженер, читатель
Сообщения: 70
Зарегистрирован: 27 ноя 2009, 00:45

Re: Подключение PIC к PT6523

Сообщение Mixer »

По какой схеме собирал? Какая программа у тебя?

Вобщем полистал даташит. Делаешь так:
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
Вариант посложнее, будут гореть только первые 9 сегментов 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			; команда
	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
andm
Читатель
Читатель
Сообщения: 10
Зарегистрирован: 02 сен 2010, 11:47

Re: Подключение PIC к PT6523

Сообщение andm »

да вроде я так и делал.
только я на Си...
пробовал сначала data потом соманду и наоборот... там в даташите в двух местах по разному вроде нарисовано.
светятся все сегменты и всё. не гасятся нифига.

blank не использую. да он и в панельке не задействован. вывод вроде в воздухе висит..

попробую твой текст, его в mplab?
Mixer
инженер, читатель
инженер, читатель
Сообщения: 70
Зарегистрирован: 27 ноя 2009, 00:45

Re: Подключение PIC к PT6523

Сообщение Mixer »

В какой среде делаешь? Прикрепи листинг и схему.

Там надо придерживаться схемы отправки со стр. 11. Я тоже сначала не понял в чем прикол. Оказалось, автор имел ввиду, что когда ты кидаешь D1 (стр. 11), он улетает на первый бит данных (стр. 14), D2 на второй, D3 на третий и т.д. А на стр. 14 изобразили стандартную нумерацию битов - младшие справа, старшие слева. Короче заполнение идет справа налево. Вот такая пьянка :lol:
BLANK, если я правильно понял, гасит (1) или зажигает (0) дисплей . RESET на землю подтянут? TEST в оригинальной схеме (на майфуне) на че подтянут?

Проверял в MPLab, да.
PIC16F628A
andm
Читатель
Читатель
Сообщения: 10
Зарегистрирован: 02 сен 2010, 11:47

Re: Подключение PIC к PT6523

Сообщение andm »

делаю в mikroC
в оригинальной схеме и 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);

  }
  }
}
Mixer
инженер, читатель
инженер, читатель
Сообщения: 70
Зарегистрирован: 27 ноя 2009, 00:45

Re: Подключение PIC к PT6523

Сообщение Mixer »

Вобщем-то, не удивительно, что схема не работает. Код полностью не рабочий. Скопировали не разобравшись.
Примеры... Делают тоже самое, только на Си (среда 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);
  }
}
Вариант посложнее, будут гореть только первые 9 сегментов COM-A + светодиод

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

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);
  }
}
P.S.: На будущее - оформляйте код соответствующим тегом (кнопка CODE) и в соответствии с правилами ;)
PIC16F628A
andm
Читатель
Читатель
Сообщения: 10
Зарегистрирован: 02 сен 2010, 11:47

Re: Подключение PIC к PT6523

Сообщение andm »

нифига не работает.
и мой код и твой принципиально рабатающие (возможно я что то удалил когда выкладывал, а так не знаю с чего он показался не работающим :) ). то есть портами дёргают как надо. но вот только работать дисплей не хочет.
пример работы твоего кода на картинке
сверху вниз
Load
Data
clock
с бланком всё таки разобрался. он сидит на земле. плохо что родной схемы магнитолы не нашёл.
предположительно это панель от pioneer keh8250
Вложения
Безымянный_1.jpg
Mixer
инженер, читатель
инженер, читатель
Сообщения: 70
Зарегистрирован: 27 ноя 2009, 00:45

Re: Подключение PIC к PT6523

Сообщение Mixer »

В твоем коде слишком много ошибок, чтобы он работал. Взять хотя бы функцию set_display(), и цикл на 50. Откуда? У тебя 1 бит светодиода + 40 бит для сегментов + 4 бита команды, итого - 45 бит максимум. Функция set_control() - без комменатриев. Вообще не понятно что и куда шлет. Возможно пытается совратить контроллер дисплея на что-то не хорошее. Наверно ты хотел использовать функцию set_address() - вот она более похожа на правду, да только у тебя все 4 бита комманды - 0. Такого варианта в DS нет. И опять же нет LOAD'a. Вобщем, это только основные моменты, если не углубляться в мелочи. Вот и думай - рабочий твой код или нет.

Диаграмма, вобщем-то, ничего нового не дала. На ней все так, как и должно быть. Разве что тайминги другие (на частоте 4МГц тайминги немного другие), но в данном случае это не принципиально. Уже который пост хочется схему посмотреть, на каких портах и что болтается.
PIC16F628A
andm
Читатель
Читатель
Сообщения: 10
Зарегистрирован: 02 сен 2010, 11:47

Re: Подключение PIC к PT6523

Сообщение andm »

схема:
B7-data
B6-load
B5-blank
B4-clock

страшное количество ошибок это следствие пробования всяких вариантов. не существенно это всё.
может что то с контроллером дисплея?
попробол другую панель, на OKI M6455 от панасоника R3035. заработала сразу.
там правда немного другой алгоритм. первые 4-ре строба данные не обрабатываются, потом 42 бита сегментов и бит перключающий группу сегментов coma/comb. вобщем если интересно даташит выкладывал.
а с M6606 что то не то, опять таки почему светятся все сегменты...
Mixer
инженер, читатель
инженер, читатель
Сообщения: 70
Зарегистрирован: 27 ноя 2009, 00:45

Re: Подключение PIC к PT6523

Сообщение Mixer »

andm писал(а):схема:
B7-data
B6-load
B5-blank
B4-clock
Вобщем-то, я просил всю схему (можно было бы даже к схеме дополнительно фотку в железе приложить или даже несколько, чтоб посмотреть, насколько практика с теорией у тебя совпадают). Ну да ладно, дело твое. Надеюсь ты в коде не забыл порты поменять, т.к. у меня по умолчанию стоят другие.

Начинай все еще раз проверять - порты, код, схему, соединения и питание. В слепую трудно что-то конкретное сказать. Причин может быть тысяча - может на ресете кондер отсох, может контроллеру не хватает питания и он захлебывается во время передачи, может сам PIC сдох или еще че где отвалилось и т.д. и т.п. Смерть контроллера дисплея маловероятна (ты вроде писал, что клавиатура сканируется), хотя кто знает как его пытали :lol: Как вариант:
1. Можешь взять листинг, где на все сегменты выставляются в 1 и поменять на 0. И посмотреть - погаснут, не погаснут...
2. Поиграться с COM_B (0x02 или 0x03), за отсутствием схемы не знаю что и где у тебя висит (мож все на CОM-B висит, а мы на COM-A ломимся)
PIC16F628A
Ответить