|
Конфликт флагов прерываний SREG- TCCR1A. |
|
|
|
Jun 7 2011, 11:27
|

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

|
Цитата(mogikanin @ Jun 5 2011, 07:03)  Конфликт флагов прерываний 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; - это помогло. Но как этот дефект скажется во время работы программы? Опасаюсь. По тем данным, что вы предоставили, проблемы нет. Нет кода нет подсказки.
Код выложите, а то я сильно сомневаюсь, что 7-й разряд в TCCR1A самопроизвольно устанавливается. И проц какой не написали.
Сообщение отредактировал Marian - Jun 7 2011, 11:56
|
|
|
|
|
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))). Т.е. я считал, что операция запрещена, а она разрешалась. Помогло отсутствие сообщений об аналогичной ошибке, что означало наличие ошибки именно в моей программе, а не в компиляторе.
|
|
|
|
|
Jun 12 2011, 12:58
|
Группа: Новичок
Сообщений: 8
Регистрация: 5-06-11
Пользователь №: 65 486

|
Цитата(Палыч @ Jun 10 2011, 18:58)  Почему же - бред? Наверное, нужно что-то выполнить, если соответствующий разряд флага равен нулю. Спасибо Палыч за понимание. Этот бит как раз и отвечал за установку бита 7 (разрешение подклюяения порта к ШИМ). Я был уверен, что запрещаю, а на самом деле разрешал. Правильное было утверждение, что как только я разрешал все прерывания, оно тут же и выполнялось.
|
|
|
|
|
Jun 13 2011, 16:35
|

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

|
Цитата(Палыч @ Jun 10 2011, 15:58)  Почему же - бред? Наверное, нужно что-то выполнить, если соответствующий разряд флага равен нулю. Потому что приоритет ~ выше и будет 3 операции, сначала битовая инверсия, потом наложение маски и проверка на не ноль результата. Многовато не находите? Автор индусского кода видимо хотел этого Код if (!(flag77 & (1<<4))) {} Не стоит смешивать битовые и булевые операции... Да, предлагаю назвать переменную более красиво - flag666, чтоб наверняка..
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|