roboforum.ru

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


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

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

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 раз(а).
Аватара пользователя
Aseris
 
Сообщения: 1142
Зарегистрирован: 01 сен 2009, 14:58
Откуда: Чехия
прог. языки: C/С++, VHDL, Verilog, ASM, Python

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

Сообщение Romikgy » 30 мар 2013, 12:39

а inline не поможет?
die Wahrheit ist irgendwo da draußen
Аватара пользователя
Romikgy
 
Сообщения: 750
Зарегистрирован: 15 ноя 2009, 13:37
Откуда: Porto Franco "Odessa"

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

Сообщение Aseris » 30 мар 2013, 17:42

inline MCC18 неумеет :(
Аватара пользователя
Aseris
 
Сообщения: 1142
Зарегистрирован: 01 сен 2009, 14:58
Откуда: Чехия
прог. языки: C/С++, VHDL, Verilog, ASM, Python

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"
Листинг в студию...
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

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

Сообщение Aseris » 30 мар 2013, 22:48

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

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

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

Добавлено спустя 13 минут 55 секунд:
листинг ток во вторник бует, пасха выходные...
Аватара пользователя
Aseris
 
Сообщения: 1142
Зарегистрирован: 01 сен 2009, 14:58
Откуда: Чехия
прог. языки: C/С++, VHDL, Verilog, ASM, Python

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.

Вообще, щто глупость конечно в пиках убивает. С прерывания с высоким приоритетом надо тратить лишние такты на гото, а с низким приоритетом без лишних тактов :)
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

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

Сообщение Aseris » 02 апр 2013, 11:30

мнда... а MPLAB X IDE v1.60 и С18 вупор нехотят делится листингом на асме... :(
Аватара пользователя
Aseris
 
Сообщения: 1142
Зарегистрирован: 01 сен 2009, 14:58
Откуда: Чехия
прог. языки: C/С++, VHDL, Verilog, ASM, Python

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

Сообщение dccharacter » 02 апр 2013, 11:51

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

а я как-то выцарапывал ведь
где-то там галочка есть, если не найдешь до вечера - поищу
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

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

Сообщение Aseris » 02 апр 2013, 12:31

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

Добавлено спустя 4 минуты 29 секунд:
Пока решил ручным инлайном ... прямо код повставлял...
Аватара пользователя
Aseris
 
Сообщения: 1142
Зарегистрирован: 01 сен 2009, 14:58
Откуда: Чехия
прог. языки: C/С++, VHDL, Verilog, ASM, Python

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

Сообщение dccharacter » 02 апр 2013, 12:37

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

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

не не, там есть где-то галка, что, мол, генерить asm-файл
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19