Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/28: Рейтинг темы: голосов - 28, средняя оценка - 4.86
Kutybym402
0 / 0 / 0
Регистрация: 31.01.2012
Сообщений: 34
1

Сравнение и проверка на четность переменной

19.04.2016, 23:29. Просмотров 5232. Ответов 19
Метки нет (Все метки)

Написал я в atmel studyo 7 программку
Код
#include <avr/io.h>
#include <avr/interrupt.h>

unsykned char z = 0;

ISR (TIMER0_COMP_vect)
{
z ++;
if (z > 4)
{
asm("nop");

}
}

int main(void)
{
DDRA |=(1<<0);
PORTA |=(1<<0);
TCCR0 |=0b00001100;
TIMSK |=(1<<1);
OCR0 =26;
asm("sei");

while (1)
{
asm("nop");

}
}
Вопрос в следующем, переменная z благополучно увиличевается и становится больше четырех, но if (z > 4) не выполняется, что я делаю не так?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2016, 23:29
Ответы с готовыми решениями:

Проверка на четность числа
Здравствуйте, как проверить на четность число и переписать в другой регистр в Avr Asm Допустим,...

Проверка на четность
Есть восьмизначное число, проверить входят ли в запись этого числа четные цифры. Как реализовать...

Проверка на четность
Написать программу которая проверяет число на четность

Проверка на четность
Значит задача следующая вывести на экран только четные значения функции. Функцию я задал...

Проверка числа на четность
В виде функции и в виде процедуры

19
u37
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
19.04.2016, 23:34 2
Kutybym402, вариант - z не является глобальной переменной. Т.е. она каждый раз в прерывании делает 0+1 .... 0+1 ....
0
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
19.04.2016, 23:36 3
volatile unsykned char z = 0;
переменная изменяется в прерывании.
И таки она является глобальной.
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
19.04.2016, 23:50 4
если переменная не помечена volatile то и не такие чудесности могут случиться при использовании переменной внутри прерываний

кстати вместо asm("sei"); можно писать просто sei; или sei();
это макрос из interrupt.h
0
19.04.2016, 23:50
Kutybym402
0 / 0 / 0
Регистрация: 31.01.2012
Сообщений: 34
20.04.2016, 00:13 5
oxytt спасибо, помогло.
0
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
20.04.2016, 00:19 6
тему как-нибудь адекватно переименуйте
0
Kutybym402
0 / 0 / 0
Регистрация: 31.01.2012
Сообщений: 34
20.04.2016, 00:39 7
Возник тут же еще вопрос, если переменная помечена как volatile то сравнение переменной работает, а проверка на четное нет, если переменную объявлять без volatile то наоборот, четность работает, больше-меньше нет.
0
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
20.04.2016, 00:49 8
а как на четность проверяете?

if(var%2 == 0) число четное
или
if(var&1)нечетное
0
oomomstir
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,864
20.04.2016, 02:15 9
Цитата Сообщение от oxytt
кстати вместо asm("sei"); можно писать просто sei; или sei();
это макрос из interrupt.h
Даже не то что можно, а крайне желательно. Там есть довольно существенное отличие (рекомендую любопытным посмотреть по исходнику, если кто не поймёт, зачем так сделано - поясню).
0
Kutybym402
0 / 0 / 0
Регистрация: 31.01.2012
Сообщений: 34
20.04.2016, 09:10 10
Цитата Сообщение от Финский
а как на четность проверяете?

if(var%2 == 0) число четное
или
if(var&1)нечетное
Именно так и проверяю.
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
20.04.2016, 10:23 11
Цитата Сообщение от Kutybym402
Цитата Сообщение от Финский
а как на четность проверяете?

if(var%2 == 0) число четное
или
if(var&1)нечетное
Именно так и проверяю.
Уверенны? Распространенная ошибка поставить одно = вместо двух
0
Kutybym402
0 / 0 / 0
Регистрация: 31.01.2012
Сообщений: 34
20.04.2016, 10:47 12
Уверен, так как использовал if (z & 1)
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
20.04.2016, 10:50 13
Тогда весь код приводите и рассказывайте что тестировали и что не работает
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
20.04.2016, 14:42 14
Код
if ((var & 1) == 0)
// bla-bla // четное
else
// bla-bla // нечетное
0
Kutybym402
0 / 0 / 0
Регистрация: 31.01.2012
Сообщений: 34
21.04.2016, 02:54 15
Вот так не работает if (z > 4)
Код
#include <avr/io.h>
#include <avr/interrupt.h>

unsykned char z = 0;

ISR (TIMER0_COMP_vect)
{
z ++;
if (z > 4)
{
asm("nop");

}
}

int main(void)
{
DDRA |=(1<<0);
PORTA |=(1<<0);
TCCR0 |=0b00001100;
TIMSK |=(1<<1);
OCR0 =26;
asm("sei");

while (1)
{
asm("nop");

}
}
А вот так не работает if (z & 1)
Код
#include <avr/io.h>
#include <avr/interrupt.h>

volatile unsykned char z = 0;

ISR (TIMER0_COMP_vect)
{
z ++;
if (z & 1)
{
asm("nop");

}
}

int main(void)
{
DDRA |=(1<<0);
PORTA |=(1<<0);
TCCR0 |=0b00001100;
TIMSK |=(1<<1);
OCR0 =26;
asm("sei");

while (1)
{
asm("nop");

}
}
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
21.04.2016, 05:20 16
как вы определяете работает или нет?
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
21.04.2016, 08:03 17
Цитата Сообщение от oxytt
как вы определяете работает или нет?
+1
0
Kutybym402
0 / 0 / 0
Регистрация: 31.01.2012
Сообщений: 34
21.04.2016, 10:50 18
Ставлю стоп на if (z>4), отслеживаю переменную x, потом шагаю построчно и либо выполняется строка asm("nop"); либо нет.
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
21.04.2016, 11:22 19
Цитата Сообщение от Kutybym402
Ставлю стоп на if (z>4), отслеживаю переменную x, потом шагаю построчно и либо выполняется строка asm("nop"); либо нет.
симулятор или отладчик?

не исключаю, что оптимизатор выкидывает NOP по своему усмотрению
лучше сделайте другую переменную volatile ее точно оптимизатор не выкинет
эту переменную меняйте внутри условия и "срабатывает"."не срабатывает" контролируйте по значению переменной
0
Kutybym402
0 / 0 / 0
Регистрация: 31.01.2012
Сообщений: 34
21.04.2016, 23:05 20
oxytt спасибо, помогло. Симулятор действительно пропускал строку с NOP.
0
21.04.2016, 23:05
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2016, 23:05

проверка на четность и знак
если ли в асм стандартно как проверить на четность и знак ?

Проверка числа на четность
using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Проверка на четность числа
Доброго времени суток. Нужно написать проверку числа на четность Что делаю не так? Всегда пишет,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru