MicroCHIP.RU
Главная Документация Отладочные средства Справочник Поиск Ссылки
 Новости   Конференция   Контакты 
 

Знакогенератор

 Нoвaя темa  |  Наверх  |  Перейти к теме  |  Поиск  |  Правила  |  Вход 

ВНИМАНИЕ!
Вы просматриваете архив форума.

Этот форум работает только в режиме просмотра и поиска.

Действующий форум переведен на новый движок и
находится по адресу www.microchip.su

 Знакогенератор
Автор: Vangard ()
Дата:   22/02/2007 22:05

Короч делаю бегущую строку, и чёт не могу понять как
осуществить знакогенератор для неё...
приходит к примеру от клавы код буквы "р" к примеру 0x10
над чтоб из таблицы всех символов выбралась буква "р" и для
неё значения которые будут посылаться на дешифратор для
матрицы... как сделать ету таблицу, и какими командами
пользоваться чтоб производился выбор из етой таблицы...
Контроллер PIC16F877


 
 Много бегущих строк будет в этом году (+)
Автор: victor_sadv ()
Дата:   22/02/2007 22:31

Даже на Electronix.ru их делают.
Знакогенератор проще всего расположить в памяти программ инструкцией retlw. Я для этого сспециально софт
писал где символы в 1251 рисовал чтоб не забивать 4096 retlw ручками.
Каков размер ваших символов?
Сделайте вычисляемый переход по PCL и PCLATH - кажется при модификации PCL - PCH перезагружается щас
посмотрю кусок кода вот например на 8x16 точечные символы:
	ORG h'800'		;вторая страница в PCLATH поместить h'08'


GET_SYMBOL
	movf SYMBOL_CODE, w
	bsf STATUS, RP0
	movwf OP_REG_S1
	rlf OP_REG_S1, f
	rlf OP_REG_S1, f
	rlf OP_REG_S1, f
	rlf OP_REG_S1, f
	movlw b'11110000'
	andwf OP_REG_S1, f
	bcf STATUS, RP0
	movf SYMBOL_CODE, w
	bsf STATUS, RP0
	movwf OP_REG_S2
	rrf OP_REG_S2, f
	rrf OP_REG_S2, f
	rrf OP_REG_S2, f
	rrf OP_REG_S2, f
	movlw b'00001111'
	andwf OP_REG_S2, f
	bsf OP_REG_S2, 4
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL1
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL2
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL3
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL4
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL5
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL6
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL7
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL8
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL9
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL10
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL11
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL12
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL13
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL14
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL15
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL16
	clrf STATUS
	return


GET_SYMBOL_BYTE
	movf OP_REG_S2, w
	movwf PCLATH
	movf OP_REG_S1, w
	movwf PCL

ORG h'1000' ; вот здесь должен начаться знакогенератор 16 байт на символ подряд 16*256 команд retlw

обратите внимание на GET_SYMBOL_BYTE - удачи!


 
 Re: Много бегущих строк будет в этом году (+)
Автор: Vangard ()
Дата:   22/02/2007 22:41

у меня символы 8x6 ... буква "а" к примеру...

000011
000101
001001
010001
010001
011111
010001
010001




 
 Re: Много бегущих строк будет в этом году (+)
Автор: Vangard ()
Дата:   22/02/2007 23:21

Спасибо... буду разбераться..., пока чёт сходу непонятно как
всё устроенно


 
 Re: Много бегущих строк будет в этом году (+)
Автор: Vangard ()
Дата:   22/02/2007 23:35

Скажи плиз что у тя такое OP_REG_S1
и зачем оно у тя сдвигается потом на 4 позиции.

а если не трудно разъясни как работает твой алгоритм.. не
пойму чёт



Отправка отредактированного (22/02/2007 23:38)


 
 Пояснение (+)
Автор: victor_sadv ()
Дата:   23/02/2007 11:12

