Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

AVRStudio косяк :(

Непрочитано 24.04.2010, 19:52  
Pavlike
Временная регистрация
 
Регистрация: 16.05.2005
Адрес: Киев
Сообщений: 58
Сказал спасибо: 38
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
Pavlike на пути к лучшему
Злость AVRStudio косяк :(

Помогите плз, найти косяк!
В прерывании значение sec находится в памяти по адресу 0х60, а в теле программы почемуто становится R18????
Если убрать коммент перед строкой инициализации sec=0; то компилятор вообще выкидывает весь код после сравнения...(и сравнение тоже). Подскажите может какие-то опции для компиляции использовать?
И вообще в какую сторону копать? Конечно можно все это перенести в прерывание, но хотелось бы разобраться...

AVRStudio 4.18 Bild 700

Исходный код:
Код:
unsigned char sek;
inline void led_r_off()
{
    PORTB &= ~( 1 ‹‹ PB0 );
}

inline void led_r_on()
{
    PORTB |= ( 1 ‹‹ PB0 );
}

ISR(TIMER1_OVF_vect)
{
	// reinit counter
	TCNT1H = 133;
	TCNT1L = 238;
	sek++;
}

int main(void)
{
uint8_t temp;
uint16_t km;
    //--    Red LED is on PB0
    DDRB |= ( 1 ‹‹ PB0 );
    PORTB |= ( 1 ‹‹ PB0 );  // red on

	// Timer1 settings: ~ 8000000 ticks (1 sec)
	TCCR1B = (1‹‹CS12); // prescaler = 256
	TCNT1H = 133;
	TCNT1L = 238;
	TIMSK = (1‹‹TOIE1); // Timer1 Overflow Interrupt Enable
	
//	sek=0;

           sei();
	while(1) 
	{
	led_r_on();
	_delay_ms(50);
	led_r_off();
	_delay_ms(50);

	if (sek==240)
	{
		sek=0;
		km++;
		temp=(uint8_t)(km››8);
		EEPROM_write(11, temp);
		temp=(uint8_t)(km&0xFF);	
		EEPROM_write(10, temp);
	}
    }
	return 0;
}
==============================================

Дизассемблер выглядит так: (прерывание и конец программы)

25: {
+00000024: 921F PUSH R1 Push register on stack
+00000025: 920F PUSH R0 Push register on stack
+00000026: B60F IN R0,0x3F In from I/O location
+00000027: 920F PUSH R0 Push register on stack
+00000028: 2411 CLR R1 Clear Register
+00000029: 938F PUSH R24 Push register on stack
27: TCNT1H = 133;
+0000002A: E885 LDI R24,0x85 Load immediate
+0000002B: BD8D OUT 0x2D,R24 Out to I/O location
28: TCNT1L = 238;
+0000002C: EE8E LDI R24,0xEE Load immediate
+0000002D: BD8C OUT 0x2C,R24 Out to I/O location
29: sek++;
+0000002E: 91800060 LDS R24,0x0060 Load direct from data space
+00000030: 5F8F SUBI R24,0xFF Subtract immediate
+00000031: 93800060 STS 0x0060,R24 Store direct to data space

30: }
+00000033: 918F POP R24 Pop register from stack
+00000034: 900F POP R0 Pop register from stack
+00000035: BE0F OUT 0x3F,R0 Out to I/O location
+00000036: 900F POP R0 Pop register from stack
+00000037: 901F POP R1 Pop register from stack
+00000038: 9518 RETI
===================
-------
===================

30: if (sek==240)
+0000006F: 3F20 CPI R18,0xF0 Compare with immediate
+00000070: F7E1 BRNE PC-0x03 Branch if not equal
133: km++;
+00000071: 9601 ADIW R24,0x01 Add immediate to word
34: while(EECR & (1‹‹EEWE));
+00000072: 99E1 SBIC 0x1C,1 Skip if bit in I/O register cleared
+00000073: CFFE RJMP PC-0x0001 Relative jump
35: EEAR = uiAddress;
+00000074: BB7F OUT 0x1F,R23 Out to I/O location
+00000075: BB6E OUT 0x1E,R22 Out to I/O location
36: EEDR = ucData;
+00000076: BB9D OUT 0x1D,R25 Out to I/O location
37: EECR |= (1‹‹EEMWE);
+00000077: 9AE2 SBI 0x1C,2 Set bit in I/O register
38: EECR |= (1‹‹EEWE);
+00000078: 9AE1 SBI 0x1C,1 Set bit in I/O register
34: while(EECR & (1‹‹EEWE));
+00000079: 99E1 SBIC 0x1C,1 Skip if bit in I/O register cleared
+0000007A: CFFE RJMP PC-0x0001 Relative jump
35: EEAR = uiAddress;
+0000007B: BB5F OUT 0x1F,R21 Out to I/O location
+0000007C: BB4E OUT 0x1E,R20 Out to I/O location
36: EEDR = ucData;
+0000007D: BB8D OUT 0x1D,R24 Out to I/O location
37: EECR |= (1‹‹EEMWE);
+0000007E: 9AE2 SBI 0x1C,2 Set bit in I/O register
38: EECR |= (1‹‹EEWE);
+0000007F: 9AE1 SBI 0x1C,1 Set bit in I/O register
+00000080: E020 LDI R18,0x00 Load immediate
+00000081: CFEB RJMP PC-0x0014 Relative jump
-
Реклама:

Последний раз редактировалось Pavlike; 26.04.2010 в 12:00.
Pavlike вне форума  
Непрочитано 24.04.2010, 20:13  
testerplus
Прописка
 
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
testerplus на пути к лучшему
По умолчанию Re: AVRStudio косяк :(

Такой код будет работать со сбоями. переменную sek нужно, во-первых, объявлять с квалификатором volatile, а во-вторых, обеспечить атомарный доступ к ней в main.

Да и моргание лампочкой не на своем месте стоит.
testerplus вне форума  
Сказали "Спасибо" testerplus
Pavlike (26.04.2010)
Непрочитано 25.04.2010, 08:27  
Classic001
Временная регистрация
 
Регистрация: 13.10.2009
Сообщений: 81
Сказал спасибо: 2
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
Classic001 на пути к лучшему
По умолчанию Re: AVRStudio косяк :(

Вообщет выкидывать код он будет если с переменной не производится никаких действий по её изменению. В коде изменение в прерывании. На ум приходит только неподключенный модуль interrupt.h. Но тогда вроде бы и sei работать не должна.


Сообщение от testerplus Посмотреть сообщение
Такой код будет работать со сбоями.
Объясните. Я косяков не вижу. Кроме непонятных мне функций led_r_off() и led_r_on. При том, что вроде такие вещи правильнее решать define'ами.
Classic001 вне форума  
Сказали "Спасибо" Classic001
Pavlike (26.04.2010)
Непрочитано 25.04.2010, 15:36  
testerplus
Прописка
 
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
testerplus на пути к лучшему
По умолчанию Re: AVRStudio косяк :(

Сообщение от Classic001 Посмотреть сообщение
Вообщет выкидывать код он будет если с переменной не производится никаких действий по её изменению. В коде изменение в прерывании.
Без volatile будут проблемы. Компилятор может не учитывать, что переменная меняется в произвольный момент. А в программе код сравнения выкидывается именно потому, что перед ним стоит sek = 1, вот компилятор и считает, что 240 она точно не равна (автор топика написал про убирание коммента перед "sek = 0", но, видимо, имел ввиду инициализацию перед условием "sek = 1")

Цитата:
Объясните. Я косяков не вижу.
Проверка sek==240 производится с интервалом 100 мс. За это время прерывание может успеть сработать несколько раз.

(Насчет атомарности я погорячился: не обратил внимания, что sek - однобайтовая переменная, а никаких RMW операций в мейне с ней не выполняется).

Цитата:
Кроме непонятных мне функций led_r_off() и led_r_on
Так они же есть в тексте.
Автору топика: используйте тег CODE для оформления текста программы. У себя-то, небось, с отступами все видите?

Последний раз редактировалось testerplus; 25.04.2010 в 15:38.
testerplus вне форума  
Непрочитано 25.04.2010, 15:43  
alberio
Гражданин KAZUS.RUN
 
Аватар для alberio
 
Регистрация: 08.07.2006
Сообщений: 582
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
alberio на пути к лучшему
По умолчанию Re: AVRStudio косяк :(

Отключите оптимизацию. Для дебага самое оно.
__________________
Sex, Druggs, Rock&Roll
alberio вне форума  
Сказали "Спасибо" alberio
Pavlike (26.04.2010)
Непрочитано 25.04.2010, 16:30  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: AVRStudio косяк :(

Сообщение от alberio Посмотреть сообщение
Отключите оптимизацию. Для дебага самое оно.
Это куплет из другой песни.
st_1 вне форума  
Сказали "Спасибо" st_1
Pavlike (26.04.2010)
Непрочитано 25.04.2010, 23:30  
Classic001
Временная регистрация
 
Регистрация: 13.10.2009
Сообщений: 81
Сказал спасибо: 2
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
Classic001 на пути к лучшему
По умолчанию Re: AVRStudio косяк :(

Сообщение от testerplus Посмотреть сообщение
Без volatile будут проблемы. Компилятор может не учитывать, что переменная меняется в произвольный момент.
Глобальные переменные оптимизатором не удаляются. Даже если они в коде нигде не используются. Никогда не использовал volatile - всегда вроде и так работало. Даже для глобальных флаговых регистров.

Сообщение от testerplus Посмотреть сообщение
Проверка sek==240 производится с интервалом 100 мс. За это время прерывание может успеть сработать несколько раз.
Это вы правы. Не углядел.
Classic001 вне форума  
Непрочитано 25.04.2010, 23:49  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: AVRStudio косяк :(

Сообщение от Classic001 Посмотреть сообщение
Глобальные переменные оптимизатором не удаляются. Даже если они в коде нигде не используются.
Ой ли? Один компилятор не соптимизирует, а другой проглотит и сделает вид что там ничего и небыло. Если бы своими глазами не видел, то тоже не поверил бы.
Цитата:
Никогда не использовал volatile - всегда вроде и так работало. Даже для глобальных флаговых регистров.
Дык, volatile и static тоже не с бодуна же придумали, наверно не зря?
st_1 вне форума  
Непрочитано 26.04.2010, 00:02  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: AVRStudio косяк :(

Сообщение от Classic001 Посмотреть сообщение
Глобальные переменные оптимизатором не удаляются. Даже если они в коде нигде не используются. Никогда не использовал volatile - всегда вроде и так работало. Даже для глобальных флаговых регистров.
Ну так конечно не удаляются. Мало ли где в другом файле есть доступ к этой переменной через extern. А вот обращения к таким переменным оптимизируются на ура - если ждать изменения такой переменной, то без volatile может получиться висяк. Компилятор считает переменную в регистр только один раз, и потом будет ждать изменения уже не в переменной, а в регистре. Или вообще выкинет такую проверку и все что за ней надо было исполнять. А правильно работать будет только при выключенной оптимизации, что делать категорически не рекомендуется.
kison вне форума  
Непрочитано 26.04.2010, 00:15  
testerplus
Прописка
 
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
testerplus на пути к лучшему
По умолчанию Re: AVRStudio косяк :(

Сообщение от Classic001 Посмотреть сообщение
Глобальные переменные оптимизатором не удаляются.
Так удаляется не переменная, а код ее обработки. Компилятор видит это так:
Код:
    sek = 1;
    if (sek == 240) ...
и делает вывод, что условие никогда не выполняется.

Сообщение от Classic001 Посмотреть сообщение
Никогда не использовал volatile - всегда вроде и так работало.
Это говорит не за бесполезность volatile; скорее, Вы просто не подозреваете о некоторых слабых местах Ваших программ. Вот пример, где без volatile может возникнуть проблема. То же самое и с глобальными флаговыми регистрами.
testerplus вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с AVRstudio jafarkiller Микроконтроллеры, АЦП, память и т.д 9 08.04.2010 21:42


Часовой пояс GMT +4, время: 23:28.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.