Форум по микроконтроллерам: ПП обработки символьной информации. - Форум по микроконтроллерам

Перейти к содержимому

  • 2 Страниц +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

ПП обработки символьной информации.

#1 Пользователь офлайн   nick14 

  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 465
  • Регистрация: 15 Февраль 11
  • ГородРыбинск

Отправлено 25 Июнь 2011 - 17:57

Здесь можно задать вопросы по подпрограмме обработки символьной информации.



.
0

#2 Пользователь офлайн   pictele 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 15
  • Регистрация: 05 Март 13
  • ГородОМСК

Отправлено 04 Февраль 2014 - 18:58

Никак не могу въехать в чтение таблиц в PIC18F452.
И вроде все ясно и ни черта не ясно.
Как организовать массив данных?
И как из него считать?
Мне бы попроще пример.
Вот преобразование в семисегментный индикатор.Дайте пожалуйста конкретный пример.

 
            db      B'11011110' ; DAGFADCH = '0'[0] 
            db      B'00000110' ; EEFABAFC = '1'[1]	
            db      B'11101100' ; DEFABGCH = '2'[2]	
            db      B'10101110' ; HAGFDECB = '3'[3]	
            db      B'00110110' ; DEFABGCH = '4'[4]	
            db      B'10111010' ; HAGFDECB = '5'[5]
            db      B'11111010' ; DEFABGCH = '6'[6]
            db      B'00001110' ; ECHDBAFG = '7'[7]
            db      B'11111110' ; DEFABGCH = '8'[8]
            db      B'10111110' ; DEFABGCH = '9'[9]
            db      B'00000000' ; DEFABGCH = ' '[10]
            db      B'00001000' ; DEFABGCH = '-'[12]
            db      B'10000000' ; DEFABGCH = '_'[13]

Как считать все это?
0

#3 Пользователь офлайн   nick14 

  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 465
  • Регистрация: 15 Февраль 11
  • ГородРыбинск

Отправлено 04 Февраль 2014 - 22:27

На ассемблере?
0

#4 Пользователь офлайн   pictele 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 15
  • Регистрация: 05 Март 13
  • ГородОМСК

Отправлено 05 Февраль 2014 - 04:07

Да.На ассемблере.

Делаю вот так.Считывает что ни попадя.
START
     		 call        xx
             goto        START
             db          0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,  
xx
           movlw      0x00             ;закладываем адрес
           movwf      tekst            ;символа  в регистр tekst
tekst_rw
           movff      TBLPTRL,tempL    ;в темп для последующего восстановления
           movff      TBLPTRH,tempH    ;в темп для последующего восстановления
           movff      TBLPTRU,tempU    ;в темп для последующего восстановления
           movff      tekst,TBLPTRL    ;копируем адрес символа в TBLPTRL 
                                       ;(младший байт адреса)
           clrf       TBLPTRL              ;указываем на расположения  
           clrf       TBLPTRH          ;начального адреса шрифта (01ХХ)
           clrf       TBLPTRU          ;верхней байт адреса 
           movlw      .8               ;закладка числа 8 (8 байт шрифта)
           movwf      temp_t1          ;в регистр temp_t1
           tblrd*                      ;Чтение байта указанного адреса
           movff      TABLAT,REGISTR 	;Заменил ХХХХ на REGISTR
           incf       TBLPTRL          ;+1 следующий блок шрифта 
           decfsz     temp_t1          ;проверяем сколько байт прочитано, если не все
           bra        $-.10            ;считываем следующий. 
           movff      tempL,TBLPTRL    ;восстанавливаем значение регистра из темп
           movff      tempH,TBLPTRH    ;восстанавливаем значение регистра из темп
           movff      tempU,TBLPTRU    ;восстанавливаем значение регистра из темп
           return
			end

Сообщение отредактировал pictele: 05 Февраль 2014 - 09:50

0

#5 Пользователь офлайн   nick14 

  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 465
  • Регистрация: 15 Февраль 11
  • ГородРыбинск

Отправлено 05 Февраль 2014 - 12:59

По вашей программе ...
  movff      tekst,TBLPTRL    ;копируем адрес символа в TBLPTRL 
                              ;(младший байт адреса)
  clrf   	TBLPTRL   		;указываем на расположения  


