Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Обработка на прекъсване от Timer0 -PIC18
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=11113
Страница 1 от 2

Автор:  polinom [ Нед Фев 17, 2013 10:51 pm ]
Заглавие:  Обработка на прекъсване от 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. Ако може някой да ми разясни как се организират прекъсванията за тоя компилатор. Знам че има два вектора на прекъсване, приоритет на прекъсванията, може да се забраняват и разрешават ама някъде ми се губят нещата.

Автор:  Stoimen [ Нед Фев 17, 2013 11:34 pm ]
Заглавие:  Re: Обработка на прекъсване от Timer0 -PIC18

Погледни това
http://www.enmcu.com/guides/usingtimerandinterruptinc18

Прикачени файлове:
timers-and-interrupt-setting.pdf [90.65 KiB]
346 пъти

Автор:  sparkybg [ Пон Фев 18, 2013 12:16 am ]
Заглавие:  Re: Обработка на прекъсване от Timer0 -PIC18

Виж си внимателно последния ред на сорса. Как искаш да мига като му казваш да не мига. Изпуснал си едно !.

Автор:  polinom [ Пон Фев 18, 2013 1:46 am ]
Заглавие:  Re: Обработка на прекъсване от Timer0 -PIC18

Това съм го изпуснал след суматите преправения съм го махнал.Направих там нещо и то тръгна но изкочиха други въпроси. Таймера не се препълва инкрементира се само младшата част а съм го направил в 16 битов режим.

Автор:  Cekins [ Пон Фев 18, 2013 10:21 am ]
Заглавие:  Re: Обработка на прекъсване от Timer0 -PIC18

Мда... с това конфугуриране на Т0, прекъсване ще имаш веднъж на 9 минути. Ти колко време го чакаш да се препълни ?

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

Автор:  polinom [ Пон Фев 18, 2013 6:23 pm ]
Заглавие:  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. Благодаря ви за помощта.

Автор:  Cekins [ Пон Фев 18, 2013 7:05 pm ]
Заглавие:  Re: Обработка на прекъсване от Timer0 -PIC18

Ами пак не си разбрал - тоя буфер е с цел да може да изпълни едноцикловото писане/четене в двата байта. Не знам защо за таймер0 е описано сякаш по-криво отколкото за Т1/3/5 - там е подобно, само дето може да избираш дали да е буферирано или не. Дефакто не можеш да четеш/пишеш "истинския" брояч, но четейки TMR0, буфера TMR0H автоматично се зарежда и с действителния HighByte на таймера. Целта е ако в момента на четене на младшия байт има препълване/пренос на/към старшия, това да не ти повлияе на четенето. Примерно ако е трябвало да прочетеш 65535 (hFFFF), ще прочетеш първо единия - 255 и имаш препълване и другия ще го прочетеш 0.

Автор:  polinom [ Пон Фев 18, 2013 8:22 pm ]
Заглавие:  Re: Обработка на прекъсване от Timer0 -PIC18

Cekins написа:
Ами пак не си разбрал - тоя буфер е с цел да може да изпълни едноцикловото писане/четене в двата байта. Не знам защо за таймер0 е описано сякаш по-криво отколкото за Т1/3/5 - там е подобно, само дето може да избираш дали да е буферирано или не. Дефакто не можеш да четеш/пишеш "истинския" брояч, но четейки TMR0, буфера TMR0H автоматично се зарежда и с действителния HighByte на таймера. Целта е ако в момента на четене на младшия байт има препълване/пренос на/към старшия, това да не ти повлияе на четенето. Примерно ако е трябвало да прочетеш 65535 (hFFFF), ще прочетеш първо единия - 255 и имаш препълване и другия ще го прочетеш 0.

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

Автор:  Cekins [ Вто Фев 19, 2013 10:01 am ]
Заглавие:  Re: Обработка на прекъсване от Timer0 -PIC18

За да го видиш ти трябва примерно : movf TMR0,w
Този регистър се ъпдейтва само при четене на TMR0. Може и да не съм го обяснил много точно но го има написано в предния ми пост. При запис съответно първо се зарежда TMR0H със желаната стойност и после се прави запис в TMR0. В момента на записа на младшия байт се прехвърля и буфера в действителния брояч. Става в рамките на 1 цикъл записа на двата регистъра. Това е пак с цел да няма изненади ако записа става в момент на инкрементиране - обясних го по горе ефекта какъв е.

Автор:  polinom [ Вто Фев 19, 2013 3:58 pm ]
Заглавие:  Re: Обработка на прекъсване от Timer0 -PIC18

Разбирам какво се има предвид: понеже са физически два регистъра е направено така че да се ъпдейтват едновременно, все едно са един 16 битов. Въпросът ми е как да го видя в режим на дебъг или кое да гледам за да виждам него ?

Автор:  Cekins [ Вто Фев 19, 2013 5:22 pm ]
Заглавие:  Re: Обработка на прекъсване от Timer0 -PIC18

Нали това ти обяснявам че няма как да го видиш, докато не прочетеш младшия байт. Физическия брояч НЕ Е МАПНАТ като регистър и НЕ можеш да го видиш...

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

Автор:  polinom [ Вто Фев 19, 2013 11:57 pm ]
Заглавие:  Re: Обработка на прекъсване от Timer0 -PIC18

Аз си мислих че дебъг режима е по-гъвкав, заобикалят се някои особености, в същност за да го виждам в watch-a трябва периодично да прочитам младшият байт. Благодаря за инфото.

Автор:  Cekins [ Сря Фев 20, 2013 9:37 am ]
Заглавие:  Re: Обработка на прекъсване от Timer0 -PIC18

Не виждам пряк смисъл от "виждането" на тоя регистър, освен да му се любуваш докато цъка. Ако ти трябва неговата стойност, то ще ти трябва и младшия и ще си го прочетеш - това в случай че ползваш таймера като някакъв брояч. Ако го ползваш като тайм бейс - той като се препълни си ти казва.

Автор:  polinom [ Пон Фев 25, 2013 11:26 pm ]
Заглавие:  Re: Обработка на прекъсване от Timer0 -PIC18

Добре сега, искам да използвам за реализирането на многоканална PWM с таймера. Мисля си че мога след като си го настроя да чета стойността до която е стигнал таймер и да преобръщам порта, но ми се вижда прекалено неелегантен метод. Да кажем ако искам да управлявам повече от 3-4 серво моторчета как да изчислявам PWM индивидуално за всяко един от тях независимо с един таймер.

Автор:  sparkybg [ Вто Фев 26, 2013 9:32 am ]
Заглавие:  Re: Обработка на прекъсване от Timer0 -PIC18

Няма какво да изчисляваш и да обръщаш ти. Има си микроконтролери с вграден PWM хардуер. На тях само им задаваш какво да е PWM то (например 128 от 256, което е 50%), и контролера си се грижи за останалото. Прочети си хубаво даташита на PIC18-ката. Вътре си пише всичко.

Раздел 15 и 16 на даташита обясняват на дълго и на широко как работи тоя хардуер. Накратко - задаваш си на съответния таймер да брои например от 0 до 1023, и задаваш на хардуера да ти държи някой пин в 0 ако брояча на таймера е под някаква стойност и 1 ако е над нея. Като променяш дадената стойност между 0 и 1023 си регулираш процента на PWM-то.

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/