|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 4:31 am
неудачи с PIC24 и CCS-PICC 4.057
| Автор |
Съобщение |
|
speedblue
Ранг: Ориентиран
Регистриран на: Нед Фев 25, 2007 1:41 am Мнения: 276 Местоположение: София
|
Ники, пробвах само като компилиране и наистина #INT_GLOBAL не се подържа за серия 24F, но другата (#INT_DEFAULT) я приема въпреки, че не е толкова директна като фукционалност... явно за сега толкова с този компилатор.
Успех
|
| Вто Юли 08, 2008 5:10 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
|
| Пон Юли 14, 2008 10:24 am |
|
 |
|
Ники
Ранг: Почетен член
Регистриран на: Съб Окт 30, 2004 11:19 pm Мнения: 609
|
Aко ти се иска освен прекъсването маркирано с FAST, да имаш и други бързи прекъсвния, трябва да отрежеш компилатора да генерира сам кода за пуш/поп регистрите в стека, стигаме до момента че това става най удобно на асемблер. Т.е. питането ми още в началото на темата. Ти решаваш че INT_GLOBAL e вратичката, но интересно ми е какъв е тоя фиксиран адрес 0х0008, след като при 24 всички прекъсвания са със собствен вектор? Ако ти си успял с коя да е директива да подкараш автономно различни прекъсвания, дай идеята, аз до момента с PICC не родих нищо освен загубено време.
|
| Пон Юли 14, 2008 1:29 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Аха, ясно. Виж директивата #build дали не може да ти помогне. За 24 обаче конкретно не знам... така че може и да те подвеждам 
|
| Пон Юли 14, 2008 2:03 pm |
|
 |
|
rumen65
Ранг: Новодошъл
Регистриран на: Чет Окт 06, 2005 2:06 pm Мнения: 194 Местоположение: Sofia
|
Борих същия проблем на CCS само че за PIC18. Трябваше ми да си прихвана двата вектора за прекъсване на асемблер. Единственото което успях да направя е с #INT_GLOBAL да сложи кода на адрес 0х0008. От там на асемблер с 10 Nop-а, стигнах до 0х0018, където е втория вектор, който ми трябваше. Ако тази директива сработи при 24 ки(което не е сигурно), може да походиш по подобен начин.
|
| Пон Юли 14, 2008 4:40 pm |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
Това нещо CCS защо не го зарежете!? Мноого-много одавна, 2 или 3 пъти опитвах да го ползвам и го сложих на първо място в моята класация за бъгавост. Ама имал много хубав хелп - ами естествено, като няма нищо общо с компилатор, поне хелп да има, та дано някой поне да се опита да го ползва.
|
| Пон Юли 14, 2008 7:33 pm |
|
 |
|
Ники
Ранг: Почетен член
Регистриран на: Съб Окт 30, 2004 11:19 pm Мнения: 609
|
Съгласен съм за "чудото" PICC, но във въпроса ми зададен за начало на темата запитах и какви компилатори ползват колегите.
Дотук алтернатива за компилатор е микрочЕпския, освен него би ли добавил някой от който си доволен?
|
| Пон Юли 14, 2008 7:40 pm |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
За 24/30/33 не ползвам друг освен майкрочипския и нямам наблюдения. Може да пробваш с Hi-Tech и IAR. Чувал съм, че са добри. Hi-Tech съм го пробвал за 18-ка - не е зле.
|
| Пон Юли 14, 2008 8:21 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 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
|
След като ми стана пределно ясно, че не ползвам подходящия компилатор за целта, обяснението е може би излишно но ще опитам пак.
Нека приемем, че знам как се инициализират таймери, и как се обработват някакви събития в прекъсванията.
Директивите, които се опитах да използвам, #ORG и #ROM, разполагат код/данни на зададени адреси в програмната/флаш паметта или епрома на процесора. Векторите на прекъсванията са част от програмната/флаш памет, разположени в определен сегмент с фиксиран адрес от нея. Компилатора PICC задава вектор на прекъсване не когато решиш да инициализираш прекъсване, а когато използваш директивата #INT_нещо_си пред функцията която си решил да обработва това прекъсване, но освен кода който се съдържа в тялото на функцията, компилатора добавя пуш и поп на регистри в стека, а това коства поне 30-ина допълнителни цикъла, което забавя все пак прекъсване в което се клати само единствен бит примерно. Но когато искам да ползвам функции написани изцяло на асемблер и не искам компилатора да добавя код, дори това да е пуш/поп работата със стека, следва че е неудобно ползването на съответната директива #INT_нещо_си, откъдето без нея компилатора няма да инициализира нужния вектор на прекъсване. И така стигам отново до #ORG и #ROM, с които се опитах да излъжа компилатора да постави адреса на моята функция във желания вектор на прекъсване, като "чудото" PICC учтиво и без обяснения отказа да направи това. Относно приоритетните прекъсвания и стекирането, сам ще се погрижа да не се получи конфликт от който добрия компилатор ме пази автоматично, а аз така грубо се опитвам да го прескоча ...
Дори и хелпа за 24/30/33 на "чудния" компилатор на места е объркан, недописан или неясен, защото не е писан на ново, а се ползва хелпа за 12/16/18 сериите с корекции които не са обмислени напълно, поне моето впечатление е такова. Нямах никакви сериозни оплаквания докато ползвах този компилатор за 12/16/18 чиповете, но определено изостават с новите фамилии и не могат да наваксат.
Ако все още не съм успял да обясня ясно какво искам, значи е безсмислено да се продължава темата.
|
| Вто Юли 15, 2008 1:10 am |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Съвсем ясно е какво искаш. За 18 става така :
#build(interrupt=0xXXX..) //това казва на компилатора да постави вектора на зададен от теб адрес.
И след това си поставяш с #org товята функция на освободения вече адрес на вектора без проблеми. А за 24 - не знам дали и как ще работи.
|
| Вто Юли 15, 2008 10:31 am |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
Ники, стана ми ясно (може би:-)) какво искаш да направиш и си погледнах листинга на една програма за 24-ка. Ето ти пример за обработка на прекъсване на таймер 5:
а ето и листинга:
Явно компилатора сам се сетил, че не е нужно да записва контекст в стека.
Има и други прекъсвания, в които си записва някой регистри в стека, ама то си трябва.
|
| Вто Юли 15, 2008 7:16 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Не можеш ли да го излъжеш след компилацията ? Примерно, пишеш си твоето прекъсване като нормална подпрограма, било то на Ц или асемблер с retfie накрая(може и да е друга инструкцията, не знам), след RESET четеш какво има записано на адреса на съответния вектор, ако е nop-ове презаписваш на този адрес инструкцията джъмп към твоята подпрограма, разрешаваш прекъсванията след това. На следващия RESET няма да записваш нищо, защото ще си е вече записано. Грубо е като изпълнение, но ти гарантира това, което искаш. Може да се наложи някъде в кода да извикаш фиктивно твоята подпрограма, за да генерира CCS кода, защото като види, че не я използваш (той и идея си няма, че ще е прекъсване) май няма да генерира код. Примерно добро място е след последния оператор на цикъла на главната програма, като ще гледаш да не излезеш от главния цикъл с break, че ще отидеш баш на прекъсването. Не знам дали директивата #FILL_ROM не би могла да свърши тази работа(с изкуствено поставяне на инструкцията джъмп на съответния адреса на вектора).
Написа ли писмо до CCS да ги попиташ какво решение имат(ако имат) за този проблем ? Или поне във форума им, обикновено реагират много бързо.
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Вто Юли 15, 2008 8:02 pm |
|
 |
