| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Кратък импулс и pIC http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=14983 |
Страница 1 от 3 |
| Автор: | ToHu [ Съб Яну 14, 2017 11:34 pm ] |
| Заглавие: | Кратък импулс и pIC |
Много тъп проблем но вече останах без идеи. Най-общо имам кодеиране, период 1.25 uS импулси под 500 nS са нули, над са 1-ци. В конкретният случай нулите са около 100 nS. Процесора е 12F1571 ако има значение. Първоначално имах идея да изпозлвам таймер 1 и импулс да е гейт на таймера, не става, твърде много код и докато се орпавя с единия идва втори. След това отидох на полиране, да но трябва да определям къде е фронта, т.е. чакам да стане 1-ца след което отново проверявам дали е 1-ца, ако е пиша 1-ца, да ама не, докато полирам изтървам импулси, 100 ns при 125 nS цикъл не става. Прекъсване, обаче шибня, точно външното е на еидн пин с PWM3, и точно тоя PWM не се мести, т.е. забравям за външно. Айде IOC, да ама не, флага на порта е на майка си у ... в 7-ма банка, аз хубаво проверявам глобалния флаг който е в 0-ва, обжаче не чистя ли и този на конкретният вход не става, от тук още инструкции и пак отиваме в началото, не стига време. Не ми остават много варианти, съмняваме компаратора да се оправи с такива кратки импулси. Гейта на таймер 1 има прекъсване, стандартно е по задния фронт на гейт сигнала, но ако го инвертирам, т.е. му сменя поляриетета ще ми дойде по предния фронт на моя сигнал, да но блоковата схема е твърде блокова, не е ясно дали и къде се синхронизира по някой системен клок, и колко ще се измести.... Та ако някой има идея да пише, не остана периферия ... ако имаше някой SPI или подобно можеше нещо да се измисли сигурно ама няма ... |
|
| Автор: | ToHu [ Съб Яну 14, 2017 11:53 pm ] |
| Заглавие: | Re: Кратък импулс и pIC |
.... с гейта на таймера се хваща импулса, хубавото е че флага му е в първа банка, сега да видим обаче как е във времето |
|
| Автор: | stoyanoff [ Съб Яну 14, 2017 11:54 pm ] |
| Заглавие: | Re: Кратък импулс и pIC |
Ами това, което на мен ми идва е да използваш някакъв чакащ външен мултивибратор с ресет. Подаваш сигнал за 1-ца и нулираш за 0-ла или въобще не подаваш. Така задаването ще ти е в рамките на сетването на 1 пин и цялото ти време ще е за сметки. Не знам дали можеш да добавяш периферия... |
|
| Автор: | slav4o.com [ Нед Яну 15, 2017 2:07 am ] |
| Заглавие: | Re: Кратък импулс и pIC |
Идеята на stoyanoff е добра според мен. Има и вариант с някакво усредняване на импулсите (интегрираща верига) и после с компаратора да ги мериш. Другия вариант на входа на брояча да гейтваш някаква висока честота например 32 MHz и да броиш импулсите. Тей както гледам може на брояча на таймера директно да се подаде Fosc което си е 32 MHz. Ако пишеш на асемблер след една инструкция трябва да си натрупал поне 4 импулса в брояча за над 125 ns или 3 импулса за 93.75ns което ти е 0лата. 1.25 uS са 10 инструкции, не стигат ли да се Handlе това ? |
|
| Автор: | ToHu [ Нед Яну 15, 2017 2:17 am ] |
| Заглавие: | Re: Кратък импулс и pIC |
Тригер искаш да кажеш предполагам, но освен да занам кога е дошъл импуса трябва да знам и колко е дълъг, т.е. само фронт не върши работа. Като че ли импулса се засича стабилно от прекъсването на гейта на брояча, чийто флаг е в банка 0 и не ми хаби инструкции. Все пак се върнах на идеята с брояча, написано на асемблер кода всъщност е доста оптимален, в основни линии пробелма е решен. Тъй като се върнах на това да изпозлвам гейта и самият брояч за да смятам продължителността гейта си работи както е първоначално, инкрементва брояча при високо ниво, получавам прекъсване по падащ фронт на гейта. Това което изниква е че трябва почти веднага хем да изтриеш прекъсването за да можеш да получиш следващото, при 1-ца до следващо можеш да имаш 300 нс или около 3 цикъла и хем да провериш стойността на таймера колко се е инкрементнал за да сметнеш дали е 0 или 1. Тъйкато няма време за сметки гледам да наместя клока на таймера така че да мина с битова проверка, в случая на 3-ти ли 4-ти бит. Да обаче самото полиране на флага на прекъсването яде време, в най-лошия случай 4 инструкции докато го хванеш имаш btfss което е две и goto още две. Горе долу за това време може да е дошъл следващият преден фронт. В моента работи но някъде застъпва, изтървам май първия бит .. продължавам да го мъча п.с. Какво усредняване на импулсите, какво да ги правя да ги усреднявам, не става, външен тригер също не помага, освен аз ако не ви схващам идеята. Това за брояча е това което ми беше първоначланата идея, но едно че пробвах да го пиша на С, второ явно е имало някакво дърво със сетването на таймета, и трето с цикъл не става, няма време за цикли, трябва да се развие линейно за да има време за всичко. |
|
| Автор: | slav4o.com [ Нед Яну 15, 2017 2:38 am ] |
| Заглавие: | Re: Кратък импулс и pIC |
Добре де щом нулите са около 100nS, защо да чакаш до 500nS за да сметнеш че е 1ца ? Според мен може да го направиш ако е повече от 125 nS да бъде единица. Демек циклиш / проверяваш (полваш) дали не е станало високо ниво. След това една инструкция (125 ns). Ако още е високо нивото на входа ->1ца. Алгоритъма ще е с точност 125 ns, това е времето на 1 инструкция (при 32MHz), което мисля, че ще е достатъчно. |
|
| Автор: | ToHu [ Нед Яну 15, 2017 2:43 am ] |
| Заглавие: | Re: Кратък импулс и pIC |
Хмм нещо времето не стига ..... G0: btfss TMR1GIF goto G0 bcf TMR1GIF movf TMR1L,W clrf TMR1L btfsc WREG,3 bsf G,0 Ето част от развития цикъл, това се повтаря за всички 8 бита, проблема е първата проверка, ако се направи точно преди да се вдигне флага, отиват много инструкции, докато изчистя флага са май 6 със самото чистене, което дори и в не толкова гранични времена е много. Или аз не ги броя както трябва или са си толкова, BTSFSS това е една да провери, и ако не е сетнат отива на GOTO, самото то са две инструкции, станаха 3 докато пак се върне на BTFSS, тук имаме още една за самата инструкция,станаха 4, един NOP ако условието е изпълнено и се скипне GOTO, станаха 5 и самата инструкция която чисти флага станаха 6 .... и дори да няма никаква вътрешна синхронизация само до тук са 6х125 или 750 ns ... следващият фронт вече е дошъл в някои от случаите и го изтървам. Та някакви идеи |
|
| Автор: | ToHu [ Нед Яну 15, 2017 2:45 am ] |
| Заглавие: | Re: Кратък импулс и pIC |
п.с. Не чакам да стане 500, просто самото циклене, полирането на флага отнема твърде много време и в определени случаи се изтърва следващият фронт. Както писах по-горе, за да получа следващото прекъсване трябва да изчистя флага, което е третатат инструкция. |
|
| Автор: | ToHu [ Нед Яну 15, 2017 2:46 am ] |
| Заглавие: | Re: Кратък импулс и pIC |
п.с.2 .. пиша инструкции имам в предвид цикли .... вече спя |
|
| Автор: | slav4o.com [ Нед Яну 15, 2017 3:15 am ] |
| Заглавие: | Re: Кратък импулс и pIC |
Всъщност остави таймера. Пусни процесора на 32MHz, направо зацикли докато дойде високо ниво на входа. Веднага след това пак провери нивото на входа с други инструкции и ще получиш дали е 1 или 0. |
|
| Автор: | ToHu [ Нед Яну 15, 2017 3:34 am ] |
| Заглавие: | Re: Кратък импулс и pIC |
Нали това е направено, но не можеш да проверяваш високо ниво, то е 100 ns инструкцията е 125 ns, гарантирано го изтърваш. Дори и 150 nS да е импулса, отново шанса да го изтървеш е монго голям, да не кажа че изобщо с полиране при 125 nS инструкция шанса да хванеш нещо под 400-500 нс с полиране е малък, просто защото като полираш слд това имаш гото обранто, което само то е 2 цикъла, т.е. само там имаш 250 ns, ако импулса се появи дори след края на първата проверка трябва да е не по-малък от 300 nS за да го хванеш надеждно. Това се решава с прексъване, проблема е че това прекъсване което ми върши работа не мога да го използвам, INT е на същият пина на който в PWM3, а той не може да се премести. Трябва друг тригер който да хване фронта, имаш прекъсване по промяна, но регистрите са заврени в 7-ма банка, докато смениш банките отива твърде много време. Регистър който е в банка 0, е прекъсването по гейта на таймер 1. Да но там прекъсването е по задния фронт на гейт импулса, който съответства или на задният фронт на импулса който меря, или на предни фронт на втория ми импулс. Т.е ако изпозлвам този флаг инвертиран хващам началото но на вторият импулс, първия го губя. Тъй като данните ми се повтарят, вариант е да изчакам 23 импулса и да започна от следващата поредица. Друг вариант е да изпозлвам флага по прекъсване по заден фронт на първия импулс. Ясно е че тогава е късно да меря колко му е импулса, но това става лесно със самият таймер. Както обаче по-горе писах, зора е че докато полирам флага мога да изгубя достатъчно време за да не мога да го ресетна на време за следващият фронт. Прекъсвания дори и без свапване и запазване не са вариант, самото рпекъсване яде много инструкции. Ще разгледам какво друго има като периферия което да генерира прекъсване, може би сетнат брояч .. зависи обаче дали не синхронизира, ако не самия брояч то прекъсването му ... Та до тук съм с изчерпани идеи. Или ще му сложа нещо външно, но хич не ми се иска, например чакащ мултивибратор който да ми генерира импулс 300 ns, така полирайки него може и да успея да направя проверката в средата, но то отново идвамомента че не трябва да е полиране а прекъсване и пак завъртаме същият кръг Имаше една тема за малки логики, цялото нещо е еидн 24 битов преместващ регистър подходящо клокнат .... може да разкарам процесора и да сложа малка логика, схемното изпълнение е супер елементарно. |
|
| Автор: | Desert Leo [ Нед Яну 15, 2017 11:15 am ] |
| Заглавие: | Re: Кратък импулс и pIC |
Щом нулата е 100 ns, колко е единицата? |
|
| Автор: | ToHu [ Нед Яну 15, 2017 11:45 am ] |
| Заглавие: | Re: Кратък импулс и pIC |
В случая 590 ns. Това са времената от моята версия на управлението. По спецификация уж 400 нс е 0 и 800 нс е 1 като има +/-150 нс толеранс. Да обаче всеки китаец го е направил както му дойде клонинга, и за да работи със всички трябват хитрости. Реално 0 може да е произволно къса, затова съм я направил 100 нс, а единицата ми е 600, тя пък може да е произволно дълга, стига да имаш фронт при следващият бит. Колко обаче е нулата няма значение, така или иначе с полиране директно не може да се хване. Шанса е директно прекъсване за да работя по преден фронт и тогава ще има време да изчистя флага, инструкциите стават с две по-малко и всичко заспива. Само дето нямам прекъсване. Има един друг с 4 PWM и там мога да използвам 4-ти а пина на 3-ти да остане прекъсване, да ама е 200ns на инструкция. Гледам че има някаква програмируема клетка бавния, но на пръв поглед няма да свърши работа. Щеше да е идеална ако имаше връзка с поне един таймер, т.е. да може да го пуска за да реалозирам нужното закъснение, да ама няма. Ще и ппгледна закъсненията, дали не мога да събера 400 нс но не ми се вярва да е толкова бавна. |
|
| Автор: | Desert Leo [ Нед Яну 15, 2017 12:00 pm ] |
| Заглавие: | Re: Кратък импулс и pIC |
Хм, при тези толеранси ми се струва, че или трябва да се смени подхода, или да се използва по-бърз проц... |
|
| Автор: | ToHu [ Нед Яну 15, 2017 12:21 pm ] |
| Заглавие: | Re: Кратък импулс и pIC |
Ами сигурно ще го направя със силабс, има един малък който е до 25 MIPS и е SOIC, не е и много скъп, иначе с някой от по големите които са 48 или 50 ще стане със сигурност, но мисля и с малкия ще го докарам. Ще видя сега само с тази логическа клетка какво мога да измисля, върти ми се нещо, все ми е какъв е процесора, но ми се иска да го има на дип, това ще е нещо каот адон към съществуващи неща, да преконвертира от адресируеми към стандартни RGB светодиоди, и сигурно ще го убиват често, хубаво е да може да се сменя чипчето, не че цялото нещо ще е кой знае колко скъпо но .. ако не е дип да е на цокъл поне SOIC, имаме клиенти по разните азбутани държави които искат да си ремонтират нещата, ако не беше това вече да бях забучил онова малкото FPGA от другата тема, ама само в BGA го има. |
|
| Страница 1 от 3 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|