| Автор |
Съобщение |
|
polinom
Ранг: Новодошъл
Регистриран на: Съб Юни 09, 2012 12:23 am Мнения: 146 Местоположение: София/Стара Загора
|
 Обработка на прекъсване от Timer0 -PIC18
Искам да обработвам препълването на Timer0 на един PIC18f4620. И горе долу искам да мига един диод през секунда. за целта дефинирам таймера да 16 ботов и такт от вътрешен генератор 32khz. Ама не става нищо както си го мисля. Това ми е кода компилатора е С18. Ако може някой да ми разясни как се организират прекъсванията за тоя компилатор. Знам че има два вектора на прекъсване, приоритет на прекъсванията, може да се забраняват и разрешават ама някъде ми се губят нещата.
|
| Нед Фев 17, 2013 10:51 pm |
|
 |
|
Stoimen
Ранг: Популярен
Регистриран на: Пет Юни 25, 2010 3:18 pm Мнения: 363 Местоположение: Varna
|
 Re: Обработка на прекъсване от Timer0 -PIC18
|
| Нед Фев 17, 2013 11:34 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: Обработка на прекъсване от Timer0 -PIC18
Виж си внимателно последния ред на сорса. Как искаш да мига като му казваш да не мига. Изпуснал си едно !.
|
| Пон Фев 18, 2013 12:16 am |
|
 |
|
polinom
Ранг: Новодошъл
Регистриран на: Съб Юни 09, 2012 12:23 am Мнения: 146 Местоположение: София/Стара Загора
|
 Re: Обработка на прекъсване от Timer0 -PIC18
Това съм го изпуснал след суматите преправения съм го махнал.Направих там нещо и то тръгна но изкочиха други въпроси. Таймера не се препълва инкрементира се само младшата част а съм го направил в 16 битов режим.
|
| Пон Фев 18, 2013 1:46 am |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: Обработка на прекъсване от Timer0 -PIC18
Мда... с това конфугуриране на Т0, прекъсване ще имаш веднъж на 9 минути. Ти колко време го чакаш да се препълни ?
Като четеш даташитовете, гледай какъв е дифолт стейта на регистрите - на Т0 прескалера е сетнат по подразбиране на 1:256, и 16 битов таймер ти брои до 65535, и това при честота 31kHz. Айде сега сметни и ти да видиш колко време ще му е нужно да се препълни.
|
| Пон Фев 18, 2013 10:21 am |
|
 |
|
polinom
Ранг: Новодошъл
Регистриран на: Съб Юни 09, 2012 12:23 am Мнения: 146 Местоположение: София/Стара Загора
|
 Re: Обработка на прекъсване от Timer0 -PIC18
Прав си, че не съм го видял. Работи за мен. Куца ми малко разбирането на осцилатора. Ама в дейташита всичко си го пише. "TMR0H is not the actual high byte of Timer0 in 16-bit mode; it is actually a buffered version of the real high byte of Timer0 which is not directly readable nor writable " може би за това не мога да го видя, принципно го пробвах в режим на симулация в MPLAB. Благодаря ви за помощта.
|
| Пон Фев 18, 2013 6:23 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: Обработка на прекъсване от Timer0 -PIC18
Ами пак не си разбрал - тоя буфер е с цел да може да изпълни едноцикловото писане/четене в двата байта. Не знам защо за таймер0 е описано сякаш по-криво отколкото за Т1/3/5 - там е подобно, само дето може да избираш дали да е буферирано или не. Дефакто не можеш да четеш/пишеш "истинския" брояч, но четейки TMR0, буфера TMR0H автоматично се зарежда и с действителния HighByte на таймера. Целта е ако в момента на четене на младшия байт има препълване/пренос на/към старшия, това да не ти повлияе на четенето. Примерно ако е трябвало да прочетеш 65535 (hFFFF), ще прочетеш първо единия - 255 и имаш препълване и другия ще го прочетеш 0.
|
| Пон Фев 18, 2013 7:05 pm |
|
 |
|
polinom
Ранг: Новодошъл
Регистриран на: Съб Юни 09, 2012 12:23 am Мнения: 146 Местоположение: София/Стара Загора
|
 Re: Обработка на прекъсване от Timer0 -PIC18
