Поклонники продукции Microchip Technology Inc тусуются тут.
Вт окт 03, 2017 07:26:24
Здравствуйте, недавно начал изучать Си на платформе XC8 Mplab X, так вот возникла задача выполнять проверку бита порта пока идет отсчет до нуля. На ассемблере эту функцию хорошо выполняла команда decfsz, в Си так и не понял как реализовать такую команду. Пытался делать так while(--X==0) но это не совсем то. Здесь происходит вычитание единицы с последующей проверкой.
Вт окт 03, 2017 11:44:04
Ну так decfsz тоже уменьшает некую переменную до достижения нуля.
Если нужна проверка бита порта, то while или if, а в качестве аргумента (PORTBbits.RB0) например.
Да и другие варианты есть, все зависит от задачи.
Вт окт 03, 2017 12:45:47
Да все верно но ка то привык циклы выполнять через decfsz, да и место в МК не всегда достаточно чтоб читать единицу а потом делать сравнение, вместо одной команды decfsz
Вт окт 03, 2017 13:18:48
Напишите, как вы на асме делали бы проверку бита порта через decfsz.
Вт окт 03, 2017 13:34:47
Да дело не в проверке бита, проверка бита это часть цикла,
примерно так
movlw 0x05
movwf count
L1
call процедура
btfss portb,1
goto уход из цикла
decfsz count,f
goto L1
Вт окт 03, 2017 13:44:29
Так не Си занимает место в памяти. После компиляции сравните кусок кода на ассемблере со своим.
Вт окт 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; // либо какое-то иное действие
}
Глупо, конечно, напрямую переносить ассемблерный код в Си.
Это на первых порах так будет при переходе с асм на Си, потом мышление изменится.
Так что написанное мной можете считать бредом, а не советом к продолжению в том же духе.
Вт окт 03, 2017 18:21:02
Zhuk72, перепиши с do-while и в условии добавь проверку пина и будет то же самое и без имитации goto...
Вт окт 03, 2017 18:49:07
А смысл? Может там вообще без всего этого можно обойтись.
Конечной задачи мы же не знаем, хотя сдается мне, что это кнопочный антидребезг. Тогда там вообще не так нужно действовать.
Вт окт 03, 2017 19:07:29
Смысла нет однозначно , они так и будут сравнивать каждый оператор и писать в С на асм_стайл и голосить что компилятор лох...
Единицы из них осознают что такое структурное программирование и чем оно выгоднее лапшеобразной или линейной писанины...
Вт окт 03, 2017 21:23:47
Это переходный период, сам так же делал.
Первым блином по познанию Си был перенос термометра с динамической индикацией, и переключение разрядов на Си я делал так же, как на асме
Потом уже понял, что тут нужны иные подходы.
Вт окт 03, 2017 21:37:30
В общем да переходный период, пока изучаю Си понемногу, пишу прогу будильника напоминалки. Считывание времени и вывод на LCD заработал. Заткнулся на цикле с проверкой порта для активации или пропуска звонка. В общем данный пример то что нужно судя по всему. Спасибо всем откликнувшимся.
- Код:
for(count = 5; count > 0; count--)
{
proc();
if(!PORTBbits.RB1) break; // либо какое-то иное действие
}
Ср окт 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
Ср окт 04, 2017 09:43:16
а вот так если?
- Код:
while((PORTB & (1<<1)) && count--) func();
Ср окт 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();
Ср окт 04, 2017 11:17:33
Zhuk72, изображения не видны
Ср окт 04, 2017 11:54:55
Zhuk72, изображения не видны
Это у вас что-то. Может тот хостинг (prntscr.com) заблокирован в браузере?
Смотрите:
Ср окт 04, 2017 13:38:30
А сейчас показались. Что было - хз
Чт окт 05, 2017 10:27:04
Все разобрался, проблема была в недоломоном XC8, сейчас все компилируется как положено. Функции for и do while, выполняют то что нужно да и код резко сократился.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.