Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

PIC16 - търсене в таблица
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=2356
Страница 1 от 1

Автор:  microchip [ Съб Май 13, 2006 8:26 am ]
Заглавие:  PIC16 - търсене в таблица

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

Автор:  Цецо [ Съб Май 13, 2006 10:07 am ]
Заглавие: 

http://ww1.microchip.com/downloads/en/A ... 00556e.pdf

Автор:  microchip [ Съб Май 13, 2006 9:35 pm ]
Заглавие: 

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

Автор:  bateAz [ Съб Май 13, 2006 9:40 pm ]
Заглавие: 

Едно малко по-нестандартно решение: Инсталирай C компилатор, дай му да адресира по-голям масив от двубайтови константи и виж на дизасемблера какво е надробил.

Автор:  VANK [ Съб Май 13, 2006 11:06 pm ]
Заглавие: 

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

Автор:  the_real_maniac [ Съб Май 13, 2006 11:57 pm ]
Заглавие: 

-> -= 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 цикъла да получиш стойността :-)

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

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

Автор:  microchip [ Нед Май 14, 2006 9:27 am ]
Заглавие: 

Благодаря ви!
Помогнахте ми.
"the_real_maniac" хитро си го измислил алгоритъма!!!

Автор:  logi [ Вто Май 16, 2006 2:21 pm ]
Заглавие: 

Какъв е проблема за таблици по-големи от 255 елемента да се използва старшия адрес на брояча - PCLATH.
А ако ще се прави с допълнителни преходи и доста писане, малко макроси ще спестят досадните повторения.

Автор:  denis_hasan [ Вто Май 16, 2006 3:00 pm ]
Заглавие: 

logi написа:
Какъв е проблема за таблици по-големи от 255 елемента да се използва старшия адрес на брояча - PCLATH.
А ако ще се прави с допълнителни преходи и доста писане, малко макроси ще спестят досадните повторения.


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

Автор:  logi [ Вто Май 16, 2006 3:39 pm ]
Заглавие: 

За четене да, но за запис няма проблеми

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/