Страница 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
а вот так если?

Код: Выделить всё

while((PORTB & (1<<1)) && count--) func();

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, изображения не видны :dont_know:

Re: decfsz в XC8

Добавлено: Ср окт 04, 2017 11:54:55
Zhuk72
[uquote="Аlex",url="/forum/viewtopic.php?p=3197915#p3197915"]Zhuk72, изображения не видны :dont_know:[/uquote]
Это у вас что-то. Может тот хостинг (prntscr.com) заблокирован в браузере?
Смотрите:
СпойлерИзображение

Re: decfsz в XC8

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

Re: decfsz в XC8

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