Добре това го схванах тогава защо в режим на симулация в MPLAB старшият байт TMR0H не се вижда ,той се инкрементира- не влиза в прекъсването след превъртане на младшата част,ама аз не го виждам, седи си само 0х00, младшият се вижда как се увеличава при изпълнение стъпка по стъпка.
|
| Пон Фев 18, 2013 8:22 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: Обработка на прекъсване от Timer0 -PIC18
За да го видиш ти трябва примерно : movf TMR0,w Този регистър се ъпдейтва само при четене на TMR0. Може и да не съм го обяснил много точно но го има написано в предния ми пост. При запис съответно първо се зарежда TMR0H със желаната стойност и после се прави запис в TMR0. В момента на записа на младшия байт се прехвърля и буфера в действителния брояч. Става в рамките на 1 цикъл записа на двата регистъра. Това е пак с цел да няма изненади ако записа става в момент на инкрементиране - обясних го по горе ефекта какъв е.
|
| Вто Фев 19, 2013 10:01 am |
|
 |
|
polinom
Ранг: Новодошъл
Регистриран на: Съб Юни 09, 2012 12:23 am Мнения: 146 Местоположение: София/Стара Загора
|
 Re: Обработка на прекъсване от Timer0 -PIC18
Разбирам какво се има предвид: понеже са физически два регистъра е направено така че да се ъпдейтват едновременно, все едно са един 16 битов. Въпросът ми е как да го видя в режим на дебъг или кое да гледам за да виждам него ?
|
| Вто Фев 19, 2013 3:58 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: Обработка на прекъсване от Timer0 -PIC18
Нали това ти обяснявам че няма как да го видиш, докато не прочетеш младшия байт. Физическия брояч НЕ Е МАПНАТ като регистър и НЕ можеш да го видиш...
Всъщност пиковете имат и други подобни регистри до които нямаш пряк достъп : например такива са двата буфер байта на УАРТ-ите. Разни шифт регистри на серийните модули. И подобни...
|
| Вто Фев 19, 2013 5:22 pm |
|
 |
|
polinom
Ранг: Новодошъл
Регистриран на: Съб Юни 09, 2012 12:23 am Мнения: 146 Местоположение: София/Стара Загора
|
 Re: Обработка на прекъсване от Timer0 -PIC18
Аз си мислих че дебъг режима е по-гъвкав, заобикалят се някои особености, в същност за да го виждам в watch-a трябва периодично да прочитам младшият байт. Благодаря за инфото.
|
| Вто Фев 19, 2013 11:57 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: Обработка на прекъсване от Timer0 -PIC18
Не виждам пряк смисъл от "виждането" на тоя регистър, освен да му се любуваш докато цъка. Ако ти трябва неговата стойност, то ще ти трябва и младшия и ще си го прочетеш - това в случай че ползваш таймера като някакъв брояч. Ако го ползваш като тайм бейс - той като се препълни си ти казва.
|
| Сря Фев 20, 2013 9:37 am |
|
 |
|
polinom
Ранг: Новодошъл
Регистриран на: Съб Юни 09, 2012 12:23 am Мнения: 146 Местоположение: София/Стара Загора
|
 Re: Обработка на прекъсване от Timer0 -PIC18
Добре сега, искам да използвам за реализирането на многоканална PWM с таймера. Мисля си че мога след като си го настроя да чета стойността до която е стигнал таймер и да преобръщам порта, но ми се вижда прекалено неелегантен метод. Да кажем ако искам да управлявам повече от 3-4 серво моторчета как да изчислявам PWM индивидуално за всяко един от тях независимо с един таймер.
|
| Пон Фев 25, 2013 11:26 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: Обработка на прекъсване от Timer0 -PIC18
Няма какво да изчисляваш и да обръщаш ти. Има си микроконтролери с вграден PWM хардуер. На тях само им задаваш какво да е PWM то (например 128 от 256, което е 50%), и контролера си се грижи за останалото. Прочети си хубаво даташита на PIC18-ката. Вътре си пише всичко.
Раздел 15 и 16 на даташита обясняват на дълго и на широко как работи тоя хардуер. Накратко - задаваш си на съответния таймер да брои например от 0 до 1023, и задаваш на хардуера да ти държи някой пин в 0 ако брояча на таймера е под някаква стойност и 1 ако е над нея. Като променяш дадената стойност между 0 и 1023 си регулираш процента на PWM-то.
|
| Вто Фев 26, 2013 9:32 am |
|
|