OP_REG_S1, OP_REG_S2 - типа временные регистры или TEMP-ы из которых
получаю адрес "байта символа" (инструкции retlw h'xx' в которой
1/16 каждого символа).
Знакогенератор в 3 и 4 странице памяти программ начиная с
h'1000'.
OP_REG_S1 - считается для PCL, OP_REG_S2 для PCLATH.
SYMBOL_CODE - код символа в 1251 кодировке.
Так как у меня 16 байт на символ сдвиг на 4 позиции - типа
умножение на 16, потом маска для сброса младших бит.
Далее из SYMBOL_CODE вычисляю адрес для PCH только сдвигаю в
другую сторону.
Короче новый символ начинается через шестнадцать байт
значит чтобы получить адрес первого байта символа надо
SYMBOL_CODE занести в счетчик команд, сдвинуть влево на 4 бита и
сбросить младшие биты. Ещё корекция по страницам (bsf OP_REG_S2,
4).
Далее вызов call GET_SYMBOL_BYTE (!) где загружается счётчик
команд (при модификации PCL - PCH перезагружается из PCLATH.
Возврат с байтом происходит в место после вызова
call GET_SYMBOL_BYTE.
Далее инкремент регистра OP_REG_S1 и "вызов" следующего байта и
так до 16.
Результат в регистрах DATA_SYMBOL1-DATA_SYMBOL16.


 
 Пардон (+)
Автор: victor_sadv ()
Дата:   23/02/2007 11:16

Знакогенератор во 2 и 3 странице памяти программ (нумерация с
0).


 
 Re: Пардон (+)
Автор: Vangard ()
Дата:   23/02/2007 13:31

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

короч приходит код 0x1F (00011111)
GET_SYMBOL
	movf SYMBOL_CODE, w  ;00011111 в w
	bsf STATUS, RP0      ;установка регистра
	movwf OP_REG_S1      ;00011111 в OP_REG_S1 
	rlf OP_REG_S1, f     ;00111110
	rlf OP_REG_S1, f     ;01111100
	rlf OP_REG_S1, f     ;11111000
	rlf OP_REG_S1, f     ;11110001
	movlw b'11110000'    ;загрузка константы
	andwf OP_REG_S1, f   ;11110000 остаётся от кода
	bcf STATUS, RP0      ;сброс бита в регистре
	movf SYMBOL_CODE, w  ;00011111 в w
	bsf STATUS, RP0      ;установка регистра
     	movwf OP_REG_S2      ;00011111 в OP_REG_S2
	rrf OP_REG_S2, f     ;10001111
	rrf OP_REG_S2, f     ;11000111
	rrf OP_REG_S2, f     ;11100011
	rrf OP_REG_S2, f     ;11110001
	movlw b'00001111'    ;загрузка константы 00001111
	andwf OP_REG_S2, f   ;00000001 остаётся
	bsf OP_REG_S2, 4     ; установка бита
	movlw h'08'          ;запись константы 00001000
	movwf PCLATH         ;запись 00001000 в PCLATH
	call GET_SYMBOL_BYTE ;переход на подпрограмму GET_SYMBOL_BYTE
	movwf DATA_SYMBOL1
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL2
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL3
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL4
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL5
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL6
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL7
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL8
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL9
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL10
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL11
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL12
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL13
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL14
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL15
	incf OP_REG_S1, f
	movlw h'08'
	movwf PCLATH
	call GET_SYMBOL_BYTE
	movwf DATA_SYMBOL16
	clrf STATUS
	return


GET_SYMBOL_BYTE
	movf OP_REG_S2, w ;00000001 в w
	movwf PCLATH      ;000100000000001 так что ли там будет?
	movf OP_REG_S1, w ;11110000 в w
	movwf PCL         ;11110000 в PCL (потом возвращение из 
подпрограммы? а дальше чет не пойму..


и как я понял в етом алгоритме происходит анализ кода после
чего
будет выбираться нужный символ в знакогенераторе ... так ето?



Отправка отредактированного (23/02/2007 14:25)


 
 Re: Пардон (+)
Автор: Vangard ()
Дата:   23/02/2007 13:46

так а почему у тебя код в 16байт а не 8байт?


 
 Re: Пардон (+)
Автор: Vangard ()
Дата:   23/02/2007 15:45

Короч попробовал забить твой кусок проги написать начало и
конец, чтоб глянуть у тя всё работает и нефига не запускается
:_(


 
 Ответ(+)
Автор: victor_sadv ()
Дата:   23/02/2007 15:54

Vangard писал:
GET_SYMBOL_BYTE
	movf OP_REG_S2, w ;00000001 в w
	movwf PCLATH      ;000100000000001 так что ли там будет?
	movf OP_REG_S1, w ;11110000 в w
	movwf PCL         ;11110000 в PCL (потом возвращение из 
подпрограммы? а дальше чет не пойму..


В момент перехода к GET_SYMBOL_BYTE в OP_REG_S2 (по приведённым мною
коду и вашим комментарриям) будет b'00010001' (у вас ошибочка
вышла вы не учли - bsf OP_REG_S2, 4)
А в OP_REG_S1 правильно - будет b'11110000' (то в общем случае в
счётчике комманд (10001111110000 - это адрес первого байта
символа "1" в кодировке 1251 Windows. 10001111110001 второй байт
символа "1" и т. д.
В этом куске программы выбираютсься шестнадцать байт(!)
ОДНОГО СИМВОЛА! (у меня строка была 16x128) Результат в
регистрах DATA_SYNMBOL1-DATA_SYNMBOL16.
Если надо восемь байт на символ скоректируйте код.
Кстати в моём проекте использовалась SRAM К537РУ2 как буффер и
видеопамять.


 
 Re: Пардон (+)
Автор: Vangard ()
Дата:   23/02/2007 16:59

Я хочу сделать так: по вертикале поставить или дешифратор 3-в-
8 или регист на 8выходов. По горизонтале сдвиговые регистры

Больше склоняюсь в регистру чтоб не пробегать по столбцу по 1
диоду, а сразу жажигать столбец



Отправка отредактированного (23/02/2007 17:00)


 
 Re: Ответ(+)
Автор: Vangard ()
Дата:   23/02/2007 17:59

ВО дорубил как происходит всё)
СПАСИБО те огромное... мож ещё чё спрошу)


 
 Re: Ответ(+)
Автор: Vangard ()
Дата:   23/02/2007 18:05

Кста у мну в моей строке хочу к МК подключать клаву от компа
через PS/2... и как я там понял у каждой кнопки имеется свой
скан код, у тя так и была устроена строка?
И ещё... скан код кн. с англ. раскладки совподает с руск.
раскладкой?



Отправка отредактированного (23/02/2007 18:08)


 
 Re: Ответ(+)
Автор: Vangard ()
Дата:   23/02/2007 18:18

как у тя в счётчике команд получилось 10001111110000?


 
 Re: Ответ(+)
Автор: Vangard ()
Дата:   23/02/2007 18:35

Вот к примеру моя буква "А" содержит (0x1F, 0x24, 0x44, 0x84, 0xFF,
0x00) ет для горизонтального регистра...

вот визуально:
000110
001010
010010
100010
100010
111110
100010
100010

тоесть на регистр надо послать 00011111 00100100 01000100 10000100
11111111 00000000 , как ето всё запихнуть в RETLW не пойму


 
 Стока энтузазизмууу (+)
Автор: Petr_ ()
Дата:   23/02/2007 18:42

Это хорошо.
Тока твоя идея с свечением столбца не очень...
Надо чтоб одновременно светилось как можно больше светодиодов.
Дабы яркость была.
Поэтому лучше регенерить вертикально (чтоб светилась строка)


 
 Re: Стока энтузазизмууу (+)
Автор: Vangard ()
Дата:   23/02/2007 18:47

Я думаю норм будет и со столбцами...

Кто занимался разработкой строки может написать план
проги... ну типа:
- Настройка портов
- Назначение адресов
.
.
.
- Обработка кода
- Таблица знаков
-
- ит.д.
большая яркость не оч нужна т.к. висеть в комнате будет.



Отправка отредактированного (23/02/2007 18:48)


 
 Тебе мой план не поможет (+)
Автор: Petr_ ()
Дата:   23/02/2007 18:58

Ты лучше к совету прислушайся (про регенерацию).
О схемотехнике подумай (почитай про это побольше, примеры там всякие)
И С поучи (хоть на примере бегущей строки)
А то твой план ....ээээ... хорошо мне делать нечего и настрой плохой...
А то бы ты и дальше своим планом гордился.


 
 Re: Тебе мой план не поможет (+)
Автор: Vangard ()
Дата:   23/02/2007 19:25

Что лучше поставить по горизонтале и по вертикале ? какие
микросхемы?


 
 Re: Тебе мой план не поможет (+)
Автор: Romchik ()
Дата:   24/02/2007 07:08

"И С поучи (хоть на примере бегущей строки)"
По вашему на ассемблере такое не реализовать? :)


 
 Re: Тебе мой план не поможет (+)
Автор: NSS ()
Дата:   24/02/2007 07:32

Слушай, что тебе Petr говорит - он тебе правильный совет даёт. На столбцы (вертикалЕ (гы, прикольное
словцо)) поставь сдвиговые регистры - получишь одну микруху на 8 столбцов, а строки (горизонталЕ
(есчто одно прикольное... Гы)) коммутируй мощными транзисторами, мосфетами например.

"Ignoramus et ignorabimus..."
(Не знаем и не будем знать...)



 
 было дело
Автор: back ()
Дата:   24/02/2007 07:55

http://www.microchip.ru/phorum/read.php?f=2&i=26756&t=26748


 
 Вовсе нет (+)
Автор: Petr_ ()
Дата:   24/02/2007 11:14

На asm можно сделать что угодно.
Только не нужно! (в первую очередь самому разработчику)

Это как рисование картинок...
Можно же попиксельно. Какие проблемы.. Можно нарисовать что угодно.
И 3D - без вопросов. Да и киношку (которая с живыми актерами) можно...
Но люди придумали и Photoshop и Corel и 3D-MAX.
Во дураки... надо было попиксельно.


 
 У меня чисто на АСМ-е (+)
Автор: victor_sadv ()
Дата:   24/02/2007 11:15

Быстродействие - впритык.
1. Програмное обращение к SRAM.
2. Один кадр 512 - байт побитовая перетасовка.
3. UART - 115200 - по прерываниям.
4. Скан - 125 герц по восемь столбцов.
И это с резонатором на 20 метров.
Либо на C писать с бюольшим количеством ASM вставок.


 
 Это может выйти новый виток (+)
Автор: Petr_ ()
Дата:   24/02/2007 11:20

давней религиозной войны.
Вам достаточно было использовать 18-й пик на 40мГц и получили бы
большой запас по скорости и можно было бы использовать С без вставок.
Более того. После нескольких лет практики на С Вы бы написали код,
аналогичный по скоростным характеристикам асму.
Но Ваша строка приобрела бы кучу новых эффектов и возможностей
а срок разработки сократился бы раз в 20 (может и 50).

Но предлагаю это не обсуждать.
Чтоб не вызывать этот самый новый виток бесползных споров.


 
 К сведению - я не противник C (+)
Автор: victor_sadv ()
Дата:   24/02/2007 11:34

И сам активно его использую в последнее время (пытаюсь). И
данная задача делалась 1,5 года назад, когда о C для МК я
только левым ухом слышал.

P.S. И всё равно следующую строку писать буду на ASM (на PIC18) -
эффекты это удел не PIC-а (в моём случае) а PC - который
девайсом рулит.


 
 Тогда я бы посоветовал (+)
Автор: Petr_ ()
Дата:   24/02/2007 11:42

использовать ПЛИС.
Если комп делает графическую картинку сам,
то намного разумнее сделать на плиске видеопамять с доступом по USB
и быструю регенерацию с ШИМ. Это увеличит максимальное количество светодиодов
на 2/3 порядка и позволит иметь полутона (что может украсить девайс).
Реализовать поддержку USB только на ПЛИС можно, но потребует некоторого опыта.
Можно заюзать любую микросхему USB-паралельный интерфейс.
Тогда проект на ПЛИС превратится просто в детскую забаву.
2 часа и весь железный проект готов.
Ещё 2 часа и Ваш девайс показывает mpg4 видео.


 
 есть такое устойчивое мнение
Автор: Greg ()
Дата:   24/02/2007 11:43

victor_sadv писал(а):

> P.S. И всё равно следующую строку писать буду на ASM (на PIC18)
> -
> эффекты это удел не PIC-а (в моём случае) а PC - который
> девайсом рулит.

что если задача не ложится на язык Си - значит под эту задачу неправильно выбран кремний.
Потому что кремний со временем только дешевеет и дешевеет (при одновремнном повышении качества),
а вот отпущенное вам на эту жизнь время - наоборот...
(повышается в цене, потому что остаётся его всё меньше и меньше)


 
 Re: Тогда я бы посоветовал (+)
Автор: Max77 ()
Дата:   24/02/2007 12:09

Petr_ писал(а):

> Это увеличит максимальное
> количество светодиодов
> на 2/3 порядка

А с этого места можно поподробнее!
За счет чего можно с помощью ПЛИС увеличить количество СД в 1000 раз,
или имелось ввиду 6,67 раза, что тоже немало?


 
 ))) Это уж надо понять что такое ПЛИС (+)
