decfsz в XC8

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб апр 03, 2010 17:24:43

Сообщение 111284 »

Здравствуйте, недавно начал изучать Си на платформе XC8 Mplab X, так вот возникла задача выполнять проверку бита порта пока идет отсчет до нуля. На ассемблере эту функцию хорошо выполняла команда decfsz, в Си так и не понял как реализовать такую команду. Пытался делать так while(--X==0) но это не совсем то. Здесь происходит вычитание единицы с последующей проверкой.
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

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

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Реклама
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб апр 03, 2010 17:24:43

Сообщение 111284 »

Да все верно но ка то привык циклы выполнять через decfsz, да и место в МК не всегда достаточно чтоб читать единицу а потом делать сравнение, вместо одной команды decfsz
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

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

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб апр 03, 2010 17:24:43

Сообщение 111284 »

Да дело не в проверке бита, проверка бита это часть цикла,
примерно так
movlw 0x05
movwf count
L1
call процедура
btfss portb,1
goto уход из цикла
decfsz count,f
goto L1
Реклама
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Сб мар 19, 2011 15:19:47
Откуда: Владивосток

Сообщение const1105 »

Так не Си занимает место в памяти. После компиляции сравните кусок кода на ассемблере со своим.
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение 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;  // либо какое-то иное действие
  }
Глупо, конечно, напрямую переносить ассемблерный код в Си.
Это на первых порах так будет при переходе с асм на Си, потом мышление изменится.
Так что написанное мной можете считать бредом, а не советом к продолжению в том же духе.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Zhuk72, перепиши с do-while и в условии добавь проверку пина и будет то же самое и без имитации goto...
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

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

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Смысла нет однозначно , они так и будут сравнивать каждый оператор и писать в С на асм_стайл и голосить что компилятор лох...
Единицы из них осознают что такое структурное программирование и чем оно выгоднее лапшеобразной или линейной писанины...
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

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

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб апр 03, 2010 17:24:43

Сообщение 111284 »

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

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

for(count = 5; count > 0; count--)
  {
    proc();
    if(!PORTBbits.RB1) break;  // либо какое-то иное действие
  }
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение А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
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

а вот так если?

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

while((PORTB & (1<<1)) && count--) func();
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение 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();
Изображение
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Zhuk72, изображения не видны :dont_know:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

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

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

А сейчас показались. Что было - хз :dont_know:
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб апр 03, 2010 17:24:43

Сообщение 111284 »

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

Вернуться в «PIC»