Зачем сбрасывать регистр TBLPTRL, Вы только перед этим записали в него адрес байта?
Таблица по какому адресу размещена?
0

#6 Пользователь офлайн   pictele 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 15
  • Регистрация: 05 Март 13
  • ГородОМСК

Отправлено 05 Февраль 2014 - 14:38

Просмотр сообщенияnick14 (05 Февраль 2014 - 12:59) писал:

По вашей программе ...
  movff      tekst,TBLPTRL    ;копируем адрес символа в TBLPTRL 
                              ;(младший байт адреса)
  clrf   	TBLPTRL   		;указываем на расположения  


Зачем сбрасывать регистр TBLPTRL, Вы только перед этим записали в него адрес байта?
Таблица по какому адресу размещена?

Поторопился немного.Не то написал.
Я все брал отсюда.http://chipmk.ru/Download/nick14/pp_hrift.zip
С вашего сайта.Вашу программу.http://chipmk.ru/index.php?option=com_content&view=article&id=151:2011-06-25-06-45-48&catid=93:raznoe&Itemid=61
Там тоже нет адреса таблицы.
Как его прописать?

Вот кусок,который мне нужен.
Что я делаю неправильно?
Считывает неизвестно что и откуда
db      0xDE,0x06,0xEC,0xAE,0x36,0xBA,0xFA,0x0E,0xFE,0xBE,0x00,0x08,0x80,0x0D,0x01,0x0F	
	   db      0x0F,0x07,0xED,0xAF,0x37,0xBB,0xFB,0x0F,0xFF,0xBF,0x01,0x0B,0x01,0x0D,0x01,0x0F  
xx
           movlw      0x04             ;закладываем адрес (с потолка пока)
           movwf      tekst            ;символа  в регистр tekst
tekst_rw
           movff      TBLPTRL,tempL    ;в темп для последующего восстановления
           movff      TBLPTRH,tempH    ;в темп для последующего восстановления
           movff      TBLPTRU,tempU    ;в темп для последующего восстановления
           movff      tekst,TBLPTRL    ;копируем адрес символа в TBLPTRL   
           clrf       TBLPTRH          ;
           clrf       TBLPTRU          ; 
           TBLRD*                      ;Чтение байта указанного адреса
	   movff      TABLAT,REGISTR 	;Перепишем в  REGISTR
           movff      tempL,TBLPTRL    ;восстанавливаем значение регистра из темп
           movff      tempH,TBLPTRH    ;восстанавливаем значение регистра из темп
           movff      tempU,TBLPTRU    ;восстанавливаем значение регистра из темп
           return

0

#7 Пользователь офлайн   nick14 

  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 465
  • Регистрация: 15 Февраль 11
  • ГородРыбинск

Отправлено 05 Февраль 2014 - 15:14

Таблиц может быть несколько в памяти программ, и по этому у них должны быть названия к примеру назавем вашу таблицу просто "Table".

Table
db 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F


Не надо писать ее в начале программы, лучше в конце . В таблице может быть много строк ...

Table 
db          0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F
db          0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F
db          0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F



Вы делаете на 18 мк по этому строка данных должна быть четной. Далее для считывания указываем адрес расположения таблицы. Его можно и не знать просто пишем ..


           	clrf 			TBLPTRU ; Cбрасываем верхний байт
   		movlw 		high (Table ); =Задание адреса ""
   		movwf        	TBLPTRH ;  старшего байта=
   		movlw      	low (Table ); =Задание адреса ""
   		movwf        	TBLPTRL ;  младшего байта=


И попадаем на начало таблицы "Table"
0

#8 Пользователь офлайн   nick14 

  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 465
  • Регистрация: 15 Февраль 11
  • ГородРыбинск

Отправлено 05 Февраль 2014 - 15:32

Цитата

С вашего сайта.Вашу программу.http://chipmk.ru/index.php?option=com_content&view=article&id=151:2011-06-25-06-45-48&catid=93:raznoe&Itemid=61
Там тоже нет адреса таблицы.


