Свежие обсуждения
Микроконтроллеры

Ликбез по С для микроконтроллеров PIC

1 52 64

Vladikas: Сначала ++, а потом == с тем, что получилось после ++.
По идее да
Попробуйте так код модифицировать и посмотрите, что получится:
if((ProhodCounter++) ==x)//счётчик проходов +1 и не равен ли Х?
{...;}
или так:
if(++ProhodCounter ==x)//счётчик проходов +1 и не равен ли Х?
{...;}

 

ProhodCounter++ => (ProhodCounter=ProhodCounter+1) //ProhodCounter увеличивается на 1
++ProhodCounter => (ProhodCounter+1) //ProhodCounter не изменяется
(помоему)

 

SKIIP: подскажите цеколевку такого дисплея (MC1602LSYLU) он же PC-1602L2 на нем написано, где там D0-D7…, RS, и т.д.

Может, это поможет (см. прилагаемый файл) -->

Попробуйте так http://www.google.co.uk/hws/search?client=dell-usuk&adsafe=high&safe=hig... Там 1380 ссылок, что-нибудь да отыщете

175296.pdf

 

Vladikas: Код Си

if(ProhodCounter++ ==x)//счётчик проходов +1 и не равен ли Х?
{...;}

Код Асм

MOVF 0x34, W счётчик в аккум
INCF 0x34, F +1 счётчика
SUBWF 0x33, W Х минус счётчик (аккум)
BTFSS 0x3, 0x2 проверка флага нулевого результата
GOTO 0x7f если есть, то поехали

Код Си

if(++ProhodCounter==x) работает как надо

INCF 0x34, F..........счётчик +1
MOVF 0x33, W........Х в аккум
SUBWF 0x34, W....счётчик минус Х (аккум)
BTFSS 0x3, 0x2......проверка флага нулевого результата
GOTO 0x80..............поехали

Вот как-то так...

 

Vladikas: if(ProhodCounter++ ==x)//счётчик проходов +1 и не равен ли Х?

Vladikas: if(++ProhodCounter==x) работает как надо

Vladikas: Вот как-то так...

Да, с пред и пост операциями так чуть зазевался, и "чудеса" начались

 

Сергей К: ProhodCounter++ => (ProhodCounter=ProhodCounter+1) //ProhodCounter увеличивается на 1
++ProhodCounter => (ProhodCounter+1) //ProhodCounter не изменяется
(помоему)

В первом случае с ProhodCounter выполняется что-либо (например сравнение, или присваивание его кому-либо), а только потом он инкрементируется. Во втором - сначала происходит инкремент, затем всё остальное.

например: a = 10; b = 20
b = a++; //b = 10, a = 11
a = ++b; //b = 11, a = 11;

 

Vladikas: Вот как-то так...
А с дополнительными скобками пробовали?:
Арс: Попробуйте так код модифицировать и посмотрите, что получится:
if((ProhodCounter++) ==x)//счётчик проходов +1 и не равен ли Х?
{...;}

 

Арс: А с дополнительными скобками пробовали?

Ведёт себя так же как без скобок

if((ProhodCounter++) ==x)

MOVF 0x34, W.........счётчик в аккум
INCF 0x34, F............+1счётчика
SUBWF 0x33, W......Х минус счётчик (аккум)
BTFSS 0x3, 0x2.......проверка флага нулевого результата
GOTO 0x80..............поехали

То есть работает некорректно...

 

SAK: Я не совсем понял, что задумывалось сделать в той программе, но функцию обработки "+" и "-" я сделал бы так:

int counter=0
void Button(void)
{
int dest; //направление
if (input(Pin_E0)) dest=1; else dest=0;
if (input(Pin_E1)) dest--;
if (dest=0) {counter=0; return;} // не нажата ни одна из кнопок или нажаты обе сразу
if (counter<8) counter++; else dest*=4;
value+=dest;
if (value < 10) value=10;
else if (value>245) value=245;
}

Вопрос есть, надеюсь не глупый. Код проверил и в мплабе и в железе, работает. В протеусе не работает. Вопрос в следующем ноль минус один, сколько будет в этой проге? Мплаб говорит 0 -1=255 (0xFF), 255 умножить на 4 будет 252 (0xFC, но это ещё ладно...). Но в то же время при вычислении value+=dest; компилятор считает, что 252 это минус 4 (как и задумывалось по логике).

Видимо, у протеуса тоже вопросы к этому коду

 

Подскажите пожалуйста:
Повторил проектик proba1 что в начале этой ветки выкладывался,заменил пик628 на пик12ф675,порт заменил с b на а(т.к. в нем один только а)
,компилируется без ошибок,но хекса нету,блокнотом открывал есть похожий на хекс но расширение-ICD?
По MPLABу в виртуале шагает,а в Протеусе(выбирал- cof) нехочет?.Пробовал и осциллом и таймера делитель менять-непомогло???
Помогите где ошибка.
Файлик прикрепляю

175563.rar