|
Ники
Ранг: Почетен член
Регистриран на: Съб Окт 30, 2004 11:19 pm Мнения: 609
|
не ми е нужна повече реклама, ще го ползвам микрочепския компилер (:  |  |  |  | ¶ написа: Не можеш ли да го излъжеш след компилацията ? Примерно, пишеш си твоето прекъсване като нормална подпрограма, било то на Ц или асемблер с retfie накрая(може и да е друга инструкцията, не знам), след RESET четеш какво има записано на адреса на съответния вектор, ако е nop-ове презаписваш на този адрес инструкцията джъмп към твоята подпрограма, разрешаваш прекъсванията след това. На следващия RESET няма да записваш нищо, защото ще си е вече записано. Грубо е като изпълнение, но ти гарантира това, което искаш. Може да се наложи някъде в кода да извикаш фиктивно твоята подпрограма, за да генерира CCS кода, защото като види, че не я използваш (той и идея си няма, че ще е прекъсване) май няма да генерира код. Примерно добро място е след последния оператор на цикъла на главната програма, като ще гледаш да не излезеш от главния цикъл с break, че ще отидеш баш на прекъсването. Не знам дали директивата #FILL_ROM не би могла да свърши тази работа(с изкуствено поставяне на инструкцията джъмп на съответния адреса на вектора).
Написа ли писмо до CCS да ги попиташ какво решение имат(ако имат) за този проблем ? Или поне във форума им, обикновено реагират много бързо. |  |  |  |  |
Пирев, твоето решение съм убеден че ще работи 100%, но не бях се сещал изобщо да правя корекции във флаша ет рънтайм.
Не съм писал до CCS, ще им ползвам отрочето до16/18, а за нагоре когато се вкарат в час с доста липси.
|
| Сря Юли 16, 2008 8:44 am |
|
 |
|
Ники
Ранг: Почетен член
Регистриран на: Съб Окт 30, 2004 11:19 pm Мнения: 609
|
не ми е нужна повече реклама, ще го ползвам микрочепския компилер (:  |  |  |  | ¶ написа: Не можеш ли да го излъжеш след компилацията ? Примерно, пишеш си твоето прекъсване като нормална подпрограма, било то на Ц или асемблер с retfie накрая(може и да е друга инструкцията, не знам), след RESET четеш какво има записано на адреса на съответния вектор, ако е nop-ове презаписваш на този адрес инструкцията джъмп към твоята подпрограма, разрешаваш прекъсванията след това. На следващия RESET няма да записваш нищо, защото ще си е вече записано. Грубо е като изпълнение, но ти гарантира това, което искаш. Може да се наложи някъде в кода да извикаш фиктивно твоята подпрограма, за да генерира CCS кода, защото като види, че не я използваш (той и идея си няма, че ще е прекъсване) май няма да генерира код. Примерно добро място е след последния оператор на цикъла на главната програма, като ще гледаш да не излезеш от главния цикъл с break, че ще отидеш баш на прекъсването. Не знам дали директивата #FILL_ROM не би могла да свърши тази работа(с изкуствено поставяне на инструкцията джъмп на съответния адреса на вектора).
Написа ли писмо до CCS да ги попиташ какво решение имат(ако имат) за този проблем ? Или поне във форума им, обикновено реагират много бързо. |  |  |  |  |
Пирев, твоето решение съм убеден че ще работи 100%, но не бях се сещал изобщо да правя корекции във флаша ет рънтайм.
Не съм писал до CCS, ще им ползвам отрочето до16/18, а за нагоре когато се вкарат в час с доста липси.
|
| Сря Юли 16, 2008 8:45 am |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|