Страница 1 из 1
decfsz в XC8
Добавлено: Вт окт 03, 2017 07:26:24
111284
Здравствуйте, недавно начал изучать Си на платформе XC8 Mplab X, так вот возникла задача выполнять проверку бита порта пока идет отсчет до нуля. На ассемблере эту функцию хорошо выполняла команда decfsz, в Си так и не понял как реализовать такую команду. Пытался делать так while(--X==0) но это не совсем то. Здесь происходит вычитание единицы с последующей проверкой.
Re: decfsz в XC8
Добавлено: Вт окт 03, 2017 11:44:04
Zhuk72
Ну так decfsz тоже уменьшает некую переменную до достижения нуля.
Если нужна проверка бита порта, то while или if, а в качестве аргумента (PORTBbits.RB0) например.
Да и другие варианты есть, все зависит от задачи.
Re: decfsz в XC8
Добавлено: Вт окт 03, 2017 12:45:47
111284
Да все верно но ка то привык циклы выполнять через decfsz, да и место в МК не всегда достаточно чтоб читать единицу а потом делать сравнение, вместо одной команды decfsz
Re: decfsz в XC8
Добавлено: Вт окт 03, 2017 13:18:48
Zhuk72
Напишите, как вы на асме делали бы проверку бита порта через decfsz.
Re: decfsz в XC8
Добавлено: Вт окт 03, 2017 13:34:47
111284
Да дело не в проверке бита, проверка бита это часть цикла,
примерно так
movlw 0x05
movwf count
L1
call процедура
btfss portb,1
goto уход из цикла
decfsz count,f
goto L1
Re: decfsz в XC8
Добавлено: Вт окт 03, 2017 13:44:29
const1105
Так не Си занимает место в памяти. После компиляции сравните кусок кода на ассемблере со своим.
Re: decfsz в XC8
Добавлено: Вт окт 03, 2017 15:01:13
Zhuk72
[uquote="111284",url="/forum/viewtopic.php?p=3197281#p3197281"]movlw 0x05
movwf count
L1
call процедура
btfss portb,1
goto уход из цикла
decfsz count,f
goto L1[/uquote]
Код: Выделить всё
for(count = 5; count > 0; count--)
{
proc();
if(!PORTBbits.RB1) break; // либо какое-то иное действие
}
Глупо, конечно, напрямую переносить ассемблерный код в Си.
Это на первых порах так будет при переходе с асм на Си, потом мышление изменится.
Так что написанное мной можете считать бредом, а не советом к продолжению в том же духе.
Re: decfsz в XC8
Добавлено: Вт окт 03, 2017 18:21:02
dosikus
Zhuk72, перепиши с do-while и в условии добавь проверку пина и будет то же самое и без имитации goto...
Re: decfsz в XC8
Добавлено: Вт окт 03, 2017 18:49:07
Zhuk72
А смысл? Может там вообще без всего этого можно обойтись.
Конечной задачи мы же не знаем, хотя сдается мне, что это кнопочный антидребезг. Тогда там вообще не так нужно действовать.
Re: decfsz в XC8
Добавлено: Вт окт 03, 2017 19:07:29
dosikus
Смысла нет однозначно , они так и будут сравнивать каждый оператор и писать в С на асм_стайл и голосить что компилятор лох...
Единицы из них осознают что такое структурное программирование и чем оно выгоднее лапшеобразной или линейной писанины...
Re: decfsz в XC8
Добавлено: Вт окт 03, 2017 21:23:47
Zhuk72
Это переходный период, сам так же делал.
Первым блином по познанию Си был перенос термометра с динамической индикацией, и переключение разрядов на Си я делал так же, как на асме

Потом уже понял, что тут нужны иные подходы.
Re: decfsz в XC8
Добавлено: Вт окт 03, 2017 21:37:30
111284
В общем да переходный период, пока изучаю Си понемногу, пишу прогу будильника напоминалки. Считывание времени и вывод на LCD заработал. Заткнулся на цикле с проверкой порта для активации или пропуска звонка. В общем данный пример то что нужно судя по всему. Спасибо всем откликнувшимся.
Код: Выделить всё
for(count = 5; count > 0; count--)
{
proc();
if(!PORTBbits.RB1) break; // либо какое-то иное действие
}
Re: decfsz в XC8
Добавлено: Ср окт 04, 2017 09:15:48
Аlex
[uquote="111284",url="/forum/viewtopic.php?p=3197281#p3197281"]примерно так
movlw 0x05
movwf count
L1
call процедура
btfss portb,1
goto уход из цикла
decfsz count,f
goto L1[/uquote]
Код: Выделить всё
count=5;
do{
func();
if(!(PORTB & (1<<1))) break; // Уход из цикла
}while(--count);
Дизасм:
Код: Выделить всё
7F6 3005 MOVLW 0x5
8:
9: count=5;
7F7 00F0 MOVWF count
10: do{
11: func();
7F8 27F5 CALL func
12: if(!(PORTB & (1<<1))) break; // Уход из цикла
7F9 1C86 BTFSS PORTB, 0x1
7FA 2FFD GOTO 0x7fd
13: }while(--count);
7FB 0BF0 DECFSZ count, F
7FC 2FF8 GOTO 0x7f8
Re: decfsz в XC8
Добавлено: Ср окт 04, 2017 09:43:16
ARV
Re: decfsz в XC8
Добавлено: Ср окт 04, 2017 10:37:59
Zhuk72
По мере возрастания кода:
Аlex писал(а):
Код: Выделить всё
count=5;
do{
func();
if(!(PORTB & (1<<1))) break; // Уход из цикла
}while(--count);
Код: Выделить всё
for(count = 5; count > 0; count--)
{
proc();
if(!PORTBbits.RB1) break; // либо какое-то иное действие
}
ARV писал(а):а вот так если?
Код: Выделить всё
count = 5;
while((PORTB & (1<<1)) && count--) func();

Re: decfsz в XC8
Добавлено: Ср окт 04, 2017 11:17:33
Аlex
Zhuk72, изображения не видны

Re: decfsz в XC8
Добавлено: Ср окт 04, 2017 11:54:55
Zhuk72
[uquote="Аlex",url="/forum/viewtopic.php?p=3197915#p3197915"]
Zhuk72, изображения не видны

[/uquote]
Это у вас что-то. Может тот хостинг (prntscr.com) заблокирован в браузере?
Смотрите:
Спойлер

Re: decfsz в XC8
Добавлено: Ср окт 04, 2017 13:38:30
Аlex
А сейчас показались. Что было - хз

Re: decfsz в XC8
Добавлено: Чт окт 05, 2017 10:27:04
111284
Все разобрался, проблема была в недоломоном XC8, сейчас все компилируется как положено. Функции for и do while, выполняют то что нужно да и код резко сократился.