Автор: Petr_ ()
Дата:   24/02/2007 12:20

Вкратце это же железная схема.
Берем 2-х портовую память.
Читаем её, сравниваем значение со счетчиком ШИМ, готовые пакеты пишем
в силовые регистры (или чо там у Вас). И это все на частоте 150мГц
за 1-н !!! такт. И при этом таких каналов у Вас 50.
(зависит от количества ног ПЛИСКи и вообще построения системы)

Тут количество светодиодов будет ограничиваться или количеством
ячеек памяти в кристалле (на распределенной памяти особо не сделаеш)
или геометрическими размерами блока.
Надо же чтобы плату можно было сделать и удобно было паять.

Простор для фантазии большой.
Любой процессор проигрывает на таких задачах в 1000 раз минимум.


 
 Re: ))) Это уж надо понять что такое ПЛИС (+)
Автор: Max77 ()
Дата:   24/02/2007 12:57

Petr_ писал(а):


> готовые пакеты пишем
> в силовые регистры (или чо там у Вас). И это все на частоте
> 150мГц
> за 1-н !!! такт.

А что есть такие регистры которые на 150 МГц работают.
Я, например, использовал STP16C596, у них 25 МГц максимум.

> И при этом таких каналов у Вас 50.
> (зависит от количества ног ПЛИСКи и вообще построения системы)

Т.е. как я понял с помощью ПЛИС делается 50 одновременно работающих SPI, и на каждый цепочка регистров.

Есть вопрос типа PICvsAVR, но все же Ваше мнение.
С каких ПЛИС лучше начать?
Ну и что лучше почитать для начала?


 
 Re: Тебе мой план не поможет (+)
Автор: Vangard ()
Дата:   24/02/2007 13:03

Petr_ спасибо.. обдумал твой замечание и усё понял)))


 
 Ты уж почитай про ПЛИС (+)
Автор: Petr_ ()
Дата:   24/02/2007 13:04

литературку. Много всего в сети найдеш.
А Altera или Xilinx - это без разницы.
Конечно среды разные и привыкать надо к модельным линейкам.
Можешь монету бросить - не прогадаеш.
VHDL одинаковый :)

А на 150мГц конечно не всякий регистр будет работать (хотя полно таких).
Да и не выйдет на такой частоте данные выталкивать (монтаж, емкость и т.д.)
Но плиска это может. А реально 10/50 - без проблем.

Про SPI ты правильно понял.


 
 Согласен может и не тот камень (+)
Автор: victor_sadv ()
Дата:   24/02/2007 14:44

Но он мне более-менее знаком.
А вообще смотря каков объём задачи тот проц и нужно брать.
Если в автобус то и на PIC16 можно сделать.
Что касается ПЛИС-ов в нашей "деревне" их точно не продают да
и масштабы не те. Изучать - тоже надо.
Вот лежат кстати "стадионные" платы на ATMega103 и ALTERA дрова на
TPIC6B595 для двухцветных кластеров как там работает не знаю
(вроде статика) но интерфейс вроде RS232 - 9600.
Господа про полутона подробнее пожалуйста. Что вам удалось
получить в этом направлении?