Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

decfsz в XC8

Вт окт 03, 2017 07:26:24

Здравствуйте, недавно начал изучать Си на платформе XC8 Mplab X, так вот возникла задача выполнять проверку бита порта пока идет отсчет до нуля. На ассемблере эту функцию хорошо выполняла команда decfsz, в Си так и не понял как реализовать такую команду. Пытался делать так while(--X==0) но это не совсем то. Здесь происходит вычитание единицы с последующей проверкой.

Re: decfsz в XC8

Вт окт 03, 2017 11:44:04

Ну так decfsz тоже уменьшает некую переменную до достижения нуля.
Если нужна проверка бита порта, то while или if, а в качестве аргумента (PORTBbits.RB0) например.
Да и другие варианты есть, все зависит от задачи.

Re: decfsz в XC8

Вт окт 03, 2017 12:45:47

Да все верно но ка то привык циклы выполнять через decfsz, да и место в МК не всегда достаточно чтоб читать единицу а потом делать сравнение, вместо одной команды decfsz

Re: decfsz в XC8

Вт окт 03, 2017 13:18:48

Напишите, как вы на асме делали бы проверку бита порта через decfsz.

Re: decfsz в XC8

Вт окт 03, 2017 13:34:47

Да дело не в проверке бита, проверка бита это часть цикла,
примерно так
movlw 0x05
movwf count
L1
call процедура
btfss portb,1
goto уход из цикла
decfsz count,f
goto L1

Re: decfsz в XC8

Вт окт 03, 2017 13:44:29

Так не Си занимает место в памяти. После компиляции сравните кусок кода на ассемблере со своим.

Re: decfsz в XC8

Вт окт 03, 2017 15:01:13

movlw 0x05
movwf count
L1
call процедура
btfss portb,1
goto уход из цикла
decfsz count,f
goto L1

Код:
  for(count = 5; count > 0; count--)
  {
    proc();
    if(!PORTBbits.RB1) break;  // либо какое-то иное действие
  }

Глупо, конечно, напрямую переносить ассемблерный код в Си.
Это на первых порах так будет при переходе с асм на Си, потом мышление изменится.
Так что написанное мной можете считать бредом, а не советом к продолжению в том же духе.

Re: decfsz в XC8

Вт окт 03, 2017 18:21:02

Zhuk72, перепиши с do-while и в условии добавь проверку пина и будет то же самое и без имитации goto...

Re: decfsz в XC8

Вт окт 03, 2017 18:49:07

А смысл? Может там вообще без всего этого можно обойтись.
Конечной задачи мы же не знаем, хотя сдается мне, что это кнопочный антидребезг. Тогда там вообще не так нужно действовать.

Re: decfsz в XC8

Вт окт 03, 2017 19:07:29

Смысла нет однозначно , они так и будут сравнивать каждый оператор и писать в С на асм_стайл и голосить что компилятор лох...
Единицы из них осознают что такое структурное программирование и чем оно выгоднее лапшеобразной или линейной писанины...

Re: decfsz в XC8

Вт окт 03, 2017 21:23:47

Это переходный период, сам так же делал.
Первым блином по познанию Си был перенос термометра с динамической индикацией, и переключение разрядов на Си я делал так же, как на асме :)
Потом уже понял, что тут нужны иные подходы.

Re: decfsz в XC8

Вт окт 03, 2017 21:37:30

В общем да переходный период, пока изучаю Си понемногу, пишу прогу будильника напоминалки. Считывание времени и вывод на LCD заработал. Заткнулся на цикле с проверкой порта для активации или пропуска звонка. В общем данный пример то что нужно судя по всему. Спасибо всем откликнувшимся.
Код:
for(count = 5; count > 0; count--)
  {
    proc();
    if(!PORTBbits.RB1) break;  // либо какое-то иное действие
  }

Re: decfsz в XC8

Ср окт 04, 2017 09:15:48

примерно так
movlw 0x05
movwf count
L1
call процедура
btfss portb,1
goto уход из цикла
decfsz count,f
goto L1

Код:
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

а вот так если?
Код:
while((PORTB & (1<<1)) && count--) func();

Re: decfsz в XC8

Ср окт 04, 2017 10:37:59

По мере возрастания кода:

А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

Zhuk72, изображения не видны :dont_know:

Re: decfsz в XC8

Ср окт 04, 2017 11:54:55

Zhuk72, изображения не видны :dont_know:

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

Re: decfsz в XC8

Ср окт 04, 2017 13:38:30

А сейчас показались. Что было - хз :dont_know:

Re: decfsz в XC8

Чт окт 05, 2017 10:27:04

Все разобрался, проблема была в недоломоном XC8, сейчас все компилируется как положено. Функции for и do while, выполняют то что нужно да и код резко сократился.
Ответить