реклама на сайте
подробности

 
 
> Прерывания в CodeVisionAVR: как?
Александр К.
сообщение Oct 1 2009, 15:30
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 12-11-06
Из: Волгоград
Пользователь №: 22 235



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

Код
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
unsigned char adc_data;
// Read the 8 most significant bits
// of the AD conversion result

// Place your code here
  adc_data=ADCH;
  adc_data=(adc_data>>1); // j не больше 127
  if(adc_data==1) adc_data=0;// j==1 исключается - особенность функции poworot
  if(i_adc_buf==2) i_adc_buf=0;
  else ++i_adc_buf;
  j=(adc_buf[0]+adc_buf[1]+adc_buf[2]+adc_data)/4; //рекурсия
  adc_buf[i_adc_buf]=j;

}


Куска хватит или нужно всё?
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SysRq
сообщение Oct 1 2009, 17:40
Сообщение #2


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Ну вот:
Код
#pragma savereg- // Выключить автоматическое сохранение регистров

Потому и не работает ( http://telesys.ru/wwwboards/mcontrol/287/m...es/136890.shtml ).

PS: уберите тег [коде][/коде] вокруг [кодебокс][/кодебокс], я вас запутал немножко.
Go to the top of the page
 
+Quote Post
Александр К.
сообщение Oct 1 2009, 17:50
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 12-11-06
Из: Волгоград
Пользователь №: 22 235



Цитата(SysRq @ Oct 1 2009, 21:40) *
Потому и не работает ...

Спасибо. Посмотрел по ссылке, но не понял - почему нельзя использовать штатную команду? Я в прерывании регистры не использую, все переменные - глобальные. И почему ж нельзя? Глюк CV?
-----------------------------------------------------------------------------------------------------------
Исправил и проверил. Всё нормально. Ещё раз спасибо.
Вопрос остался ...

Сообщение отредактировал Александр К. - Oct 1 2009, 18:10
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 1 2009, 18:20
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Александр К. @ Oct 1 2009, 23:50) *
не понял - почему нельзя использовать штатную команду? Я в прерывании регистры не использую, все переменные - глобальные.
Как это не используете? А unsigned char adc_data и результаты промежуточных вычислений где по-вашему хранятся?
Go to the top of the page
 
+Quote Post
Александр К.
сообщение Oct 1 2009, 18:33
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 12-11-06
Из: Волгоград
Пользователь №: 22 235



В регистрах. Но их (регистров) больше, чем переменных. И все переменные - глобальные. Пересечений нет.
Вот фрагмент на асемблере. После остановки симулятора указатель показывает на адрес 180.
CODE
+00000172: E7AA LDI R26,0x7A Load immediate
+00000173: E0B0 LDI R27,0x00 Load immediate
+00000174: 91EC LD R30,X Load indirect
+00000175: E0F0 LDI R31,0x00 Load immediate
+00000176: 64E0 ORI R30,0x40 Logical OR with immediate
+00000177: 93EC ST X,R30 Store indirect
+00000178: 9508 RET Subroutine return
+00000179: 91E9 LD R30,Y+ Load indirect and postincrement
+0000017A: 91F9 LD R31,Y+ Load indirect and postincrement
+0000017B: 9630 ADIW R30,0x00 Add immediate to word
+0000017C: F039 BREQ PC+0x08 Branch if equal
+0000017D: EA80 LDI R24,0xA0 Load immediate
+0000017E: E09F LDI R25,0x0F Load immediate
+0000017F: 9701 SBIW R24,0x01 Subtract immediate from word
+00000180: F7F1 BRNE PC-0x01 Branch if not equal
+00000181: 95A8 WDR Watchdog reset
+00000182: 9731 SBIW R30,0x01 Subtract immediate from word
+00000183: F7C9 BRNE PC-0x06 Branch if not equal
+00000184: 9508 RET Subroutine return
+00000185: 95F1 NEG R31 Two's complement
+00000186: 95E1 NEG R30 Two's complement
+00000187: 40F0 SBCI R31,0x00 Subtract immediate with carry
+00000188: 9508 RET Subroutine return
+00000189: 2400 CLR R0 Clear Register


Я в этом не понимаю ... Конкретный косяк не видно?
Очень хочется не сохранять все РОН при прерывании.
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 1 2009, 18:45
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Александр К. @ Oct 2 2009, 00:33) *
В регистрах. Но их (регистров) больше, чем переменных. И все переменные - глобальные. Пересечений нет.
Прерывание для компилятора это процесс недетерминированный во времени. Каждую функцию (в т.ч. и обработчик прерывания) компилятор транслирует отдельно. Откуда ему знать, какие регистры в момент возникновения прерывания используются, а какие нет?
Цитата(Александр К. @ Oct 2 2009, 00:33) *
Очень хочется не сохранять все РОН при прерывании.
Напишите обработчик прерывания на ассемблере, запретив компилятору использовать регистры, которые вы будете использовать в обработчике прерывания.
А еще лучше, как я вам раньше и советовал, выкиньте из прерывания фильтрацию (вычисление плавающего среднего), перенеся ее в main или в другую функцию.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Александр К.   Прерывания в CodeVisionAVR: как?   Oct 1 2009, 15:30
- - rezident   Замените Кодif(i_adc_buf==2) i_adc_buf=0; ...   Oct 1 2009, 16:15
|- - Александр К.   Спасибо. Заменил - симулятору не полегчало. Всё по...   Oct 1 2009, 16:32
- - rezident   Делать фильтрацию внутри прерывания это моветон. К...   Oct 1 2009, 16:42
|- - Александр К.   Цитата(rezident @ Oct 1 2009, 20:42) ...А...   Oct 1 2009, 16:54
- - rezident   Это не ко мне. У меня и AVRStudio-то нету   Oct 1 2009, 16:58
- - SysRq   Покажите остальной код, и МК укажите какой у вас. ...   Oct 1 2009, 17:11
|- - Александр К.   Как на этом движке дать вложение? Или дать програм...   Oct 1 2009, 17:21
|- - SysRq   Цитата(Александр К. @ Oct 1 2009, 21:21) ...   Oct 1 2009, 17:26
|- - Александр К.   CODE/*********************************************...   Oct 1 2009, 17:35
|- - Александр К.   Убрал лишнее из прерывания. И при #pragma savereg-...   Oct 1 2009, 19:01
- - SysRq   Регистры общего назначения и SREG. Они используютс...   Oct 1 2009, 18:08


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 17:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01411 секунд с 7
ELECTRONIX ©2004-2016