Автор |
Съобщение |
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 10:49 pm Мнения: 4379 Местоположение: София
|
ядове с вектор на прекъсване
Постановката е следната: pic16f1827, компилатор XC8 RB0 е вход с прекъсване по отрицателен фронт. Векторът на прекъсване: Променливите P и T се формират коректно и се четат в основния цикъл. Искам, когато спре импулсната поредица, да се вдигне LATB4. За целта в основния цикъл съм написал: проблемът е, че понякога става а понякога - не. Не мога да разбера, защо.
|
Пон Авг 12, 2019 4:21 pm |
|
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 7:04 pm Мнения: 2581 Местоположение: Велико Търново / София
|
Re: ядове с вектор на прекъсване
Ами LATBbits.LATB4 LATB4 е member of LATBbits
Последна промяна slav4o.com на Пон Авг 12, 2019 4:49 pm, променена общо 1 път
|
Пон Авг 12, 2019 4:33 pm |
|
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 10:49 pm Мнения: 4379 Местоположение: София
|
Re: ядове с вектор на прекъсване
Не е от това. Пропуснах да поясня, че е конфигуриран само RB0, като IOC: по някаква причина променливата "i" не увеличава стойността си.
|
Пон Авг 12, 2019 4:45 pm |
|
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 7:04 pm Мнения: 2581 Местоположение: Велико Търново / София
|
Re: ядове с вектор на прекъсване
Ами търсиш прекъсване по отрицателен фронт. Ако idle state ти е HIGH (RB) значи в предния фронт RB0 става LOW (!RB) Пък ти правиш проверка дали е високо if(RB) , трябва да е if(!RB) Обаче аз не разбирам защо е тази проверка. По скоро трябва когато имаш прекъсване от пина влизаш в ISR() Там обработваш прекъсването и триеш флага. Тази двойна проверка дали са активирани прекъсванията по йоците, е безсмислена. Чрез IOCBNbits.IOCBN0 = 0; спираш едновременно генерирането на прекъсвания и на флагове от RB0. Тоест ако влезеш в прекъсване от друго нещо, няма да има йок флагове ако си го спрял. Достатъчно е да проверяваш в прекъсването дали идва от RB0 Това при положение, че изобщо имаш други прекъсвания
|
Пон Авг 12, 2019 4:53 pm |
|
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 10:49 pm Мнения: 4379 Местоположение: София
|
Re: ядове с вектор на прекъсване
С обработването след прекъсването нямам проблем. Имам проблем, когато фиксирам RB0 високо, т.е няма повече отрицателни фронтове - демек ISR повече не се изпълнява и следва "i" да расте в основния цикъл. Веднъж расте а друг път - не.
|
Пон Авг 12, 2019 5:28 pm |
|
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 7:04 pm Мнения: 2581 Местоположение: Велико Търново / София
|
Re: ядове с вектор на прекъсване
Не можах да ти разбера точно идеята. Как разбираш че i не се инкрементира. Като стане 201 се нулира и пак почва. Ако разбираш за инкрементирането по LATA4 , то мисля проблема е че не си го написал LATAbits.LATA4; Друга възможна причина е i да е unsigned char - 0-255; и ако някъде другаде го инкрементираш да го превърташ и да не става над 200.
|
Пон Авг 12, 2019 5:36 pm |
|
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 10:49 pm Мнения: 4379 Местоположение: София
|
Re: ядове с вектор на прекъсване
Ясно е че трябва да се нулира при 201, но няма инструкция, която да върне LATB4 в нула. Дефинирана е като unsigned int. Това с превъртането ми дойде на ум, дори пробвах да я направя long, но все тая. Идеята ми е, като спрат импулсите да се вдигне нещо, примерно LATB4. В ISR нищо не мога да правя по въпроса, по понятни причини. Първото за което се сетих е това за достатъчно дълго държане на RB0 високо и така достигната стойност на "i". Както и да е. За днес приключих, утре продължавам. Благодаря ти за насоките!
|
Пон Авг 12, 2019 7:44 pm |
|
|
Stoimen
Ранг: Популярен
Регистриран на: Пет Юни 25, 2010 2:18 pm Мнения: 338 Местоположение: Varna
|
Re: ядове с вектор на прекъсване
Как се излиза от прекъсването след последния отрицателен импулс ?
|
Пон Авг 12, 2019 7:56 pm |
|
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 10:49 pm Мнения: 4379 Местоположение: София
|
Re: ядове с вектор на прекъсване
Като се нулира флага IOCBFbits.IOCBF0 в края на ISR.
|
Пон Авг 12, 2019 7:58 pm |
|
|
Stoimen
Ранг: Популярен
Регистриран на: Пет Юни 25, 2010 2:18 pm Мнения: 338 Местоположение: Varna
|
Re: ядове с вектор на прекъсване
Нулирането на флага ще препятства следващо фалшиво влизане, но как се прескача това
|
Пон Авг 12, 2019 8:02 pm |
|
|
Stoimen
Ранг: Популярен
Регистриран на: Пет Юни 25, 2010 2:18 pm Мнения: 338 Местоположение: Varna
|
Re: ядове с вектор на прекъсване
Сетни едно краче като изход и го вдигай при влизане в прекъсването и съответно смъквай преди да излезеш. Така ще можеш да видиш какво става.
|
Пон Авг 12, 2019 8:06 pm |
|
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 10:49 pm Мнения: 4379 Местоположение: София
|
Re: ядове с вектор на прекъсване
Ами ISR не е завършила. След като RB0 се е вдигнал, броячът отново се пуска и брои докато RB0 e високо. Чак след това идва краят на ISR, флагът на прекъсването се нулира и се връщаме в main.
Идеята е да се измери продължителността на ниската част от периода (P) и високата (T).
|
Пон Авг 12, 2019 8:14 pm |
|
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 10:49 pm Мнения: 4379 Местоположение: София
|
Re: ядове с вектор на прекъсване
Това го правих и прекъсването работи коректно. Нещата се мажат след връщането в основния цикъл.
|
Пон Авг 12, 2019 8:16 pm |
|
|
Stoimen
Ранг: Популярен
Регистриран на: Пет Юни 25, 2010 2:18 pm Мнения: 338 Местоположение: Varna
|
Re: ядове с вектор на прекъсване
Въпросът ми беше какво става след последния отрицателен импулс. Идва си отрицателния фронт -> влизаме в прекъсването -> чакаме в while да "свърши" ниската част -> чакаме в while да "свърши" високата част -> излизаме от прекъсването. Какво става ако "ниската" или "високата" част не свършват
|
Пон Авг 12, 2019 8:22 pm |
|
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 7:04 pm Мнения: 2581 Местоположение: Велико Търново / София
|
Re: ядове с вектор на прекъсване
Напиши Не подавай никакви импулси на RB0 и виж с осцилоскоп дали има импулси на RA4
|
Пон Авг 12, 2019 8:23 pm |
|
|