| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| 18F452 TMR1 LOW interrupt се изпълява само веднъж. http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=9806 |
Страница 1 от 1 |
| Автор: | edi [ Пет Яну 20, 2012 8:12 pm ] | |||||||||||||||||||||||||||||||||||||||||||||
| Заглавие: | 18F452 TMR1 LOW interrupt се изпълява само веднъж. | |||||||||||||||||||||||||||||||||||||||||||||
Здравейте.Немога да открия къде греша. Имам две прекъсвания за обработка от tmr0(висок приоритет) на всеки 50us и TMR1(нисък приоритет) на всеки 10mS. Кода е следния :
След приключване на инициализацията на контролера си пускам и двата таймера и разрешавам прекъсванията:
Проблема е, че след като един път обработено прекъсването от TMR1 никога повече не се обработва, макар, че TMR1IF = 1, брояча се препълва, т.е. таймера си работи. Къде може да е проблема,така че при установяване на флага за прекъсване на TMR1 да не се генерира(обработва) прекъсване с нисък приоритет при условие, че всички стойности по конфигурационните му регистри остават непроменени? |
||||||||||||||||||||||||||||||||||||||||||||||
| Автор: | Gogo [ Съб Яну 21, 2012 12:10 am ] |
| Заглавие: | Re: 18F452 TMR1 LOW interrupt се изпълява само веднъж. |
В void timer_isr(void), след като свърши else-то, липсва затварящата скоба. Сигурно си я сложил някъде по-нататък в сорса и става една... |
|
| Автор: | ¶ [ Съб Яну 21, 2012 12:12 am ] | |||||||||
| Заглавие: | Re: 18F452 TMR1 LOW interrupt се изпълява само веднъж. | |||||||||
Този професор е от първите версии PIC18 и има една кофа бъгове ( при прекъсванията също ). Примерно аз използвам наследника му PIC18F4580 със следния код за прекъсване ( не е точно за TMR0/TMR1 ):
Не ми става ясно защо спираш таймерите в тялото на прекъсването. За да ги презаредиш не е нужно да ги спираш. При 16-битов TMR0/TMR1 просто спазваш правилото ( както си го направил ) 1-во зареждаш старшия байт, след което младшия. Провери какво ще стане ако не спираш TMR1, въпреки че TMR1ON = 0 не би трябвало да нулира TMR1IE бита. |
||||||||||
| Автор: | edi [ Съб Яну 21, 2012 12:16 pm ] | |||||||||
| Заглавие: | Re: 18F452 TMR1 LOW interrupt се изпълява само веднъж. | |||||||||
Пробвах и проблема е решен От постнатия коментар, в 80202g.pdf секция 19 има доста интересни неща @Gogo, скобата е там в кода, но като копи/паствах и съм е изтрил, мерси все пак |
||||||||||
| Автор: | ¶ [ Съб Яну 21, 2012 12:37 pm ] |
| Заглавие: | Re: 18F452 TMR1 LOW interrupt се изпълява само веднъж. |
Моят съвет е да не се занимаваш с 452 ами да използваш 4580, използва се масово в автомобилната индустрия, ако му погледнеш errata документите всички бъгове са оправени, има само един в I2C модула. 45K80/46K80 също ще са популярна серия, при тях за година оправиха повечето бъгове. Прави ми впечатление, че за широко използваните си модели процесори Microchip се грижат да оправят бъговете, тези които не са популярни ги отсвирват, което не им пречи да продължават да ги предлагат. Така че като се спреш на някой модел отвори и разгледай errata документите, те са веднага под data sheet за съответния процесор. Най-отдолу в errata има history на корекциите по силиция, най-отгоре пък имат таблици при кои ревизии какво е коригирано. Ако с напредването на ревизиите са коригирани повечето бъгове това е сигурен индикатор, че от този модел се пазарува и затова са се погрижили да оправят бъговете. Ако има 1-2 ревизии и не са коригирано повечето бъгове, това означава стой надалеко от този модел, заебали са го защото не се търси и може би никога няма да коригират бъговете му. На въпроса с TMR1, от това което казваш излиза, че TMR1ON = 0 явно нулира TMR1IE . Можеш ли да изпробваш да спираш TMR1 преди да го заредиш ( както ти е първата версия ), но след TMR1ON = 1 да добавиш и TMR1IE = 1 ? Просто ми е интересно що за щуротия са направили, че спирайки таймера да се променя и TMR1IE. |
|
| Автор: | Cekins [ Съб Яну 21, 2012 1:00 pm ] |
| Заглавие: | Re: 18F452 TMR1 LOW interrupt се изпълява само веднъж. |
Edi, тя тая ерата е за съвсем друг силикон а и е за ревизия A1 на чипа - демек първата. Ако погледнеш всички ерати, ще видиш това което ти казва Пирев - в последната ревизия е останал един единствен бъг в I2C slave mode За 452 въобще и в първата ерата няма нищо по въпроса... В инетерс на истината и на мен ми е странно защо ще си забрани прекъсването сам, като го спреш ?!?! |
|
| Автор: | edi [ Съб Яну 21, 2012 4:21 pm ] | |||||||||
| Заглавие: | Re: 18F452 TMR1 LOW interrupt се изпълява само веднъж. | |||||||||
Незнам, но е факт, че нещата се оправиха когато си оставих да работи TMR1.Ползвам този процесор, защото имам доста бройки под ръка, а и оригиналния софтуер е писан за него.Може би ще го портна за 4580, но няма да е сега, т.к. скоро проекта трябва да е на линия и гледам да го направя да работи коректно предвид обстоятелствата.
Не се променя нищо.Пробвах го |
||||||||||
| Автор: | Cekins [ Съб Яну 21, 2012 8:08 pm ] |
| Заглавие: | Re: 18F452 TMR1 LOW interrupt се изпълява само веднъж. |
А я разгледай асемблера след като го компилираш - да не би компилатора да се прави на умен и да изключва прекъсването а после да не го включва. На мен на такова ми намирисва. |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|