Отговори на тема  [ 33 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща
неудачи с PIC24 и CCS-PICC 4.057 
Автор Съобщение
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Нед Фев 25, 2007 1:41 am
Мнения: 276
Местоположение: София
Мнение 
Ники, пробвах само като компилиране и наистина #INT_GLOBAL не се подържа за серия 24F, но другата (#INT_DEFAULT) я приема въпреки, че не е толкова директна като фукционалност... явно за сега толкова с този компилатор.
Успех


Вто Юли 08, 2008 5:10 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
Цитат:
A summary of the different kinds of PIC18 interrupts:

#INT_xxxx

Normal (low priority) interrupt. Compiler saves/restores key registers.

This interrupt will not interrupt any interrupt in progress.

#INT_xxxx FAST

High priority interrupt. Compiler DOES NOT save/restore key registers.


This interrupt will interrupt any normal interrupt in progress.

Only one is allowed in a program.

#INT_xxxx HIGH

High priority interrupt. Compiler saves/restores key registers.

This interrupt will interrupt any normal interrupt in progress.

#INT_GLOBAL

Compiler generates no interrupt code. User function is located

at address 8 for user interrupt handling.


Пон Юли 14, 2008 10:24 am
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
setoy написа:
Цитат:
A summary of the different kinds of PIC18 interrupts:
.....



Aко ти се иска освен прекъсването маркирано с FAST, да имаш и други бързи прекъсвния, трябва да отрежеш компилатора да генерира сам кода за пуш/поп регистрите в стека, стигаме до момента че това става най удобно на асемблер. Т.е. питането ми още в началото на темата. Ти решаваш че INT_GLOBAL e вратичката, но интересно ми е какъв е тоя фиксиран адрес 0х0008, след като при 24 всички прекъсвания са със собствен вектор? Ако ти си успял с коя да е директива да подкараш автономно различни прекъсвания, дай идеята, аз до момента с PICC не родих нищо освен загубено време.


Пон Юли 14, 2008 1:29 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
Аха, ясно. Виж директивата #build дали не може да ти помогне. За 24 обаче конкретно не знам... така че може и да те подвеждам :oops:


Пон Юли 14, 2008 2:03 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 06, 2005 2:06 pm
Мнения: 194
Местоположение: Sofia
Мнение 
Борих същия проблем на CCS само че за PIC18. Трябваше ми да си прихвана двата вектора за прекъсване на асемблер. Единственото което успях да направя е с #INT_GLOBAL да сложи кода на адрес 0х0008. От там на асемблер с 10 Nop-а, стигнах до 0х0018, където е втория вектор, който ми трябваше. Ако тази директива сработи при 24 ки(което не е сигурно), може да походиш по подобен начин.


Пон Юли 14, 2008 4:40 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Това нещо CCS защо не го зарежете!? Мноого-много одавна, 2 или 3 пъти опитвах да го ползвам и го сложих на първо място в моята класация за бъгавост. Ама имал много хубав хелп - ами естествено, като няма нищо общо с компилатор, поне хелп да има, та дано някой поне да се опита да го ползва.


Пон Юли 14, 2008 7:33 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
Gogo написа:
Това нещо CCS защо не го зарежете!? Мноого-много одавна, 2 или 3 пъти опитвах да го ползвам и го сложих на първо място в моята класация за бъгавост. Ама имал много хубав хелп - ами естествено, като няма нищо общо с компилатор, поне хелп да има, та дано някой поне да се опита да го ползва.

Съгласен съм за "чудото" PICC, но във въпроса ми зададен за начало на темата запитах и какви компилатори ползват колегите.
Дотук алтернатива за компилатор е микрочЕпския, освен него би ли добавил някой от който си доволен?


Пон Юли 14, 2008 7:40 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
За 24/30/33 не ползвам друг освен майкрочипския и нямам наблюдения. Може да пробваш с Hi-Tech и IAR. Чувал съм, че са добри. Hi-Tech съм го пробвал за 18-ка - не е зле.


Пон Юли 14, 2008 8:21 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Ето ти пример за обработка на прекъсване от таймери на 30F4013:

void init_TIMER1(void){
T1CON=0; //clear timer1 control register
TMR1=0; //clear timer1 accumulation register
PR1=150;
IPC0bits.T1IP=5; //sets Interrupt priority to 5
IFS0bits.T1IF=0; //clear timer1 interrupt flag
IEC0bits.T1IE=1; //enable timer1 Interrupt
T1CONbits.TON=1; //start timer1
}
//-----------------------------------------------------------
void _ISR _T1Interrupt(void)//will come here whenever timer1 interrupts
{ // Common mode use TIMER
IFS0bits.T1IF=0; //clear timer1 interrupt flag
PR1=150;
key_cnt++;
if(PORTBbits.RB8==1){PORTBbits.RB8=0;}
else {PORTBbits.RB8=1;}
}
//=========================================================
void init_TIMER5(void){
T5CON=0; //clear timer1 control register
TMR5=0; //clear timer1 accumulation register
__asm__ volatile("BSET T5CON,#5" ); //
PR5=0xFFFF; //
IPC5bits.T5IP=4; //sets Interrupt priority to 5
IFS1bits.T5IF=0; //clear timer1 interrupt flag
IEC1bits.T5IE=1; //enable timer1 Interrupt
T5CONbits.TON=1; //start timer1
}
//=======================================================
void _ISR _T5Interrupt(void) //will come here whenever timer1 interrupts
{
IFS1bits.T5IF=0;
PR5=0xFFFF;
data_ready_flag=1;
}


И това е което го искаш,т.е да си ползваш всеки вектор със съответния приоритет.
Hi-Tech за 18 серия също е добър - но ти пита за 24 която е съвместима с 30.
Push и Pop не следва да се пропускат - ако по време на нископриоритетно прекъсване се
генерира такова с по-висок приоритет - става боза.
Та все още се питам за това,какъв ти е проблема къде ще си сложиш програмата по прекъсване
при линейно адресно пространство и за какво ти бяха онези директиви ?


Пон Юли 14, 2008 10:14 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
Ки4о написа:
Ето ти пример за обработка на прекъсване от таймери на 30F4013:

..............
И това е което го искаш,т.е да си ползваш всеки вектор със съответния приоритет.
Hi-Tech за 18 серия също е добър - но ти пита за 24 която е съвместима с 30.
Push и Pop не следва да се пропускат - ако по време на нископриоритетно прекъсване се
генерира такова с по-висок приоритет - става боза.
Та все още се питам за това,какъв ти е проблема къде ще си сложиш програмата по прекъсване
при линейно адресно пространство и за какво ти бяха онези директиви ?


След като ми стана пределно ясно, че не ползвам подходящия компилатор за целта, обяснението е може би излишно но ще опитам пак.

Нека приемем, че знам как се инициализират таймери, и как се обработват някакви събития в прекъсванията.
Директивите, които се опитах да използвам, #ORG и #ROM, разполагат код/данни на зададени адреси в програмната/флаш паметта или епрома на процесора. Векторите на прекъсванията са част от програмната/флаш памет, разположени в определен сегмент с фиксиран адрес от нея. Компилатора PICC задава вектор на прекъсване не когато решиш да инициализираш прекъсване, а когато използваш директивата #INT_нещо_си пред функцията която си решил да обработва това прекъсване, но освен кода който се съдържа в тялото на функцията, компилатора добавя пуш и поп на регистри в стека, а това коства поне 30-ина допълнителни цикъла, което забавя все пак прекъсване в което се клати само единствен бит примерно. Но когато искам да ползвам функции написани изцяло на асемблер и не искам компилатора да добавя код, дори това да е пуш/поп работата със стека, следва че е неудобно ползването на съответната директива #INT_нещо_си, откъдето без нея компилатора няма да инициализира нужния вектор на прекъсване. И така стигам отново до #ORG и #ROM, с които се опитах да излъжа компилатора да постави адреса на моята функция във желания вектор на прекъсване, като "чудото" PICC учтиво и без обяснения отказа да направи това. Относно приоритетните прекъсвания и стекирането, сам ще се погрижа да не се получи конфликт от който добрия компилатор ме пази автоматично, а аз така грубо се опитвам да го прескоча ...
Дори и хелпа за 24/30/33 на "чудния" компилатор на места е объркан, недописан или неясен, защото не е писан на ново, а се ползва хелпа за 12/16/18 сериите с корекции които не са обмислени напълно, поне моето впечатление е такова. Нямах никакви сериозни оплаквания докато ползвах този компилатор за 12/16/18 чиповете, но определено изостават с новите фамилии и не могат да наваксат.
Ако все още не съм успял да обясня ясно какво искам, значи е безсмислено да се продължава темата.


Вто Юли 15, 2008 1:10 am
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
Съвсем ясно е какво искаш. За 18 става така :

#build(interrupt=0xXXX..) //това казва на компилатора да постави вектора на зададен от теб адрес.

И след това си поставяш с #org товята функция на освободения вече адрес на вектора без проблеми. А за 24 - не знам дали и как ще работи.


Вто Юли 15, 2008 10:31 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Ники, стана ми ясно (може би:-)) какво искаш да направиш и си погледнах листинга на една програма за 24-ка. Ето ти пример за обработка на прекъсване на таймер 5:
Код:
void __attribute__((interrupt, no_auto_psv)) _T5Interrupt(void)
{
   T5CONbits.TON = 0;
   IFS1bits.T5IF = 0;       //Clear the interrupt flag
}

а ето и листинга:
Код:
_T5Interrupt        bclr.b    0x0121,#7
                    bclr.b    0x0087,#4
                    retfie

Явно компилатора сам се сетил, че не е нужно да записва контекст в стека.
Има и други прекъсвания, в които си записва някой регистри в стека, ама то си трябва.


Вто Юли 15, 2008 7:16 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Не можеш ли да го излъжеш след компилацията ? Примерно, пишеш си твоето прекъсване като нормална подпрограма, било то на Ц или асемблер с retfie накрая(може и да е друга инструкцията, не знам), след RESET четеш какво има записано на адреса на съответния вектор, ако е nop-ове презаписваш на този адрес инструкцията джъмп към твоята подпрограма, разрешаваш прекъсванията след това. На следващия RESET няма да записваш нищо, защото ще си е вече записано. Грубо е като изпълнение, но ти гарантира това, което искаш. Може да се наложи някъде в кода да извикаш фиктивно твоята подпрограма, за да генерира CCS кода, защото като види, че не я използваш (той и идея си няма, че ще е прекъсване) май няма да генерира код. Примерно добро място е след последния оператор на цикъла на главната програма, като ще гледаш да не излезеш от главния цикъл с break, че ще отидеш баш на прекъсването. Не знам дали директивата #FILL_ROM не би могла да свърши тази работа(с изкуствено поставяне на инструкцията джъмп на съответния адреса на вектора).


Написа ли писмо до CCS да ги попиташ какво решение имат(ако имат) за този проблем ? Или поне във форума им, обикновено реагират много бързо.

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Вто Юли 15, 2008 8:02 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
Gogo написа:
Ники, стана ми ясно (може би:-)) какво искаш да направиш и си погледнах листинга на една програма за 24-ка. Ето ти пример за обработка на прекъсване на таймер 5:
Код:
void __attribute__((interrupt, no_auto_psv)) _T5Interrupt(void)
{
   T5CONbits.TON = 0;
   IFS1bits.T5IF = 0;       //Clear the interrupt flag
}

а ето и листинга:
Код:
_T5Interrupt        bclr.b    0x0121,#7
                    bclr.b    0x0087,#4
                    retfie

Явно компилатора сам се сетил, че не е нужно да записва контекст в стека.
Има и други прекъсвания, в които си записва някой регистри в стека, ама то си трябва.


не ми е нужна повече реклама, ще го ползвам микрочепския компилер (:

¶ написа:
Не можеш ли да го излъжеш след компилацията ? Примерно, пишеш си твоето прекъсване като нормална подпрограма, било то на Ц или асемблер с retfie накрая(може и да е друга инструкцията, не знам), след RESET четеш какво има записано на адреса на съответния вектор, ако е nop-ове презаписваш на този адрес инструкцията джъмп към твоята подпрограма, разрешаваш прекъсванията след това. На следващия RESET няма да записваш нищо, защото ще си е вече записано. Грубо е като изпълнение, но ти гарантира това, което искаш. Може да се наложи някъде в кода да извикаш фиктивно твоята подпрограма, за да генерира CCS кода, защото като види, че не я използваш (той и идея си няма, че ще е прекъсване) май няма да генерира код. Примерно добро място е след последния оператор на цикъла на главната програма, като ще гледаш да не излезеш от главния цикъл с break, че ще отидеш баш на прекъсването. Не знам дали директивата #FILL_ROM не би могла да свърши тази работа(с изкуствено поставяне на инструкцията джъмп на съответния адреса на вектора).


Написа ли писмо до CCS да ги попиташ какво решение имат(ако имат) за този проблем ? Или поне във форума им, обикновено реагират много бързо.

Пирев, твоето решение съм убеден че ще работи 100%, но не бях се сещал изобщо да правя корекции във флаша ет рънтайм.
Не съм писал до CCS, ще им ползвам отрочето до16/18, а за нагоре когато се вкарат в час с доста липси.


Сря Юли 16, 2008 8:44 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
Gogo написа:
Ники, стана ми ясно (може би:-)) какво искаш да направиш и си погледнах листинга на една програма за 24-ка. Ето ти пример за обработка на прекъсване на таймер 5:
Код:
void __attribute__((interrupt, no_auto_psv)) _T5Interrupt(void)
{
   T5CONbits.TON = 0;
   IFS1bits.T5IF = 0;       //Clear the interrupt flag
}

