Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.89/44: Рейтинг темы: голосов - 44, средняя оценка - 4.89
Votk
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
1

Нужна помощь знатоков!! Не знаю что подозревать...

12.11.2012, 21:40. Просмотров 7916. Ответов 27
Метки нет (Все метки)

Здравствуйте. Уже неделю мучаюсь, нужна помощь форумчан знатоков ибо все остальные разводят руками... Пишу программу для Atmego32 и отлаживаю её по JTAG, но программа при отладке ведёт себя некоректно и при выходе из функции или из прерывания может ускакать в любую часть кода. Подумал, что срыв стека (хотя с чего? всего три вложенных вызова) сделал все функции библиотеки y2s.c из которых отладчик вылетал (причём вылетал не каждый раз, а когда ему захочется) "static inline void" и вроде как это спасло. И всё стало хорошо работать. Но стоило мне добавить пару строк в виде ввода контроллера в режим Idle,
как программа стала со второго раза (почему именно со второго - не понятно) из пробуждающего прерывания выходить не туда куда надо а опять в любую часть кода. (JTAG срывается и молотит совсем в другом месте, а не там где должен) И при нажатии паузы при этом Студия выводит:
Error reodyng memory : IO Address:0 Size:64
Error reodyng memory : REGISTERS Address:0 Size:32
Но прерывания то я не могу сделать статик инлайн... Подскажите в какую сторону мне хоть думать?! В сторону фьюзов? Они стоят: 09:H EF:L может дело в бите OCDIM? Хотя врядли.. Или в сторону отладчика (спаян и прошит по статье с сайта), может стоит пойти купить фирменный какой? Поможет? Или это камень помирает и я заюзал его память до дыр этой отладкой? Или дело в том, что я недавно перешёл на Си и как то криво написал программу... Подскажите пожалуйста, а то я уже не знаю что делать!...
Два исходника (рабочий и не рабочий) прилагаю. Отличаются только:
Код
-----------Функции-------------
Idle_ON()
{
MCUCR = (1<<SE)|(0<<SM2)|(0<<SM1)|(0<<SM0);
}

Idle_OFF()
{
MCUCR = (0<<SE)|(0<<SM2)|(0<<SM1)|(0<<SM0);
}
*************************************

-----------Вариант 1--------------
RTC_Set_Alarm(); //Начальная установка будильника
sei(); //Глобальн. разрешение прерываний

while(1)
{
while(!Flag_Int_RTC)
{}
RTC_Set_Alarm(); //Установка будильника
Flag_Int_RTC=0;  //отчистка флага прерывания
}

return 0;
}

//==============================================
//*********Внешнее прерывание*****************
ISR(INT0_vect)
{
_delay_ms(5000);
Flag_Int_RTC=1;
}

-----------Вариант 2---------------
RTC_Set_Alarm(); //Начальная установка будильника
sei(); //Глобальн. разрешение прерываний
Idle_ON();  //Разрешить режим Idle
SLEEP;     //Спать

while(1)
{
while(!Flag_Int_RTC)
{}
RTC_Set_Alarm(); //Установка будильника
Flag_Int_RTC=0;  //отчистка флага прерывания
}

return 0;
}

//==============================================

//*********Внешнее прерывание*****************
ISR(INT0_vect)
{
_delay_ms(5000);
Idle_OFF(); ////запретить режим Idle
Flag_Int_RTC=1;
}
P.S. вывод из режима Power Down возможен только по внешнему прерыванию (обнаруживаемого асинхронно) что это значит? На каком то из форумов читал, что это только прерывание "по низкому уровню", а по "нарастающему фронту" не получиться. Так это или нет? [112.9 Кб]
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2012, 21:40
Ответы с готовыми решениями:

Помощь нужна, не знаю, куда обратиться
Говорю сразу - сей псто к разделу отношения не имеет. Уважаемые модераторы, и администратор - искал...

Нужна помощь по скрипту/макросу(не знаю как правильно называется)
Вбрела в голову идея. Для форума forum_name сделать автообновление аватара() и не знаю как...

Требуется помощь знатоков Lisp
((lambda (x y z) (if (&gt; x y) (if (&gt; x z) x z) (&gt; y z) y z)) 2 4 6) помогите...

Пожалуйста, НУЖНА ПОМОЩЬ, а то что то не выходит(
1. Ввести динамічний масив A(N) з клавіатури. Кількість елементів ввести з клавіатури (new). 2. До...

Нужна помощь подскажите что не так делаю.
Вечер добрый! Нужна помощь вот сайт -&gt; www.moeabto.ru, помогите с автоматизацией, подскажите как...

27
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
12.11.2012, 22:32 2
Задержки в прерывании - круче только яйца...
И да, продолжайте про static. Это видно местная панацея от всего...
0
Votk
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
12.11.2012, 23:20 3
Цитата Сообщение от dosykus_2
Задержки в прерывании - круче только яйца...
Задержку в прерывании я для отладки всунул, чтоб на осциллографе видно было, что он в него заходит. (линия держится поднятой). Но намёк понял..
И да, продолжайте про static. Это видно местная панацея от всего...
Нет, просто попробовал таким образом избавиться от RET, по которой он улетает куда угодно. Думал что сработало, ан нет...
И если можно, без сарказма и по делу. Я ведь не кричу, что я кулхацкер, а прошу помочь.
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
12.11.2012, 23:30 4
Цитата Сообщение от Votk
Задержку в прерывании я для отладки всунул,
Где был слизан сей отладочный прием ?
Цитата Сообщение от Votk
И если можно, без сарказма и по делу. Я ведь не кричу, что я кулхацкер, а прошу помочь.
Вам все дано - сарказм можете отбросить, вас научить думать ?
Ну что ж попробуем - поразмышляйте, что будет если в задержке придет еще одно прерывание ?
0
12.11.2012, 23:30
Votk
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
12.11.2012, 23:36 5
Цитата Сообщение от dosykus_2
Цитата Сообщение от Votk
Задержку в прерывании я для отладки всунул,
Где был слизан сей отладочный прием ?
Цитата Сообщение от Votk
И если можно, без сарказма и по делу. Я ведь не кричу, что я кулхацкер, а прошу помочь.
Вам все дано - сарказм можете отбросить, вас научить думать ?
Ну что ж попробуем - поразмышляйте, что будет если в задержке придет еще одно прерывание ?
Сей приём - мой экспромт.
Вообще, по хорошему оно прийти не должно, т.к. прерывание генерирует аларм часов реального времени, заводимый на пятисекундный интервал после выхода из прерывания. Ну а даже если и придёт, то поднимется флаг прерывания и по выходу из прерывания оно опять зайдёт в себя же, т.е. зациклиться. И я это увижу и приму меры. Так?
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
12.11.2012, 23:40 6
Цитата Сообщение от dosykus_2
Ну что ж попробуем - поразмышляйте, что будет если в задержке придет еще одно прерывание ?
А что произойдет? Я не заметил, чтоб в прерывании перед задержкой был поднят SEI
0
Votk
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
12.11.2012, 23:43 7
А что кстати по поводу ошибки:
Error reodyng memory : IO Address:0 Size:64
Error reodyng memory : REGISTERS Address:0 Size:32
Может кто нибудь знает из за чего она может возникать? И как можно попробовать побороться?
0
Votk
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
13.11.2012, 13:04 8
Залил программу "мигание диодом"
Код
#include <avr/io.h>
#include <util/delay.h>
#include <sompat/deprecated.h>

int main(void)
{
DDRB= 0b00000010;
PORTB=0b00000000;

while(1)
{
sbi (PORTB,1);
cbi (PORTB,1);
}
return 0;
}
И та же история! Стрелка может прыгать по циклу и всё хорошо работать, потом выскочить из него в инициализацию порта и снова зациклиться на мигании. А как только после cbi и sbi добавил delay_ms(500) всё стало ещё не стабильней. И даже без отладчика диод не мигает а просто светиться. Что это? Помер таргет?
0
somyo_3
0 / 0 / 0
Регистрация: 09.01.2011
Сообщений: 544
13.11.2012, 13:48 9
Может, у тебя по железу проблема? До этого же таких проблем не было?
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
13.11.2012, 13:58 10
Цитата Сообщение от Votk
Залил программу "мигание диодом"
Код
#include <avr/io.h>
#include <util/delay.h>
#include <sompat/deprecated.h>

int main(void)
{
DDRB= 0b00000010;
PORTB=0b00000000;

while(1)
{
sbi (PORTB,1);
cbi (PORTB,1);
}
return 0;
}
И та же история! Стрелка может прыгать по циклу и всё хорошо работать, потом выскочить из него в инициализацию порта и снова зациклиться на мигании. А как только после cbi и sbi добавил delay_ms(500) всё стало ещё не стабильней. И даже без отладчика диод не мигает а просто светиться. Что это? Помер таргет?
Возможно, что у вас проблема из-за ватчдога. Возможно, что он включен фьюзами. А сброса (wdr) в программе нет. По умолчанию время до сброса 16 мс. Потому и неадекватное поведение программы.
0
Th0r
0 / 0 / 0
Регистрация: 24.10.2015
13.11.2012, 14:14 11
Цитата Сообщение от Votk
И даже без отладчика диод не мигает а просто светиться
А ты уверен что разглядишь мигание диода с частотой порядка мегагерца?
0
Votk
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
13.11.2012, 14:21 12
Цитата Сообщение от Th0r
Цитата Сообщение от Votk
И даже без отладчика диод не мигает а просто светиться
А ты уверен что разглядишь мигание диода с частотой порядка мегагерца?
Задержка в 500ms = 0.5s. т.е. период равен 1с. а частота соответственно 2Гц. Её я разгляжу. А вот фьюз бита отвечающего за вачдог у меги 32 я не нашёл не в проге Burn-o-mat, не во фьюз калькуляторе. http://avr.roboforum.ru/calc.html?part=ATmego32
Может, у тебя по железу проблема? До этого же таких проблем не было?
Да возможно. Щас попробую заменить таргет.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
13.11.2012, 14:52 13
Пардон. Только что воткнул 32 мегу. Фьюза на watchdog нет.
0
Th0r
0 / 0 / 0
Регистрация: 24.10.2015
13.11.2012, 15:12 14
[QUOTE="Votk"]Залил программу "мигание диодом"
Код
#include <avr/io.h>
#include <util/delay.h>
#include <sompat/deprecated.h>

int main(void)
{
DDRB= 0b00000010;
PORTB=0b00000000;

while(1)
{
sbi (PORTB,1);
cbi (PORTB,1);
}
return 0;
}
Цитата Сообщение от Votk
Задержка в 500ms = 0.5s. т.е. период равен 1с. а частота соответственно 2Гц.
В какой строке программы задержка?
0
Votk
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
13.11.2012, 15:15 15
Цитата Сообщение от Th0r
Цитата Сообщение от Votk
Залил программу "мигание диодом"
Код
#include <avr/io.h>
#include <util/delay.h>
#include <sompat/deprecated.h>

int main(void)
{
DDRB= 0b00000010;
PORTB=0b00000000;

while(1)
{
sbi (PORTB,1);
cbi (PORTB,1);
}
return 0;
}
Цитата Сообщение от Votk
Задержка в 500ms = 0.5s. т.е. период равен 1с. а частота соответственно 2Гц.
В какой строке программы задержка?
Я же писал:
А как только после cbi и sbi добавил delay_ms(500) всё стало ещё не стабильней
Соответственно добавил после строки sbi (PORTB,1); и после cbi (PORTB,1);
0
Th0r
0 / 0 / 0
Регистрация: 24.10.2015
13.11.2012, 15:33 16
А, извиняюсь, не заметил.
0
Votk
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
13.11.2012, 16:09 17
Поменял таргет на аналогичный. И со стандартными фьюзами H:99 L:E1 всё работает отлично.(если без Delay) Но стоит их поменять на H:89 L:EF (на плате стоит кварц 10 МГц) При нажатии Билд анд ран - стрелка становиться на начало, но студия пишет:
Error reodyng memory : REGISTERS Address:0 Size:32
При трассировке стрелка , на одном из шагов теряеться и вылетает ошибка:
Error reodyng memory : IO Address:0 Size:64
Error reodyng memory : REGISTERS Address:0 Size:32
При нажатии паузы во время исполнения также стрелка останавливаеться непойми где и пишет:
Error reodyng memory : IO Address:0 Size:64
Error reodyng memory : REGISTERS Address:0 Size:32
Хотя с отключеным JTAGом или если просто нажать Run диод мигает... Что это? Плохой кварц? так он бы тогда не запускался и не мигал без вовсе...?
Заметил на внутреннем генераторе в 1 МГц всё работает норм пока без задержек, а как только вставляешь задержку, то стрелка до неё идёт, а на ней исчезает и контроллер срывается молотить, а студия вываливает всё то же:
Error reodyng memory : IO Address:0 Size:64
Error reodyng memory : REGISTERS Address:0 Size:32
0
dork
0 / 0 / 0
Регистрация: 25.03.2017
05.12.2012, 22:40 18
Возможно для кого-то скажу крамолу но ...
плюньте на отладку через JTAG (и любой др. эмулятор).

Для отладки СИ программ за 10 лет работы ни разу мне они не понадобились.
ЛЮБУЮ программу AVR (и др. 8 битника) можно отладить имея программатор и 1-2 светодиода, ну и голову к этому не забыть приложить тоже.

Для примера привожу "обычные" цифры:
отладка (+ перенос на др. камень + дописывание функционала + тестпрограмма на RAD студио) последней проги на меге168 в объеме 91% от памяти заняла 3 дня (неполных рабочих). При этом добавлено примерно 25% кода с нуля.

Эти цифры привожу только чтобы проиллюстрировать, то что я хочу сказать:
как только понимаешь как отладиться минимальными средствами, то принципиально начинаешь думать и писать по другому, не обязательно идеально (с точки зрения программиста), но писать устойчивый код становится как ни странно проще.

впрочем это только ИМХО.

А по делу:
1. заставте светодиод мигать.
2. отладьте реакцию на нажатие кнопки - индикацию нажатия выведите на светодиод.
3. проверьте логику прерываний и что и когда разрешаете, если есть сомнения начните с простых вещей
(сделайте себе пару макросов типа #define _BLIKRED (PORTG = PORTG ^ 0x01) для фиксации событий и вставляя в разные части кода проверьте как отрабатываются такие ловушки. Например, вставив только в два места будете понимать, что программа проходит их оба (загорелся-погас) или только один (загорелся) или вообще ни одного (нет включения светодиода)).
4. в последнюю очередь уходите на тест спящих режимов (смотрите как в том или ином случае иницализируются переменные при старте и т.п., обычно я все сбрасываю в одну функцию типа DataIni() )
..
ну в крайнем случае можно отдельные функции "пробить" на симуляторе.
0
komtrottir
0 / 0 / 0
Регистрация: 02.11.2010
Сообщений: 500
06.12.2012, 00:07 19
Возможно для кого-то скажу крамолу но ...
плюньте на отладку через JTAG (и любой др. эмулятор).
+1
0
Ymk
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
06.12.2012, 00:12 20
да ваще джитаг идиоты придумали...
0
06.12.2012, 00:12
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2012, 00:12

Что такое с моим сайтом?нужна помощь!
Не понимаю проблемы моего сайта. Поисковые роботы меня вообще не любят. Особенно google. Заметил...

Хочу собрать то, не знаю что, под задачи такие, не знаю какие
Всем доброго времени суток и заранее спасибо всем, кто попытается разобраться в этом потоке...

Сравниваем! Знаю что это будет R9 290, но вот какой фирмы не знаю
Ребят вот такой вопрос, на днях покупаю видеокарту, но не знаю какую, точно знаю что это будет R9...


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

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

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