Коллекция глюков Здесь публикуются все известные глюки, баги микроконтроллеров, памяти, АЦП и т.д. |
26.12.2010, 18:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.10.2010
Сообщений: 1,752
Сказал спасибо: 158
Сказали Спасибо 640 раз(а) в 364 сообщении(ях)
|
Re: Глюки WinAVR
Сообщение от AGAT0365
|
Доброе время суток. На WinAvr пытаюсь создать програмку к меге8.Проблемы с переменными после оператора замкнутого цикла while(1),переменные при проверке на протеусе выдаёт черточки и пишет всегда 0. Пробовал менять оптимезацию,результата нет.Пробовал внаглую записывать число в любом виде всё равно 0.
|
Удобно просматривать файл [имя исходника].lss .
Много интересного можно узнать. Особенно при использовании оптимизации.
( Сам использую уровень 1 . Совсем без оптимизации плохо, большой размер. )
|
|
|
|
29.05.2011, 19:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 01.05.2009
Адрес: Коптево
Сообщений: 2,849
Сказал спасибо: 276
Сказали Спасибо 427 раз(а) в 274 сообщении(ях)
|
Re: Глюки WinAVR
В WinAvr главный цикл
Код:
|
for (;;) {
if (fADC4 == 1) {WarmCtrl(); fADC4 = 0;}; // ~1Hz
if (fUSART == 2) {MsgHandler();}; // Обр-ка мессаги
} |
Компилится так:
Код:
|
344: if (fUSART == 2) {MsgHandler();}; // Обр-ка мессаги
+00000374: 919000BA LDS R25,0x00BA Load direct from data space
+00000376: 918000BB LDS R24,0x00BB Load direct from data space
343: if (fADC4 == 1) {WarmCtrl(); fADC4 = 0;}; // ~1Hz
+00000378: 3081 CPI R24,0x01 Compare with immediate
+00000379: F409 BRNE PC+0x02 Branch if not equal
+0000037A: E080 LDI R24,0x00 Load immediate
344: if (fUSART == 2) {MsgHandler();}; // Обр-ка мессаги
+0000037B: 3092 CPI R25,0x02 Compare with immediate
+0000037C: F7D9 BRNE PC-0x04 Branch if not equal
+0000037D: 938000BB STS 0x00BB,R24 Store direct to data space
+0000037F: DF61 RCALL PC-0x009E Relative call subroutine
+00000380: CFF3 RJMP PC-0x000C Relative jump |
В результате чего не проверяются флаги fADC4 и fUSART.
Это нормально для С?
Или я опять что-то не так сделал?
Например, написал главный цикл? )))
Последний раз редактировалось KBH-I; 29.05.2011 в 19:52.
|
|
|
|
04.06.2011, 21:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 01.05.2009
Адрес: Коптево
Сообщений: 2,849
Сказал спасибо: 276
Сказали Спасибо 427 раз(а) в 274 сообщении(ях)
|
Re: Глюки WinAVR
Что, никого не интересуют глюки компиляторов?
|
|
|
|
05.06.2011, 13:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Глюки WinAVR
Почему - интересуют. Только их тут нет.
Не проверяется fADC4? А что тогда это:
Код:
|
LDS R24,0x00BB
CPI R24,0x01 |
Вот правда почему то нет вызова WarmCtrl. Это именно функция?
И хотелось бы взглянуть на объявления fADC4 и fUSART.
Последний раз редактировалось kison; 05.06.2011 в 16:24.
|
|
|
|
05.06.2011, 19:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.10.2010
Сообщений: 1,752
Сказал спасибо: 158
Сказали Спасибо 640 раз(а) в 364 сообщении(ях)
|
Re: Глюки WinAVR
Я в WinAVR глюков не замечал.
Есть "кажущиеся глюки" оптимизатора. С оптимизацией надо быть аккуратным.
А то заложенный алгоритм может "на фик полететь".
И не забывать объявлять переменные с volatile, когда нада.
|
|
|
|
05.06.2011, 22:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 01.05.2009
Адрес: Коптево
Сообщений: 2,849
Сказал спасибо: 276
Сказали Спасибо 427 раз(а) в 274 сообщении(ях)
|
Re: Глюки WinAVR
1. WarmCtrl() - пустая функция: объявлена, но тело пока пустое (не доделал). Поэтому её отсутствие в Асме абсолютно нормально.
2. объявления fADC4 и fUSART:
Код:
|
unsigned char
fUSART = 0, //0/1/2/3/4-Ничего/Приём/З-сОбр-ки/Обр-ка/Передача
fADC4 = 0, //З-сОбр-ки ADC4 |
3. Оптимизация -О0
4. Флаги fADC4 и fUSART таки не проверяются, потому что команда "BRNE PC-0x04", переходит не на "LDS R25,0x00BA" и "LDS R24,0x00BB", а почему-то на "CPI R24,0x01", т.к. 0х037С-0x0004=0х0378. Т.е. при fUSART ‹› 2 он входит в местный цикл, где сравнивает с константами не значения флагов в ОЗУ (где они совершенно нормально принимают требуемые значения, в т.ч. и fUSART = 2), а их копии в регистрах, естественно, устаревшие. Соответственно, из этого цикла он так и не выходит.
Поэтому я и написал в первом приближении, что не проверяются флаги.
Честно говоря, думал из листинга это видно совершенно ясно.
Неясно только, почему компилер делает именно так и как заставить его сравнивать эти флаги нормально.
|
|
|
|
06.06.2011, 04:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Глюки WinAVR
Сообщение от KBH-I
|
а их копии в регистрах, естественно, устаревшие. Соответственно, из этого цикла он так и не выходит.
Поэтому я и написал в первом приближении, что не проверяются флаги.
Честно говоря, думал из листинга это видно совершенно ясно.
Неясно только, почему компилер делает именно так и как заставить его сравнивать эти флаги нормально.
|
Заставить очень просто - прочитать наконец документацию. Весь инет завален такими "находками глюков" ![Валяюсь от смеха](images/smilies/icon_biggrin.gif)
Для ускорения процесса почитайте про квалификатор volatile
Ну и попробуйте объявлять флаги именно с его помощью.
Типа:
Код:
|
volatile unsigned char fADC4 = 0; |
Вот это почитайте - http://www.pic24.ru/doku.php/osa/art...e_for_chainiks
Думаю после этого "глюк" пропадет и больше не вернется...
Последний раз редактировалось kison; 06.06.2011 в 04:46.
|
|
|
|
06.06.2011, 23:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 01.05.2009
Адрес: Коптево
Сообщений: 2,849
Сказал спасибо: 276
Сказали Спасибо 427 раз(а) в 274 сообщении(ях)
|
Re: Глюки WinAVR
Действительно, помогло. Большое спасибо.
Сообщение от kison
|
...прочитать наконец документацию.
|
А где это?
"Программирование на языке С для AVR и PIC микроконтроллеров./ Сост. Ю.А.Шпак - К.:"МК-Пресс", 2006. - 400с., ил." годится?
Просто по WinAVR у меня больше ничего нет.
|
|
|
|
06.06.2011, 23:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.10.2010
Сообщений: 1,752
Сказал спасибо: 158
Сказали Спасибо 640 раз(а) в 364 сообщении(ях)
|
Re: Глюки WinAVR
Сообщение от KBH-I
|
Действительно, помогло. Большое спасибо.
А где это?
"Программирование на языке С для AVR и PIC микроконтроллеров./ Сост. Ю.А.Шпак - К.:"МК-Пресс", 2006. - 400с., ил." годится?
Просто по WinAVR у меня больше ничего нет.
|
Самый лучший документ - это заголовочные файлы.
Ну, ... и справочник по С/С++ под рукой не будет лишним. (Его может заменить тырнет.)
|
|
|
|
07.06.2011, 01:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Глюки WinAVR
Сообщение от KBH-I
|
А где это?
|
Посмотрите куда ставили компилятор. Там есть каталог doc. Как ни странно в нем вся документация лежит.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:18.
|
|