а ето и листинга:
Код:
_T5Interrupt        bclr.b    0x0121,#7
                    bclr.b    0x0087,#4
                    retfie

Явно компилатора сам се сетил, че не е нужно да записва контекст в стека.
Има и други прекъсвания, в които си записва някой регистри в стека, ама то си трябва.


не ми е нужна повече реклама, ще го ползвам микрочепския компилер (:

¶ написа:
Не можеш ли да го излъжеш след компилацията ? Примерно, пишеш си твоето прекъсване като нормална подпрограма, било то на Ц или асемблер с retfie накрая(може и да е друга инструкцията, не знам), след RESET четеш какво има записано на адреса на съответния вектор, ако е nop-ове презаписваш на този адрес инструкцията джъмп към твоята подпрограма, разрешаваш прекъсванията след това. На следващия RESET няма да записваш нищо, защото ще си е вече записано. Грубо е като изпълнение, но ти гарантира това, което искаш. Може да се наложи някъде в кода да извикаш фиктивно твоята подпрограма, за да генерира CCS кода, защото като види, че не я използваш (той и идея си няма, че ще е прекъсване) май няма да генерира код. Примерно добро място е след последния оператор на цикъла на главната програма, като ще гледаш да не излезеш от главния цикъл с break, че ще отидеш баш на прекъсването. Не знам дали директивата #FILL_ROM не би могла да свърши тази работа(с изкуствено поставяне на инструкцията джъмп на съответния адреса на вектора).


Написа ли писмо до CCS да ги попиташ какво решение имат(ако имат) за този проблем ? Или поне във форума им, обикновено реагират много бързо.

Пирев, твоето решение съм убеден че ще работи 100%, но не бях се сещал изобщо да правя корекции във флаша ет рънтайм.
Не съм писал до CCS, ще им ползвам отрочето до16/18, а за нагоре когато се вкарат в час с доста липси.


Сря Юли 16, 2008 8:45 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 33 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща

Кой е на линия

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


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

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