| Микроконтролери и електроника 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 цикъла ето грубо как изглежда.
А по първият метод ако са повече от 512 комбинации няма просто да правиш едно btfsc/btfss, ами ще излседваш бит 0 , ще въртиш рег, прави се цикъл ... , а всъщност идеята каква е пак да определиш в кой подред кош от 256комбинации си. А ти номера на коша вече го имаш самият ВИСОК БАЙТ ти го казва. Единственит проблем е че решението е простичко по механизъм , затова е и бързо де 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 [ Вто Май 16, 2006 3:39 pm ] |
| Заглавие: | |
За четене да, но за запис няма проблеми |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|