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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Конфликт флагов прерываний SREG- TCCR1A.
Marian
сообщение Jun 7 2011, 11:27
Сообщение #16


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
mogikanin
сообщение Jun 8 2011, 02:13
Сообщение #17





Группа: Новичок
Сообщений: 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
Причина редактирования: Избыточное цитирование
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 8 2011, 05:51
Сообщение #18


Гуру
******

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



Цитата(mogikanin @ Jun 8 2011, 06:13) *
Я попробую сделаю чисто тестовый проект и, если ошибка повторится, - вот его и вышлю. А всю программу - никому это не нужно. У меня там инициализация USART, TIME1(TCCR1A,TCCR1B), INT1, INT2, и последняя операция - установка этого главного флага.
Делать "чисто тестовый проект" - вряд ли нужно. Нужно лишь локализовать ошибку. Для чего нужно закоментировать инициализацию устройств, и сравнивать результат "работы" программы по изменению регистра таймера до и после разрешения прерываний. Нужно найти: инициализация какого устройства приводит к этому эффекту? Ну, а потом: искать в участках программы работы с этим устройством ошибку... Если самостоятельно не найдете - выкладывайте код работы с устройством на форум.
Go to the top of the page
 
+Quote Post
mogikanin
сообщение Jun 9 2011, 04:22
Сообщение #19





Группа: Новичок
Сообщений: 8
Регистрация: 5-06-11
Пользователь №: 65 486



Цитата(Палыч @ Jun 8 2011, 12:51) *
Если самостоятельно не найдете - выкладывайте код работы с устройством на форум.

Хорошо, попробую. А если сам найду ошибку - стоит ли всех этим беспокоить?
Мои затычки в программе (повтор записи кода в регистр после установки SREGI) помогли, но причину пока не нашёл. Есть подозрение на INT2, в котором есть команда записать в TCCR1A в 7-й разряд "1". Но по программе это должно происходить далеко позже. Мне кажется, что отладчик будет писать правильно, а железо - нет. Скорее всего я сам создал такую очерёдность инициализаций, которая приводит к этой ошибке. Но пока не могу найти. Порт PORTB2 (вход INT2) я устанавливаю на приём с подтяжкой. Может при включении питания это воспринимается как прерывание? Но и команда записать в TCCR1A в 7-й разряд "1" проходит не во время инициализации, а при определённых условиях, которых в это время нет.
Мне важно было знать: сталкивался ли кто с этой проблемой? Поскольку никто - правильнее считать, что это не дефект СИ-компилятора, а моей программы. Где-то я с ней грубо обошёлся.
Go to the top of the page
 
+Quote Post
SysRq
сообщение Jun 9 2011, 14:26
Сообщение #20


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

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



Цитата(mogikanin @ Jun 9 2011, 08:22) *
...это воспринимается как прерывание?
А вы в инициализации флаг сбросьте перед разрешением прерывания по нему.
Go to the top of the page
 
+Quote Post
Marian
сообщение Jun 9 2011, 17:22
Сообщение #21


Частый гость
**

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



Цитата(mogikanin @ Jun 9 2011, 07:22) *
Хорошо, попробую. А если сам найду ошибку - стоит ли всех этим беспокоить?
Есть подозрение на INT2, в котором есть команда записать в TCCR1A в 7-й разряд "1". Но по программе это должно происходить далеко позже.

Время на проверку этого пять минут, за комментировал запись в TCCR1A в 7-й разряд "1" в INT2 да и проверил.
Go to the top of the page
 
+Quote Post
mogikanin
сообщение Jun 10 2011, 05:37
Сообщение #22





Группа: Новичок
Сообщений: 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))). Т.е. я считал, что операция запрещена, а она разрешалась.
Помогло отсутствие сообщений об аналогичной ошибке, что означало наличие ошибки именно в моей программе, а не в компиляторе.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 10 2011, 11:43
Сообщение #23


неотягощённый злом
******

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



Цитата(mogikanin @ Jun 10 2011, 09:37) *
if (~flag77 & (1<<4))
Бред какой-то.
Вы чего этим хотите добиться?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 10 2011, 11:58
Сообщение #24


Гуру
******

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



Цитата(demiurg_spb @ Jun 10 2011, 15:43) *
Бред какой-то.
Почему же - бред? Наверное, нужно что-то выполнить, если соответствующий разряд флага равен нулю.
Go to the top of the page
 
+Quote Post
mogikanin
сообщение Jun 12 2011, 12:58
Сообщение #25





Группа: Новичок
Сообщений: 8
Регистрация: 5-06-11
Пользователь №: 65 486



Цитата(Палыч @ Jun 10 2011, 18:58) *
Почему же - бред? Наверное, нужно что-то выполнить, если соответствующий разряд флага равен нулю.

Спасибо Палыч за понимание. Этот бит как раз и отвечал за установку бита 7 (разрешение подклюяения порта к ШИМ). Я был уверен, что запрещаю, а на самом деле разрешал. Правильное было утверждение, что как только я разрешал все прерывания, оно тут же и выполнялось.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 13 2011, 16:35
Сообщение #26


неотягощённый злом
******

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



Цитата(Палыч @ Jun 10 2011, 15:58) *
Почему же - бред? Наверное, нужно что-то выполнить, если соответствующий разряд флага равен нулю.

Потому что приоритет ~ выше и будет 3 операции, сначала битовая инверсия, потом наложение маски и проверка на не ноль результата.
Многовато не находите?
Автор индусского кода видимо хотел этого
Код
if (!(flag77 & (1<<4))) {}
Не стоит смешивать битовые и булевые операции...
Да, предлагаю назвать переменную более красиво - flag666, чтоб наверняка..


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 14 2011, 07:21
Сообщение #27


Гуру
******

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



Цитата(demiurg_spb @ Jun 13 2011, 20:35) *
Многовато не находите?
Автор индусского кода видимо хотел этого...
Да, не оптимально написано. Ну, низкая квалификация у человека, и он это не отрицает. Опыт - дело времени...
Go to the top of the page
 
+Quote Post

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

 


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


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