Отговори на тема  [ 10 мнения ] 
PIC16 - търсене в таблица 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Окт 16, 2005 9:46 am
Мнения: 29
Мнение PIC16 - търсене в таблица
Здравейте всички знаещи и можещи!
Имам въпрос за търсене в таблица. Значи чета от АЦП-то на PIC16F873А 2-байтова стойност. Имам около 500 дискрети(стойности) трябва за всяка от тях да получа конкретна стойност в таблица, но стойността също е 2-байта. Примерно измерване на температура до към 500 градуса. За всеки градус получавам стойност в АЦП-то. Скед това трябва да намеря температурата съответстваща на тази стойност. Не мога да измисля "бърз и хитър" алгоритъм. Дойде ми наум, че двубайтовата стойност, която трябва да се връща може да се разбие в 2 таблици, едната да връща H-байт, другата L-байт. А и как се организират таблици по-дълги от 255 байта?
Само за информация - пиша на асемблер.
Предварително благодаря!


Съб Май 13, 2006 8:26 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
http://ww1.microchip.com/downloads/en/A ... 00556e.pdf

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Съб Май 13, 2006 10:07 am
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Окт 16, 2005 9:46 am
Мнения: 29
Мнение 
Цецо, това си е дукументчето за работа с таблици и вземането на мерки при пресичане на граници. Аз с този тип таблици нямам проблеми. Въпросът ми беше по-различен.
1. Как може да се върне от таблицата 2 байтово число.
2. Как може да се ползва таблица по-голяма от 255 позиции. Обикновено в таблицата се използват инструкциите:
addwf PCL,F или movwf PCL,F , но това е макс. 1 байт или 255 позиции. (W e 8 битов)
А при такава дълга таблица трябва да се прибавя 2 байтово число - примерно в таблица с 500 елемента искам да намеря съответстветната стойност на 420 (H'1A4') елемент. Как да намеря мястото на това отместване от началото на таблицата?
3. И третото положение е симбиозата на първите две. Т.е. таблица по-дълга от 255 реда и да връща 2-байтово число.
Не знам дали го обясних както трябва...


Съб Май 13, 2006 9:35 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Едно малко по-нестандартно решение: Инсталирай C компилатор, дай му да адресира по-голям масив от двубайтови константи и виж на дизасемблера какво е надробил.


Съб Май 13, 2006 9:40 pm
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Чет Май 12, 2005 11:10 am
Мнения: 211
Мнение 
Microchip, ще ти кажа какъв алгоритъм използвам.
1. За връщане на 2-байтова стойност. Стойностите ги записвам в 2 таблици. В едната H-байт, в другата L-байт. Ако например ми трябва да получа стойността за N елемент, отивам в 1-ва таблица и тя ми връща старшия байт на N елемент, след това отвивам в другата таблица и тя ми връща младшия байт на N елемент. Така комплектувам 2-байтовото число.
2. Ако имаш по-вече от 256 елемента. Примерно нека да са 512 ('1FF'). Тоагава си правиш 2 таблици по 256 елемента. Анализираш старшия бит на номера (бит "8"), ако той е 0 отиваш към първата таблица, ако той е 1 отиваш към втората таблица.
Алгоритмите са прости и работят надежно.
Ако има нещо неясно питай.
А може някой друг да ползва нещо по-различно.


Съб Май 13, 2006 11:06 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Авг 19, 2005 11:38 am
Мнения: 978
Местоположение: Europe -> BG
Мнение 
-> -= I =- <-
Значи и аз първо тръгнах по методът казан по-горе, но той е удобен само за случея 512, иначе ако имаш повече комбинации трябва да се прави цикъл за изследване на битовте на старшият байт и ... по-сложно става, повече време ще отнеме.

-> -= II =- <-
Най-бързо си е с две таблици за висока и за ниската "част".

ОБАЧЕ ключа от палатката се окрива в това

Просто вместо да имаш директно retlw от LOW таблиците , ще имаш goto value_1 , goto value_2 и т.н вярно писане ще е, ама си има начини да го напишеш и по бързо , та така.

от HI_BYTE разбираш коя е ниската таблица, която ти трябва, а в ниската препращаш към стойностите, всяка стойност е с към отделен label.

Това е най-простото и най-бързото.

Имаш:


общо 1 call, 2 goto скока (1 от HI_TABLE , 1 от LOW_TABLE ) , 1 return
+ 4 цикъла за достигане на стойността
+ 4 цикъла за самото взимане на стойност

или общо 4 * 2 + 8 = 16 цикъла


ето грубо как изглежда.

Код:

call get_value

---

get_value:
hi_table:

     movfw HI_BYTE
     addwf  PCL,F
     goto    low_ table_1
     ...
     goto    low_table_last

low_table_2:

     movfw LO_BYTE
     addwf PCL,F
      goto value_257    ; стойност/комбинация 257
    ....
    goto value_512

value_315:

   movlw ...
   movwf HI_RESULT
   movlw ...
    movwf LOW_RESULT

    return





А по първият метод ако са повече от 512 комбинации няма просто да правиш едно btfsc/btfss, ами ще излседваш бит 0 , ще въртиш рег, прави се цикъл ... , а всъщност идеята каква е пак да определиш в кой подред кош от 256комбинации си. А ти номера на коша вече го имаш самият ВИСОК БАЙТ ти го казва.

Единственит проблем е че решението е простичко по механизъм , затова е и бързо де :-) , но минусът му е много описване. Въпреки че пак казвам аз леко като се замисля и се сещам бегло за 1 , 2 начина как може да се реши проблема с написването на таблиците и стойностите.


edit: е да забравих и да кажа 500 комбинации отнемат ~3kb думи код

500 * 5 (всеки етикет е по 5 инструкции) = 2500 думи
2 low tables * 256 goto + 2 (mov&add) = 514
1 hi table * ( 2 goto + 2 (mov&add)) = 4

---

3018 думи, но отнема 16 цикъла да получиш стойността :-)

искаш таблици -> това са таблици, просто заемат място , ако може да изчисляваш на резултата ще е по-добре.

Лично за мен това е доброто решение.

_________________
един факт :-)
Съжалявам , че исках да помогна ...


Съб Май 13, 2006 11:57 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Окт 16, 2005 9:46 am
Мнения: 29
Мнение 
Благодаря ви!
Помогнахте ми.
"the_real_maniac" хитро си го измислил алгоритъма!!!


Нед Май 14, 2006 9:27 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Окт 02, 2005 9:02 pm
Мнения: 73
Местоположение: Варна
Мнение 
Какъв е проблема за таблици по-големи от 255 елемента да се използва старшия адрес на брояча - PCLATH.
А ако ще се прави с допълнителни преходи и доста писане, малко макроси ще спестят досадните повторения.


Вто Май 16, 2006 2:21 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Сря Окт 26, 2005 7:17 pm
Мнения: 106
Местоположение: Sofia
Мнение 
logi написа:
Какъв е проблема за таблици по-големи от 255 елемента да се използва старшия адрес на брояча - PCLATH.
А ако ще се прави с допълнителни преходи и доста писане, малко макроси ще спестят досадните повторения.


доколко ти си спомням проблема е че старшата част на програмния брояч не е програмнно достъпен регистър


Вто Май 16, 2006 3:00 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Окт 02, 2005 9:02 pm
Мнения: 73
Местоположение: Варна
Мнение 
За четене да, но за запис няма проблеми


Вто Май 16, 2006 3:39 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 10 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 5 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни