Отговори на тема  [ 30 мнения ]  Отиди на страница 1, 2  Следваща
Обработка на прекъсване от Timer0 -PIC18 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Юни 09, 2012 12:23 am
Мнения: 146
Местоположение: София/Стара Загора
Мнение Обработка на прекъсване от Timer0 -PIC18
Искам да обработвам препълването на Timer0 на един PIC18f4620. И горе долу искам да мига един диод през секунда. за целта дефинирам таймера да 16 ботов и такт от вътрешен генератор 32khz. Ама не става нищо както си го мисля.
Код:
#include<p18f4620.h>
#pragma config OSC = INTIO67, FCMEN=ON , IESO=ON , PWRT=ON , BOREN =OFF , WDT=OFF, LPT1OSC = ON
#pragma interrupt time
void main(void)
{
    T0CONbits.TMR0ON=1;//таймера е включен
    T0CONbits.T08BIT=0;//16 битов режим
    T0CONbits.T0CS=0;//ВЪТРЕШЕН ТАКТ ЗА ИЗТОЧНИК
    RCONbits.IPEN=1;//разрешаване на преоритетните прекъсвания
    INTCONbits.GIE=1;//разрешаване на прекъсванията
    INTCONbits.TMR0IE=1;//tamer0 разрешаване на прекъсване
    INTCON2bits.TMR0IP=1;//висок приоритет за прекъсванията от таймер0
    ADCON1=0xff;//дефинираме изводите като цифорови
    TRISB=0x00;//порта е конфигориран като изходи
    OSCCON &=0b00000010; // 31Кhz
    OSCTUNE=0x00;//центриране на честотата
    ADCON0bits.ADON=0;
    PORTB=0xff;
    while(1)
    {
       
    }
}
void time(void)
{
    INTCONbits.TMR0IF=0;//изчиствам прекъсването
    PORTBbits.RB0 =PORTBbits.RB0;
}

Това ми е кода компилатора е С18. Ако може някой да ми разясни как се организират прекъсванията за тоя компилатор. Знам че има два вектора на прекъсване, приоритет на прекъсванията, може да се забраняват и разрешават ама някъде ми се губят нещата.


Нед Фев 17, 2013 10:51 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пет Юни 25, 2010 3:18 pm
Мнения: 363
Местоположение: Varna
Мнение Re: Обработка на прекъсване от Timer0 -PIC18
Погледни това
http://www.enmcu.com/guides/usingtimerandinterruptinc18


Прикачени файлове:
timers-and-interrupt-setting.pdf [90.65 KiB]
346 пъти
Нед Фев 17, 2013 11:34 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: Обработка на прекъсване от Timer0 -PIC18
Виж си внимателно последния ред на сорса. Как искаш да мига като му казваш да не мига. Изпуснал си едно !.


Пон Фев 18, 2013 12:16 am
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Юни 09, 2012 12:23 am
Мнения: 146
Местоположение: София/Стара Загора
Мнение Re: Обработка на прекъсване от Timer0 -PIC18
Това съм го изпуснал след суматите преправения съм го махнал.Направих там нещо и то тръгна но изкочиха други въпроси. Таймера не се препълва инкрементира се само младшата част а съм го направил в 16 битов режим.


Пон Фев 18, 2013 1:46 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: Обработка на прекъсване от Timer0 -PIC18
Мда... с това конфугуриране на Т0, прекъсване ще имаш веднъж на 9 минути. Ти колко време го чакаш да се препълни ?

Като четеш даташитовете, гледай какъв е дифолт стейта на регистрите - на Т0 прескалера е сетнат по подразбиране на 1:256, и 16 битов таймер ти брои до 65535, и това при честота 31kHz. Айде сега сметни и ти да видиш колко време ще му е нужно да се препълни.


Пон Фев 18, 2013 10:21 am
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Юни 09, 2012 12:23 am
Мнения: 146
Местоположение: София/Стара Загора
Мнение Re: Обработка на прекъсване от Timer0 -PIC18
Прав си, че не съм го видял.
Код:
#include<p18f4620.h>
#include<timers.h>
void high_isr(void);
#pragma config OSC = INTIO67, FCMEN=ON , IESO=ON , PWRT=ON , BOREN =OFF , WDT=OFF, LPT1OSC = ON
#pragma code high_vector=0x08
void interrupst_at_high_vector(void)
{
    _asm GOTO high_isr _endasm
}
#pragma code
#pragma interrupt high_isr
void high_isr(void)
{
    INTCONbits.TMR0IF=0;
    PORTAbits.RA0 =~PORTAbits.RA0;
}

void main(void)
{
   OSCTUNEbits.INTSRC=0;
   OSCTUNEbits.PLLEN=1;
   ADCON1=0xff;
   INTCONbits.GIE=1;
   INTCON2bits.TMR0IP=1;
   RCONbits.IPEN = 1;            //enable priority level
   OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_4  );
   T0CONbits.PSA=0;
   TRISA=0x00;
    while(1)
    {

    }
}
Работи за мен. Куца ми малко разбирането на осцилатора. Ама в дейташита всичко си го пише. "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
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 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
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Юни 09, 2012 12:23 am
Мнения: 146
Местоположение: София/Стара Загора
Мнение Re: Обработка на прекъсване от Timer0 -PIC18
Cekins написа:
Ами пак не си разбрал - тоя буфер е с цел да може да изпълни едноцикловото писане/четене в двата байта. Не знам защо за таймер0 е описано сякаш по-криво отколкото за Т1/3/5 - там е подобно, само дето може да избираш дали да е буферирано или не. Дефакто не можеш да четеш/пишеш "истинския" брояч, но четейки TMR0, буфера TMR0H автоматично се зарежда и с действителния HighByte на таймера. Целта е ако в момента на четене на младшия байт има препълване/пренос на/към старшия, това да не ти повлияе на четенето. Примерно ако е трябвало да прочетеш 65535 (hFFFF), ще прочетеш първо единия - 255 и имаш препълване и другия ще го прочетеш 0.

Добре това го схванах тогава защо в режим на симулация в MPLAB старшият байт TMR0H не се вижда ,той се инкрементира- не влиза в прекъсването след превъртане на младшата част,ама аз не го виждам, седи си само 0х00, младшият се вижда как се увеличава при изпълнение стъпка по стъпка.


Пон Фев 18, 2013 8:22 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: Обработка на прекъсване от Timer0 -PIC18
За да го видиш ти трябва примерно : movf TMR0,w
Този регистър се ъпдейтва само при четене на TMR0. Може и да не съм го обяснил много точно но го има написано в предния ми пост. При запис съответно първо се зарежда TMR0H със желаната стойност и после се прави запис в TMR0. В момента на записа на младшия байт се прехвърля и буфера в действителния брояч. Става в рамките на 1 цикъл записа на двата регистъра. Това е пак с цел да няма изненади ако записа става в момент на инкрементиране - обясних го по горе ефекта какъв е.


Вто Фев 19, 2013 10:01 am
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Юни 09, 2012 12:23 am
Мнения: 146
Местоположение: София/Стара Загора
Мнение Re: Обработка на прекъсване от Timer0 -PIC18
Разбирам какво се има предвид: понеже са физически два регистъра е направено така че да се ъпдейтват едновременно, все едно са един 16 битов. Въпросът ми е как да го видя в режим на дебъг или кое да гледам за да виждам него ?


Вто Фев 19, 2013 3:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: Обработка на прекъсване от Timer0 -PIC18
Нали това ти обяснявам че няма как да го видиш, докато не прочетеш младшия байт. Физическия брояч НЕ Е МАПНАТ като регистър и НЕ можеш да го видиш...

Всъщност пиковете имат и други подобни регистри до които нямаш пряк достъп : например такива са двата буфер байта на УАРТ-ите. Разни шифт регистри на серийните модули. И подобни...


Вто Фев 19, 2013 5:22 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Юни 09, 2012 12:23 am
Мнения: 146
Местоположение: София/Стара Загора
Мнение Re: Обработка на прекъсване от Timer0 -PIC18
Аз си мислих че дебъг режима е по-гъвкав, заобикалят се някои особености, в същност за да го виждам в watch-a трябва периодично да прочитам младшият байт. Благодаря за инфото.


Вто Фев 19, 2013 11:57 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: Обработка на прекъсване от Timer0 -PIC18
Не виждам пряк смисъл от "виждането" на тоя регистър, освен да му се любуваш докато цъка. Ако ти трябва неговата стойност, то ще ти трябва и младшия и ще си го прочетеш - това в случай че ползваш таймера като някакъв брояч. Ако го ползваш като тайм бейс - той като се препълни си ти казва.


Сря Фев 20, 2013 9:37 am
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Юни 09, 2012 12:23 am
Мнения: 146
Местоположение: София/Стара Загора
Мнение Re: Обработка на прекъсване от Timer0 -PIC18
Добре сега, искам да използвам за реализирането на многоканална PWM с таймера. Мисля си че мога след като си го настроя да чета стойността до която е стигнал таймер и да преобръщам порта, но ми се вижда прекалено неелегантен метод. Да кажем ако искам да управлявам повече от 3-4 серво моторчета как да изчислявам PWM индивидуално за всяко един от тях независимо с един таймер.


Пон Фев 25, 2013 11:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 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
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 30 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни