Модераторы: PILOT, ManiaK, Mazzi

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> AVRStudio не показывает значение переменных, значение переменных при отладке всегда 0 
:(
    Опции темы
seatouch
Дата 27.11.2008, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.11.2008

Репутация: нет
Всего: нет



Уважаемые инженеры, добрый день!

Прошу прощения за глупый вопрос, только начал работать с AVRStudio и наверно просто не поставил где-нибудь галочку.

Есть код. В зависимости от напряжения на патенциометре меняется скорость моргания светодиода.

Код

#include <avr\io.h>
#include <avr\delay.h>

unsigned int iDelay ;  //время задержки моргания светодиода.
unsigned char cADCReg, cADCResult ;

void main(void)
{

/*
Использовать для АЦП будем только ножку PA0, 
она не будет использоваться как цифровой вход,
по этому в регисте DIDR0 бит ADC0D устанавливаем в 1.
*/
DIDR0=0x01 ;

/*
Светодиод подключен к PB0, значит эту ножку мы програмируем 
на выход.
*/
DDRB = 0x01 ;

/*
Настройка АЦП.
Что бы на ножку AREF подавалось внутреннее напряжение 
2.56V надо в битты REFS1 и REFS0 записать единицы.
Бит ADLAR устанавливается в 1 это сдвигает биты влево
нас это устраивает т.к. нам не нужна большая точность, достаточно 
8и старших битов. 
.
Биты MUX4-0 устанавливаем в 0 т.к. в этом случае измерение
будет проводится с ножки ADC0.
Число в регистре должно быть таким 11 1 00000 = 
*/
ADMUX = 0b11100000 ; 

//Можно установить деление в 3х младших битах ADCSRA.
//Но пока оставляем их в нулях.



    while (1)
    {
     //Запускаем АЦП
        ADCSRA = 0b01000000 ; // как только измерение закончится 
                              //этот бит пропадет, зато установится
                              // бит ADIF.
        
        //Ждем завершения преобразования
        cADCReg = 0b01010000 & ADCSRA ;

        while (cADCReg != 0b00010000)
        {
            cADCReg = 0b01010000 & ADCSRA ;  //Делаем поразрядное "и" 
                                             //что бы оставить только 
                                             //нужные нам биты ADSC и ADIF.
             
        }

        //Считываем данные ADCH (только старших бит)
        cADCResult = ADCH ;
        
        //Расчиттываем задержку моргания светодиода
        iDelay = cADCResult * 10 ; //умножаем число на 10 это будет время задердки моргания светодиода 
        
        
    };
}
  

Когда останавливаешь программу и подводишь курсор на переменную что бы посмотреть ее значение, всегда отображается 0. 
Когда пошагово прогоняешь программу (F10) до последней строки (iDelay = cADCResult * 10 ) курсор не доходит, перескакиваев В цикл на строку "cADCReg = 0b01010000 & ADCSRA".
Это нормальное поведение программы или всеж-таки надо что-то поправить.

Заранее благодарю.


Это сообщение отредактировал(а) UniBomb - 24.9.2010, 13:21
PM MAIL   Вверх
Mazzi
Дата 27.11.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



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

Удачи!


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
seatouch
Дата 27.11.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.11.2008

Репутация: нет
Всего: нет



Вот, кстати, феномен!
Добавил 2 строки в конец.

_delay_ms(iDelay)  - В окне Processor время задержки меняется: Если ADCH содержит все единицы (т.е. 255) задержка примерно 1200 us. Если 0-7 (в десятичной) примерно 800 us. ХОТЯ!!! при остановке в iDelay всегда 0

Ставлю BreakPoint на строке "iDelay = cADCResult * 10 ; " Запускаю Start Debugging, BreakPoint перескакивает на следующую строку _delay_ms(iDelay). Такое ощущение что iDelay = cADCResult * 10  вообще не учавствует в программе хокя компелится все без единого ворнинга! И время задержки меняется (но не на нужные 2,5 секунды!  Глюки. smile  smile 

P.S.
Вторая строка (последняя): PORTB = PORTB ^ 0x10000000 ;
PM MAIL   Вверх
Mazzi
Дата 27.11.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Советую после включения дебаггера перейти в окно с дизассемблированным кодом и пройти по шагам в нём.

Удачи!


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
seatouch
Дата 27.11.2008, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.11.2008

Репутация: нет
Всего: нет



Mazzi, спасибо за совет, не подскажете как получить файл asm? hex есть, а asm'а не наблюдается :-(
PM MAIL   Вверх
makwen
Дата 28.11.2008, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 9.11.2005
Где: Киев

Репутация: 1
Всего: 1



добавь в обьявление переменных  - volatile 

например:
volatile unsigned int iDelay ;

тогда будут отображатся значения переменных. 

PM MAIL   Вверх
Mazzi
Дата 28.11.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



У меня AVR Studio позволяет писать только на ассемблере, на С я пишу в CodeVisionAVR, а у тебя какой сишный компилятор?


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
UniBomb
Дата 28.11.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Mazzi, свежие версии АВРСтудии умеют работать с avr-gcc. Так что теперь можно и кодить и отлаживать (мм... в смысле производить отладку) в одной ide.

Цитата(seatouch @  27.11.2008,  20:03 Найти цитируемый пост)
не подскажете как получить файл asm?

во время отладки надо открыть окно view->disassembler. А так ассемблерный код хранится в файле <имя_программы>.lst 

Это сообщение отредактировал(а) UniBomb - 28.11.2008, 13:32


--------------------
PM MAIL ICQ Skype   Вверх
seatouch
Дата 28.11.2008, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.11.2008

Репутация: нет
Всего: нет



Большое спасибо за ответы!

Когда я первый раз попытался создать проект, AVRStudio сказал, что у него нету компилятора и предложил скачать avr-gcc с сайта http://winavr.sourceforge.net/. После установки avr-gcc автоматически прописался в AVRStudio (сам только include directires в опциях проекта дописал).

Это сообщение отредактировал(а) seatouch - 28.11.2008, 14:57
PM MAIL   Вверх
Mazzi
Дата 28.11.2008, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Я однажды поставил себе AVR-GCC, но он мне не понравился тем, что я не нашёл в нём битового типа как в Code Vision AVR, и из-за этого я скоро удалил его. 

Может плохо искал?


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
UniBomb
Дата 28.11.2008, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Mazzi, битовый тип - это переменная размером в 1 бит? А почему не использовать битовые поля? Могу предположить, что в Code Vision именно так и реализованно...



--------------------
PM MAIL ICQ Skype   Вверх
seatouch
Дата 28.11.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.11.2008

Репутация: нет
Всего: нет



Ура! Заработало! В iDelay, cADCReg и cADCResult стали появлятся числа после установки volatile (почитал про нее, спасибо!). Но _delay_ms все равно отрабатывает неправильно :-( Судя по окну Processor больше нескольких тысячь us (на сколько я понимаю, это микро секунды) не получается, не смотря на то, что в iDelay делал до 24000. А посмотреть значения переменных в самой процедуре _delay_ms не получается :-(
PM MAIL   Вверх
Mazzi
Дата 28.11.2008, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Цитата(UniBomb @ 28.11.2008,  16:28)
Mazzi, битовый тип - это переменная размером в 1 бит? А почему не использовать битовые поля? Могу предположить, что в Code Vision именно так и реализованно...

Просто есть предопределённый тип - bit.  С этим типом легче жить. smile

Знаю я про битовые поля, но это лишние движения, а я привык к битовому типу, он кстати поддерживается и в Keilе для 51 процов.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
makwen
Дата 28.11.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 9.11.2005
Где: Киев

Репутация: 1
Всего: 1



Цитата(seatouch @ 28.11.2008,  17:39)
Ура! Заработало! В iDelay, cADCReg и cADCResult стали появлятся числа после установки volatile (почитал про нее, спасибо!). Но _delay_ms все равно отрабатывает неправильно :-( Судя по окну Processor больше нескольких тысячь us (на сколько я понимаю, это микро секунды) не получается, не смотря на то, что в iDelay делал до 24000. А посмотреть значения переменных в самой процедуре _delay_ms не получается :-(

На сколько я понимаю, ты используешь стандартную процедуру, а не свою собственную. Тогда учти, что время задержки у нее зависит от зачения дериктивы F_CPU.  Посмотри, чему равно данное значение и сравни с системной частотой работы контроллера, которая установлена в AVRStudio. 

ЗЫ: данными функциями не пользуюсь, пишу своиsmile

Это сообщение отредактировал(а) makwen - 28.11.2008, 18:45
PM MAIL   Вверх
seatouch
Дата 2.12.2008, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.11.2008

Репутация: нет
Всего: нет



Уважаемые инжинеры, сократил программу до минимума.

В AVRStudio все работает. Компелил и загружал hex от CodeVision, результат тот же.


#include <avr\io.h>
#include <avr\delay.h>

volatile unsigned int i ; 

void main(void)
{

DIDR0=0x00 ;
DDRD = 0x00 ;

DDRB = 0b11111111 ;

PORTB =  0b1111111х ; - эта строка выполняется, в зависимости от значения последнего бита светодиод, после программирования, загорается или не загорается.

    while (1)
    {

        i=0 ;
        while (i<400000)   - цикл в AVRStudio работает. Ставил разные значения задержки - после прошивки светодиод все равно не маргает.
        {
           i++ ;
        }

        PORTB = PORTB ^ 0b11111111 ; - эта строка не выполняется.

                //PORTB  = PORTD ;  - без цикла задержки ставил такую строку и выставлял патенциометр в крайние положения - светодиод состояние не меняет. 

    };
}  


Пришла мысль, может быть неправильон спаяна схема, и МК виснит на первых секундах работы. По этому привожу ее в сообщении. 
 smile  smile 

Заранее благодарю!


Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  Graphic1.gif 32,09 Kb
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0970 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.