Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
takhvatulin
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
1

Выход из прерывания для CAN (AT90CAN128)

30.10.2014, 14:42. Просмотров 1158. Ответов 6
Метки нет (Все метки)

Всем привет!
Столкнулся с такой проблемой:
Вот моя мейновая функция:
C
1
2
3
4
5
6
7
8
9
10
11
void main(void)
{
    USORT0_Init();  
    CAN_Init();
    #asm("sei");
    DDRC = 0xAA;
    while(1)
    {
         
    }  
}
Вот обработчик прерывания:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
interrupt [CAN_IT] void can_isr(void)    // ïðåðûâГ*Г*ГЁГҐ ГЇГ® ïðè¸ìó ГёГЁГ*Г» CAN
{      
    char check_sum;
    char arr_can_mess[SIZE_CAN_PACK];
    int i;
    check_sum = 0x00; 
    DDRC = 0x00;
    
    #asm("cli")     
    CANSTMOB =0x00;
    
    
    CANPAGE = 0x10;
    arr_can_mess[6] = CANMSG;
    CANPAGE = 0x11;
    arr_can_mess[7] = CANMSG;
    CANPAGE = 0x12;
    arr_can_mess[8] = CANMSG;
    CANPAGE = 0x13;
    arr_can_mess[9] = CANMSG;
    CANPAGE = 0x14;
    arr_can_mess[10] = CANMSG;
    CANPAGE = 0x15;
    arr_can_mess[11] = CANMSG;
    CANPAGE = 0x16;
    arr_can_mess[12] = CANMSG;
    CANPAGE = 0x17;
    arr_can_mess[13] = CANMSG;
    
    arr_can_mess[5] = (CANCDMOB & 0b00001111); 
    
    if((CANCDMOB & 1<<4) != 0)
    {
        arr_can_mess[4] = 1; // Г°Г*ñøèðåГ*Г*ûé èäåГ*ГІГЁГґГЁГЄГ*òîð
    }
    else 
    {   
        arr_can_mess[4] = 0; // Г±ГІГ*Г*Г¤Г*ðòГ*ûé èäåГ*ГІГЁГґГЁГЄГ*òîð
    }
    
    
    arr_can_mess[0] = (CANIDT1 >> 3);
    arr_can_mess[1] = (CANIDT1 << 5);
    arr_can_mess[1] += (CANIDT2 >> 3);
    arr_can_mess[2] = (CANIDT2 << 5);
    arr_can_mess[2] += (CANIDT3 >> 3);
    arr_can_mess[3] = (CANIDT3 << 5);
    arr_can_mess[3] += (CANIDT4 >> 3);
    
    for(i = 0; i < 14; i++)
    {
        check_sum += arr_can_mess[i];
    }
    arr_can_mess[14] = 0x00 - check_sum; 
      
   
    for(i = 0; i < SIZE_CAN_PACK; i++)
    {
        USORT0_Transmit(arr_can_mess[i]); 
    }
 
    CANCDMOB = 0b10000000;
    #asm("sei")  
    return;                      
 }
В весь код вникать не нужно, обратите внимание только на порт С. В мейновой функции я зажигаю диоды, которые у меня к порту С подключены, а в прерывании я их гашу. Т.е. диоды должны гореть до первого прерывания, после они должны потухнуть, так как программа в зависает в цикле while. Но у меня диоды загораются снова. По всей видимости, после прерывания программа не возвращается в то место где было вызвано прерывание и начинает загово прогонять функцию main(). Есть подозрение что как то не верно в стек запоминается место на котором произошло прерывания, или неверно вытаскивается. Кто нибудь может помочь, как обойти этот глюк?
Пишу на С, в Code Vision AVR. МК - AT90CAN128(очень схож с ATMEGA128)

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2014, 14:42
Ответы с готовыми решениями:

Принудительный выход из прерывания на СИ
Доброго времени всем форумчанам. Столкнулся с проблемой - нужно выйти из прерывания раньше времени,...

Выход из обработчика прерывания
Есть обработчик прерывания, который проверяет состояние кнопки и в зависимости от состояния кнопки...

Выход из прерывания в нужное место
Доброго дня суток! Есть небольшая задачка. Помогите с решением. При окончании прерывания нужно...

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

AT90CAN128 (Atmel Studio 6). Перевод символов для ЖКИ
здравствуйте есть такой код для перевода символов для ЖКИ, если подставлять его тупо в массив то...

6
dzrkot
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,039
30.10.2014, 14:55 2
а ты точно в прерывание попадаешь?
0
Voland_
1665 / 1053 / 99
Регистрация: 04.01.2010
Сообщений: 3,567
30.10.2014, 15:19 3
Цитата Сообщение от takhvatulin Посмотреть сообщение
В мейновой функции я зажигаю диоды, которые у меня к порту С подключены, а в прерывании я их гашу.
регистр DDRC задает направление ног порта, но не его состояние. Для смены состояния в режиме выхода (то есть когда DDRC=0xFF) в вашем случае, используйте регистр PORTC.

Добавлено через 3 минуты
PS: вы очень оптимистично отнеслись к возможностям AVR, выполняя парсинг сообщений и их отправку прямо в прерываниях от CAN'а. Чтобы контроллер выдержал весь поток сообщений, нужно делать либо FIFO сообщений (и обрабатывать их в главном потоке), либо функции в прерывании должны быть максимально примитивными, типа зажигания лампочек и т.д.
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
30.10.2014, 15:29 4
Voland_,
Цитата Сообщение от Voland_ Посмотреть сообщение
регистр DDRC задает направление ног порта, но не его состояние. Для смены состояния в режиме выхода (то есть когда DDRC=0xFF) в вашем случае, используйте регистр PORTC.
Вы правы, что так правильно делать, я так всегда делаю, но смущает вот что:
Я так понимаю светики катодами в порт смотрят.
DDRC = 0xAA; Порт в режим "выход" уровень на пине "0"
DDRC = 0; Порт в режиме "вход" уровень на пине Hi-Z (обрыв)
По идеи работать тоже должно.

Цитата Сообщение от Voland_ Посмотреть сообщение
Чтобы контроллер выдержал весь поток сообщений, нужно делать либо FIFO сообщений
Поддерживаю.
0
dzrkot
30.10.2014, 15:32
  #5

Не по теме:

как я не заметил DDRC в мыслях же крутилось что что-то не так...

0
Voland_
1665 / 1053 / 99
Регистрация: 04.01.2010
Сообщений: 3,567
30.10.2014, 22:39 6
Цитата Сообщение от Витальич Посмотреть сообщение
По идеи работать тоже должно.
так должно , изврат, но тем не менее .
ЗЫ: вообще, даже в Z-состоянии мелкие сигнальные SMD-светики размерами 0603 и 0805 тоже светятся... Хватает мизерного тока утечки.
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
30.10.2014, 22:44 7
Не спорю, что светятся, сам их на свои платы ставлю, но разница будет заметна и вопрос по другому бы звучал.
0
30.10.2014, 22:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2014, 22:44

Выход из обработчика прерывания
Задача: По прерыванию (нажатие кнопки) нужно покинуть рабочий цикл и передать управление некой...

Помогитес контроллером AT90CAN128
Вобщем суть проблемы такая: нужна подробная инфа по этому контроллеру (AT90CAN128) на русском...

профи по AT90CAN128. к вам вопрос
доброго времени суток я начал использование сети can. прием передача итд. подскажите зачем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru