Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > AVRStudio не показывает значение переменных


Автор: seatouch 27.11.2008, 14:29
Уважаемые инженеры, добрый день!

Прошу прощения за глупый вопрос, только начал работать с 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".
Это нормальное поведение программы или всеж-таки надо что-то поправить.

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

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

Удачи!

Автор: seatouch 27.11.2008, 17:42
Вот, кстати, феномен!
Добавил 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 ;

Автор: Mazzi 27.11.2008, 18:03
Советую после включения дебаггера перейти в окно с дизассемблированным кодом и пройти по шагам в нём.

Удачи!

Автор: seatouch 27.11.2008, 20:03
Mazzi, спасибо за совет, не подскажете как получить файл asm? hex есть, а asm'а не наблюдается :-(

Автор: makwen 28.11.2008, 11:20
добавь в обьявление переменных  - volatile 

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

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

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

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

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

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

Автор: seatouch 28.11.2008, 14:42
Большое спасибо за ответы!

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

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

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

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

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

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

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

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

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

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

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

Автор: seatouch 2.12.2008, 15:11
Уважаемые инжинеры, сократил программу до минимума.

В 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 

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

Автор: makwen 2.12.2008, 15:47
Цитата(seatouch @  2.12.2008,  15:11 Найти цитируемый пост)
        while (i<400000)   - цикл в AVRStudio работает. Ставил разные значения задержки - после прошивки светодиод все равно не маргает.        {           i++ ;        }


Цитата(seatouch @  2.12.2008,  15:11 Найти цитируемый пост)
volatile unsigned int i ; 


ты обьявил i как unsigned int, который имеет размер 2 байта. Т.е. максимальное значение 65535, а у тебя условие i<400000, соответственно оно всегда будет верно. И ты с цикла никогда не выйдешь. 

Автор: Mazzi 2.12.2008, 15:57
Схема содержит короткое замыкание по питанию, смотри вывод 30.
Почитай вот это, там похоже такая же проблема с фьюзами.
http://forum.vingrad.ru/act-ST/f-36/t-237408/view-findpost/p-1707132.html

Фьюзы для 64 меги описаны здесь http://ulei.by.ru/Fuses_Ru.htm

Удачи!

Автор: seatouch 2.12.2008, 16:51
[QUOTE=Mazzi,2.12.2008,  15:57]Схема содержит короткое замыкание по питанию, смотри вывод 30.
Почитай вот это, там похоже такая же проблема с фьюзами.
http://forum.vingrad.ru/act-ST/f-36/t-237408/view-findpost/p-1707132.html

Фьюзы для 64 меги описаны здесь http://ulei.by.ru/Fuses_Ru.htm

Удачи!


Сорри, у меня там конденсатор стоит 0.1 мкФ. Это я чего-то маху в схеме дал. Перед установкой МК на место я всю схему прозвонил на КЗ.
Спасибо за ссылку, покопаю.

Автор: seatouch 2.12.2008, 19:41
УРА!!! Светодиод заморгал. Схема нормальная, программатор работает.
Правда кроме с.д. больше ничего не работает. Буду с кодом разбираться. Больше всего меня беспокоит вопрос как посмотреть и прошить fuse биты? Порыл инет, куча описания как и что такое fuse, а как дело доходит до прошивки, предлагаются разные программы, у меня програматор "Жгучий кабель" со спец. программой (командной ктрокой) http://www.atmel.ru/Hardware/Hardware5.htm через общеизвесные программы он не прошивает, им можно как-нибудь посмотреть fuse биты?

Автор: Mazzi 3.12.2008, 09:37
Поищи программатор UniProf - он схемно очень прост (6 резисторов и 3 диода) и позволяет шить фьюзы.
 
Могу выслать.

Автор: seatouch 3.12.2008, 21:08
Спасибо!

Автор: seatouch 5.12.2008, 22:14
Спасибо огромное Всем за помощь! Фьюзы не менял, значит они правильные. Привожу работающий код АЦП для ATMega644 на Си (AVRStudio + AVR-GCC). 

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

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

void main(void)
{

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

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


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

ADCSRA = 0b10000000 ;

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

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

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

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


        i=0 ;
        while (i<iDelay) 
        {
            i++ ;
        } ;

        PORTB = PORTB ^ 0x01 ;    
    }
}  


Автор: cardinal 5.12.2008, 22:38
seatouch, пользуйся тегом "Код"!

Добавлено через 1 минуту и 47 секунд
Цитата(seatouch @  2.12.2008,  13:11 Найти цитируемый пост)
Уважаемые инжинеры

Кто кто? smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)