|
Конфликт флагов прерываний SREG- TCCR1A. |
|
|
|
Jun 5 2011, 04:03
|
Группа: Новичок
Сообщений: 8
Регистрация: 5-06-11
Пользователь №: 65 486

|
Конфликт флагов прерываний SREG- TCCR1A. Установлено ПО: WinAVR-20100110, AvrStudio418Setup+ AVRStudio4.18SP1. Программа на AVR GCC. При загрузке регистр TCCR1A=0x02. Последней операцией идёт разрешение прерываний SREG|=(1<<SREG_I);. Пробовал и SREG=0x80; - результат один и тот же: одновременно с флагом I (7-й разряд) устанавливается так же 7-й разряд в TCCR1A. И результат становится TCCR1A=0x82. Кто-нибудь сталкивался с такой проблемой? И как она решается? На форуме уже обсуждался аналогичный вопрос с взаимовлияниями TCCR1A и SREG, но я не понял решения и ситуация там была с выходом из программы, а не во время загрузки. В загрузке я после установки SREG добавил TCCR1A=0x02; - это помогло. Но как этот дефект скажется во время работы программы? Опасаюсь.
|
|
|
|
|
 |
Ответов
|
Jun 7 2011, 03:53
|
Группа: Новичок
Сообщений: 8
Регистрация: 5-06-11
Пользователь №: 65 486

|
Цитата(VladislavS @ Jun 6 2011, 18:12)  1. Смотри ассемблерный код. Чудес не бывает. 2. Использовать sei() и cli() религия не позволяет? sei() и cli() религия позволяет. Пробовал. Но на старой версии 2006. Там их нет, ПО ругалось. В новой версии 2010 не попробовал, считал что будет также. Но попробую. Цитата(Палыч @ Jun 6 2011, 19:33)  Закоментируйте всё до приведенной Вами конструкции (сохранение в памяти регистров и глобальное разрешение прерываний). Сравните сохраненные значения, если они равны, то вставляйте частями закоментированные куски... Ищите где происходит "бяка". Спасибо, попробую. Но я думал, что кто-нибудь уже сталкивался с этим. Ведь была же ошибка при записи в ЕЕПРОМ. Я по рекомендации обновил версии и эта ошибка исчезла. А с конфликтом этих регистров - может у них опять ошибка?
|
|
|
|
|
Jun 7 2011, 04:28
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(mogikanin @ Jun 7 2011, 07:53)  sei() и cli() религия позволяет. Пробовал. Но на старой версии 2006. Там их нет, ПО ругалось. В новой версии 2010 не попробовал, считал что будет также. Но попробую. На любой версии есть. Код #include <avr/interrupt.h> Цитата(mogikanin @ Jun 7 2011, 07:53)  Ведь была же ошибка при записи в ЕЕПРОМ. Это не ошибка, а особенность. И никуда ничего не делось и не исправилось. Просто включайте brown-out detector и всё. Цитата(mogikanin @ Jun 7 2011, 07:53)  может у них опять ошибка? У кого у них? В 99,9% ошибка у Вас в голове...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jun 8 2011, 02:13
|
Группа: Новичок
Сообщений: 8
Регистрация: 5-06-11
Пользователь №: 65 486

|
Цитата(demiurg_spb @ Jun 7 2011, 11:28)  На любой версии есть. Код #include <avr/interrupt.h> Это не ошибка, а особенность. И никуда ничего не делось и не исправилось. Просто включайте brown-out detector и всё. У кого у них? В 99,9% ошибка у Вас в голове... <avr/interrupt.h> - это я не забыл. "Это не ошибка, а особенность." - но у меня факт - записи в ЕЕПРОМ небыло. Обновил версии не меняя программы - и она заработала. А про эту "особенность" я не выдумал - она обсуждалась на сайте в прошлом году. Просто я узнал об этом месяц назад. И "brown-out detector" здесь ни при чём. "В 99,9% ошибка у Вас в голове..." - хоть и грубо, но приходится согласиться. Цитата(Marian @ Jun 7 2011, 18:27)  Контроллер ATmega16. Листинг пока не вижу смысла высылать - это много. Я попробую сделаю чисто тестовый проект и, если ошибка повторится, - вот его и вышлю. А всю программу - никому это не нужно. У меня там инициализация USART, TIME1(TCCR1A,TCCR1B), INT1, INT2, и последняя операция - установка этого главного флага.
Сообщение отредактировал IgorKossak - Jun 8 2011, 07:00
Причина редактирования: Избыточное цитирование
|
|
|
|
|
Jun 8 2011, 05:51
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(mogikanin @ Jun 8 2011, 06:13)  Я попробую сделаю чисто тестовый проект и, если ошибка повторится, - вот его и вышлю. А всю программу - никому это не нужно. У меня там инициализация USART, TIME1(TCCR1A,TCCR1B), INT1, INT2, и последняя операция - установка этого главного флага. Делать "чисто тестовый проект" - вряд ли нужно. Нужно лишь локализовать ошибку. Для чего нужно закоментировать инициализацию устройств, и сравнивать результат "работы" программы по изменению регистра таймера до и после разрешения прерываний. Нужно найти: инициализация какого устройства приводит к этому эффекту? Ну, а потом: искать в участках программы работы с этим устройством ошибку... Если самостоятельно не найдете - выкладывайте код работы с устройством на форум.
|
|
|
|
|
Jun 9 2011, 04:22
|
Группа: Новичок
Сообщений: 8
Регистрация: 5-06-11
Пользователь №: 65 486

