| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > AVRStudio не показывает значение переменных |
| Автор: seatouch 27.11.2008, 14:29 | ||
| Уважаемые инженеры, добрый день! Прошу прощения за глупый вопрос, только начал работать с AVRStudio и наверно просто не поставил где-нибудь галочку. Есть код. В зависимости от напряжения на патенциометре меняется скорость моргания светодиода.
Когда останавливаешь программу и подводишь курсор на переменную что бы посмотреть ее значение, всегда отображается 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 секунды! Глюки. 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. во время отладки надо открыть окно 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 | ||
Просто есть предопределённый тип - bit. С этим типом легче жить. Знаю я про битовые поля, но это лишние движения, а я привык к битовому типу, он кстати поддерживается и в Keilе для 51 процов. |
| Автор: makwen 28.11.2008, 18:43 | ||
На сколько я понимаю, ты используешь стандартную процедуру, а не свою собственную. Тогда учти, что время задержки у нее зависит от зачения дериктивы F_CPU. Посмотри, чему равно данное значение и сравни с системной частотой работы контроллера, которая установлена в AVRStudio. ЗЫ: данными функциями не пользуюсь, пишу свои |
| Автор: 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 ; - без цикла задержки ставил такую строку и выставлял патенциометр в крайние положения - светодиод состояние не меняет. }; } Пришла мысль, может быть неправильон спаяна схема, и МК виснит на первых секундах работы. По этому привожу ее в сообщении. Заранее благодарю! |
| Автор: 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 секунд Кто кто? |