Посмотрел ... давно это было . На самом деле там есть адрес таблицы, верней таблица расположена по определенному, известному адресу 0100h. Намного проще написать с какого адреса расположить таблицу (если есть в этом необходимость) пишем org 0100h и далее сама таблица.
0

#9 Пользователь офлайн   pictele 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 15
  • Регистрация: 05 Март 13
  • ГородОМСК

Отправлено 05 Февраль 2014 - 15:57

Вот исправил.
Все такая же хня.
В REGISTR должно быть AE,а выводит FF

 call        xx
		org 0100h
	db      0xDE,0x06,0xEC,0xAE,0x36,0xBA,0xFA,0x0E,0xFE,0xBE,0x00,0x08,0x80,0x0D,0x01,0x0F	
	db      0x0F,0x07,0xED,0xAF,0x37,0xBB,0xFB,0x0F,0xFF,0xBF,0x01,0x0B,0x01,0x0D,0x01,0x0F  
xx
           movlw      0x04             ;закладываем адрес (с потолка пока)
           movwf      tekst            ;символа  в регистр tekst
tekst_rw
           movff      TBLPTRL,tempL    ;в темп для последующего восстановления
           movff      TBLPTRH,tempH    ;в темп для последующего восстановления
           movff      TBLPTRU,tempU    ;в темп для последующего восстановления
           movff      tekst,TBLPTRL    ;копируем адрес символа в TBLPTRL   
           clrf       TBLPTRH          ;
           clrf       TBLPTRU          ; 
           TBLRD*                      ;Чтение байта указанного адреса
movff      TABLAT,REGISTR 	;Перепишем в  REGISTR
           movff      tempL,TBLPTRL    ;восстанавливаем значение регистра из темп
           movff      tempH,TBLPTRH    ;восстанавливаем значение регистра из темп
           movff      tempU,TBLPTRU    ;восстанавливаем значение регистра из темп
           return

Сообщение отредактировал Ewgen: 05 Февраль 2014 - 16:55

0

#10 Пользователь офлайн   Алексашка 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 311
  • Регистрация: 26 Апрель 13
  • ГородМирный, РС (Якутия)

Отправлено 05 Февраль 2014 - 17:50

делал так при считывании таблицы
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

movlw LOW(Video) ; Задание адреса
movwf TBLPTRL ; младшего байта.
movlw high(Video) ; Задание адреса
movwf TBLPTRH ; старшего байта.
movlw upper(Video) ; Задание адреса
movwf TBLPTRU ; верхнего байта
clrf TEMP1
clrf TEMP2

movlw .256 ;устанавливаем количество записываемых символов
movwf adres_L ;
movlw .54 ;
movwf adres_H ;в МАХ7456
rrrr tblrd*+ ; Чтение таблицы. +1
movff TABLAT,bait ; копируем байт в регистр
call ZAPIS ; записать в EEPROM MAX7456


decfsz adres_L,F ; Организация циклов
goto rrrr
decfsz adres_H,F ; ------''------
goto rrrr
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; Символы от 0-255, каждый состоит из 54 байтов цветозадающей монохромной информации
; всего записываемых символьных данных в память MAX 13824 байта
; Они записываются в EEPROM память MAX7456
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Video

; Символ записываемый в NVM 0[54]
db 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55
db 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55
и так далее
0

#11 Пользователь офлайн   Алексашка 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 311
  • Регистрация: 26 Апрель 13
  • ГородМирный, РС (Якутия)

Отправлено 05 Февраль 2014 - 17:53

пост №7 Николай правильно показал, как считывать байт из таблицы, свою программу делал на основе выше указанных принципов.
0

#12 Пользователь офлайн   nick14 

  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 465
  • Регистрация: 15 Февраль 11
  • ГородРыбинск

Отправлено 05 Февраль 2014 - 18:42

Просмотр сообщенияpictele (05 Февраль 2014 - 15:57) писал:

Вот исправил.
Все такая же хня.



Вы немного не поняли. Если нужно выводить с определенного адреса к примеру 0100h тогда и записываем таблицу по этому адресу org 0100h . Но не обязательно этот адрес, это только в качестве примера и может быть совсем другой.... Но даже в вашем примере вы прописав таблицу по адресу обращаетесь в неизвестность...
По любому Вы должны прописать адрес в регистры TBLPTR.
0