|
Цитата(Палыч @ Jun 8 2011, 12:51)  Если самостоятельно не найдете - выкладывайте код работы с устройством на форум. Хорошо, попробую. А если сам найду ошибку - стоит ли всех этим беспокоить? Мои затычки в программе (повтор записи кода в регистр после установки SREGI) помогли, но причину пока не нашёл. Есть подозрение на INT2, в котором есть команда записать в TCCR1A в 7-й разряд "1". Но по программе это должно происходить далеко позже. Мне кажется, что отладчик будет писать правильно, а железо - нет. Скорее всего я сам создал такую очерёдность инициализаций, которая приводит к этой ошибке. Но пока не могу найти. Порт PORTB2 (вход INT2) я устанавливаю на приём с подтяжкой. Может при включении питания это воспринимается как прерывание? Но и команда записать в TCCR1A в 7-й разряд "1" проходит не во время инициализации, а при определённых условиях, которых в это время нет. Мне важно было знать: сталкивался ли кто с этой проблемой? Поскольку никто - правильнее считать, что это не дефект СИ-компилятора, а моей программы. Где-то я с ней грубо обошёлся.
|
|
|
|
|
Jun 9 2011, 17:22
|

Частый гость
 
Группа: Участник
Сообщений: 148
Регистрация: 23-02-07
Пользователь №: 25 618

|
Цитата(mogikanin @ Jun 9 2011, 07:22)  Хорошо, попробую. А если сам найду ошибку - стоит ли всех этим беспокоить? Есть подозрение на INT2, в котором есть команда записать в TCCR1A в 7-й разряд "1". Но по программе это должно происходить далеко позже. Время на проверку этого пять минут, за комментировал запись в TCCR1A в 7-й разряд "1" в INT2 да и проверил.
|
|
|
|
|
Jun 10 2011, 05:37
|
Группа: Новичок
Сообщений: 8
Регистрация: 5-06-11
Пользователь №: 65 486

|
Цитата(Marian @ Jun 10 2011, 00:22)  Время на проверку этого пять минут, за комментировал запись в TCCR1A в 7-й разряд "1" в INT2 да и проверил. Нашёл ошибку в своей программе. На это ушло далеко не 5 минут (низкая квалификация). Тему можно считать закрытой. Спасибо всем за помощь! Может, кому пригодится: 1) Заблуждение: прерывание INT2 установлено на смену фронта, поэтому при включении питания прерывание не должно срабатывать(полагал, что сигнал подтяжки означает не фронт сигнала, а просто сигнал), а оно срабатывает. В этом прерывании идёт обработка сигналов (в моей программе) и разрешение (включение) бита 7 при этом не должно происходить, потому и не мог понять ошибку. 2) Ошибка в программе - должно было быть if (~flag77 & (1<<4)), а у меня небыло знака инверсии (if (flag77 & (1<<4))). Т.е. я считал, что операция запрещена, а она разрешалась. Помогло отсутствие сообщений об аналогичной ошибке, что означало наличие ошибки именно в моей программе, а не в компиляторе.
|
|
|
|
Сообщений в этой теме
mogikanin Конфликт флагов прерываний SREG- TCCR1A. Jun 5 2011, 04:03 VladislavS Даташит:ЦитатаThe I-bit can also be set and cleare... Jun 5 2011, 06:40 Палыч Цитата(mogikanin @ Jun 5 2011, 08:03) одн... Jun 5 2011, 06:59 mogikanin Цитата(Палыч @ Jun 5 2011, 13:59) Вероятн... Jun 6 2011, 02:00  Палыч Цитата(mogikanin @ Jun 6 2011, 06:00) ...... Jun 6 2011, 05:20   mogikanin Цитата(Палыч @ Jun 6 2011, 12:20) Хорошо ... Jun 6 2011, 10:22 ARV если вы "тупо" переделали программу на С... Jun 6 2011, 04:38 demiurg_spb Цитата(ARV @ Jun 6 2011, 08:38) поэтому о... Jun 6 2011, 04:48  _Pasha Цитата(demiurg_spb @ Jun 6 2011, 07:48) Х... Jun 6 2011, 05:47   demiurg_spb Цитата(_Pasha @ Jun 6 2011, 09:47) Кодsei... Jun 6 2011, 05:56 Палыч Закоментируйте всё до приведенной Вами конструкции... Jun 6 2011, 12:33      SysRq Цитата(mogikanin @ Jun 9 2011, 08:22) ...... Jun 9 2011, 14:26         Палыч Цитата(demiurg_spb @ Jun 10 2011, 15:43) ... Jun 10 2011, 11:58          mogikanin Цитата(Палыч @ Jun 10 2011, 18:58) Почему... Jun 12 2011, 12:58          demiurg_spb Цитата(Палыч @ Jun 10 2011, 15:58) Почему... Jun 13 2011, 16:35           Палыч Цитата(demiurg_spb @ Jun 13 2011, 20:35) ... Jun 14 2011, 07:21  _Pasha Цитата(mogikanin @ Jun 7 2011, 06:53) А с... Jun 7 2011, 05:50 Marian Цитата(mogikanin @ Jun 5 2011, 07:03) Кон... Jun 7 2011, 11:27
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|