roboforum.ru

Технический форум по робототехнике.

PIC18 + C18 + Прерывание и вызов функции в нем

PIC18 + C18 + Прерывание и вызов функции в нем

Aseris » 30 мар 2013, 12:39

Вобщем по долгу службы начал работать с PIC18 + MCC18 компилятором, c PSoC, х86 и ARM привык на полную прерываниями пользоватся, развкрнулся в пике с его обрезаным контроллером прерываний и стеком.

И полезли прелести: при вызове функции в прерывании низкого уровня, програма не возвращяется из прерывания в основной цикл, куда оно лезет еще не разобрался, (пока толоько 2 неделю инструментарий осваиваю для PIC). Функция вызывается только в прерывании. Что может быть неправильно?

Сами прерывания прописаны согдасно датащиту:

Код: Выделить всёРазвернуть

void filter(void)
{
...фильтр
}

#pragma code high_vector=0x08 
void high_vector(void)
{
    _asm GOTO HighInt _endasm
}
     
#pragma code low_vector=0x18
void low_vector(void)
{
    _asm GOTO LowInt _endasm
}
#pragma code

#pragma interrupt HighInt
void HighInt(void)
{
...Тело обработчика прерывания   
}

#pragma interrupt LowInt
void LowInt(void)
{
...Тело прерывания
filter();
...Тело прерывания
}


Добавлено спустя 25 минут 35 секунд:
Еще вспомнил, может важно - активно switch-case используется, с ним уже в других компиляторах на других контроллерах натыкался на проблемы...
Последний раз редактировалось Aseris 30 мар 2013, 22:30, всего редактировалось 2 раз(а).

Re: PIC18 + C18 + Прерывание и вызов функции в нем

Romikgy » 30 мар 2013, 12:39

а inline не поможет?

Re: PIC18 + C18 + Прерывание и вызов функции в нем

Aseris » 30 мар 2013, 17:42

inline MCC18 неумеет :(

Re: PIC18 + C18 + Прерывание и вызов функции в нем

Dmitry__ » 30 мар 2013, 18:05

Aseris писал(а):развкрнулся в пике с его обрезаным контроллером прерываний и стеком.

Нормальный там контроллер :wink:
Aseris писал(а):И полезли прелести: при вызове функции в прерывании низкого уровня, програма не возвращяется из прерывания в основной цикл, куда оно лезет еще не разобрался,

А что за танцы с бубном с кучей гото? Ну ладно гото на high_vector, т.к. он наедет на адреса LowInt, но зачем в LowInt куда-то прыгать?
И почему он должен выйти из прерывания если функция void LowInt(void) закончится "return", а из прерывания надо выходить по "retfie"
Думаю, что только "#pragma code low_vector=0x18 " знает что это прерывание и из него надо выходить по "retfie"
Листинг в студию...

Re: PIC18 + C18 + Прерывание и вызов функции в нем

Aseris » 30 мар 2013, 22:48

Блин, называется код схватил с нета гдето, на первый взгляд тоже что и у мня,

Вобщем поправил в первом сообщении как в датащите в екзампле, там #pragma interrupt HighInt и #pragma interruptlow LowInt окончания выставляют

гото прямо оттуда, там так извращаются и на лов и на хай вектор скачут через гото... :(, хм нада бы посмотреть что ето все генерит в асме...

Добавлено спустя 13 минут 55 секунд:
листинг ток во вторник бует, пасха выходные...

Re: PIC18 + C18 + Прерывание и вызов функции в нем

Dmitry__ » 30 мар 2013, 23:01

Так ошибка осталась?
Вот тут код красивше:
Код: Выделить всёРазвернуть
// Interrupt pragma for low priority

#pragma code
#pragma interrupt InterruptServiceLow
void InterruptServiceLow()
{
// function statements

// return from low priority interrupt

}

http://www.edaboard.com/thread191810.html

Aseris писал(а):хм нада бы посмотреть что ето все генерит в асме...

Добавлено спустя 13 минут 55 секунд:
листинг ток во вторник бует, пасха выходные...

Да, листинг все покажет...

Добавлено спустя 7 минут 15 секунд:
А вообще, гото на LowInt лишний.
адрес 0х08 - вектор прерываний с высоким приоритетом.
адрес 0х18 - вектор с низким приоритетом.
В HighInt нужен гото, т.к. до вектора LowInt остается 16 байт и обработчик не поместится. А после 0x18 нет больше векторов, можно обработку LowInt писать прямо с ORG 0x18.

Вообще, щто глупость конечно в пиках убивает. С прерывания с высоким приоритетом надо тратить лишние такты на гото, а с низким приоритетом без лишних тактов :)

Re: PIC18 + C18 + Прерывание и вызов функции в нем

Aseris » 02 апр 2013, 11:30

мнда... а MPLAB X IDE v1.60 и С18 вупор нехотят делится листингом на асме... :(

Re: PIC18 + C18 + Прерывание и вызов функции в нем

dccharacter » 02 апр 2013, 11:51

Aseris писал(а):мнда... а MPLAB X IDE v1.60 и С18 вупор нехотят делится листингом на асме... :(

а я как-то выцарапывал ведь
где-то там галочка есть, если не найдешь до вечера - поищу

Re: PIC18 + C18 + Прерывание и вызов функции в нем

Aseris » 02 апр 2013, 12:31

Нашел через дебаг окно, ток както оно навевает воспоминания о начале времен... :(
табличка адрес код семантика, и только во время дебага..

Добавлено спустя 4 минуты 29 секунд:
Пока решил ручным инлайном ... прямо код повставлял...

Re: PIC18 + C18 + Прерывание и вызов функции в нем

dccharacter » 02 апр 2013, 12:37

Aseris писал(а):Нашел через дебаг окно, ток както оно навевает воспоминания о начале времен... :(
табличка адрес код семантика, и только во время дебага..

Добавлено спустя 4 минуты 29 секунд:
Пока решил ручным инлайном ... прямо код повставлял...

не не, там есть где-то галка, что, мол, генерить asm-файл


cron
Rambler\'s Top100 Mail.ru counter