#13 Пользователь офлайн   nick14 

  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 465
  • Регистрация: 15 Февраль 11
  • ГородРыбинск

Отправлено 05 Февраль 2014 - 18:43

Скиньте сюда ваш проект ... так будет быстрее.
0

#14 Пользователь офлайн   pictele 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 15
  • Регистрация: 05 Март 13
  • ГородОМСК

Отправлено 05 Февраль 2014 - 21:05

Проект.
Посмотрите.

Прикрепленные файлы

  • Прикрепленный файл  table.rar (18,65К)
    Количество загрузок:: 127

Сообщение отредактировал pictele: 05 Февраль 2014 - 21:06

0

#15 Пользователь офлайн   nick14 

  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 465
  • Регистрация: 15 Февраль 11
  • ГородРыбинск

Отправлено 05 Февраль 2014 - 22:03

Вот здесь "универсальный" вариант..

Прикрепленный файл  table.rar (19,98К)
Количество загрузок:: 133
0

#16 Пользователь офлайн   nick14 

  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 465
  • Регистрация: 15 Февраль 11
  • ГородРыбинск

Отправлено 05 Февраль 2014 - 22:06

И когда будете читать байт не забывайте, что адрес байта начинается с 00. Т.е. если Вы запрашиваете 0x04 это 5 байт из таблицы...
0

#17 Пользователь офлайн   pictele 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 15
  • Регистрация: 05 Март 13
  • ГородОМСК

Отправлено 06 Февраль 2014 - 04:44

Большое спасибо.
Все работает.
0

#18 Пользователь офлайн   nick14 

  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 465
  • Регистрация: 15 Февраль 11
  • ГородРыбинск

Отправлено 06 Февраль 2014 - 06:25

Главное что бы Вы поняли принцип......
0

#19 Пользователь офлайн   pictele 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 15
  • Регистрация: 05 Март 13
  • ГородОМСК

Отправлено 06 Февраль 2014 - 09:12

Просмотр сообщенияnick14 (06 Февраль 2014 - 06:25) писал:

Главное что бы Вы поняли принцип......

Пока не въехал.
Как мне все это правильно прописать?
Я имею ввиду адрес таблицы.
Может какое-то нужное место выбрать?
У меня сейчас в начале программы.

org 0100h
db 0xDE,0x06,0xEC,0xAE,0x36,0xBA,0xFA,0x0E,0xFE,0xBE,0x00,0x08,0x80,0x0D,0x01,0x0F
db 0x0F,0x07,0xED,0xAF,0x37,0xBB,0xFB,0x0F,0xFF,0xBF,0x01,0x0B,0x01,0x0D,0x01,0x0F
Я сначала проверял таблицу отдельным файлом.Тот,что вы мне выслали.Все классно.
Потом его вставил в мою программу.
Теперь PicKit оказывается считывать .hex.
Если закомментирую org 0100h-то считывает.

Прикрепленные изображения

  • Прикрепленное изображение: Снимок3.gif

Сообщение отредактировал pictele: 06 Февраль 2014 - 09:15

0

#20 Пользователь офлайн   nick14 

  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 465
  • Регистрация: 15 Февраль 11
  • ГородРыбинск

Отправлено 06 Февраль 2014 - 10:48

Адрес расположения пишут крайне редко и в основном для того что бы начало адреса блока находилось на границе блока...
Пока забудьте про org 0100h или какой другой адрес !!! Потом разберетесь если понадобится.
А так в примере показано как "взять " адрес начало таблицы.
   
            	clrf                 	TBLPTRU 	; Cбрасываем верхний байт
                movlw   		high (Table ); =Задание адреса ""
                movwf   		TBLPTRH    ;  старшего байта=
                movlw   		low (Table ) ; =Задание адреса ""
                movwf   		TBLPTRL    ;  младшего байта=


Потом корректируем адрес необходимого байта.

Саму таблицу располагайте в конце программы с названием.... в этом примере название таблицы "Table"....
0

Поделиться темой:


  • 2 Страниц +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей