decfsz в XC8
- Сообщения: 139
- Зарегистрирован: Сб апр 03, 2010 17:24:43
Здравствуйте, недавно начал изучать Си на платформе XC8 Mplab X, так вот возникла задача выполнять проверку бита порта пока идет отсчет до нуля. На ассемблере эту функцию хорошо выполняла команда decfsz, в Си так и не понял как реализовать такую команду. Пытался делать так while(--X==0) но это не совсем то. Здесь происходит вычитание единицы с последующей проверкой.
- Реклама
Ну так decfsz тоже уменьшает некую переменную до достижения нуля.
Если нужна проверка бита порта, то while или if, а в качестве аргумента (PORTBbits.RB0) например.
Да и другие варианты есть, все зависит от задачи.
Если нужна проверка бита порта, то while или if, а в качестве аргумента (PORTBbits.RB0) например.
Да и другие варианты есть, все зависит от задачи.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
- Сообщения: 139
- Зарегистрирован: Сб апр 03, 2010 17:24:43
Да все верно но ка то привык циклы выполнять через decfsz, да и место в МК не всегда достаточно чтоб читать единицу а потом делать сравнение, вместо одной команды decfsz
Напишите, как вы на асме делали бы проверку бита порта через decfsz.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
- Сообщения: 139
- Зарегистрирован: Сб апр 03, 2010 17:24:43
Да дело не в проверке бита, проверка бита это часть цикла,
примерно так
movlw 0x05
movwf count
L1
call процедура
btfss portb,1
goto уход из цикла
decfsz count,f
goto L1
примерно так
movlw 0x05
movwf count
L1
call процедура
btfss portb,1
goto уход из цикла
decfsz count,f
goto L1
- Реклама
Так не Си занимает место в памяти. После компиляции сравните кусок кода на ассемблере со своим.
[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]
Глупо, конечно, напрямую переносить ассемблерный код в Си.
Это на первых порах так будет при переходе с асм на Си, потом мышление изменится.
Так что написанное мной можете считать бредом, а не советом к продолжению в том же духе.
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 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Zhuk72, перепиши с do-while и в условии добавь проверку пина и будет то же самое и без имитации goto...
А смысл? Может там вообще без всего этого можно обойтись.
Конечной задачи мы же не знаем, хотя сдается мне, что это кнопочный антидребезг. Тогда там вообще не так нужно действовать.
Конечной задачи мы же не знаем, хотя сдается мне, что это кнопочный антидребезг. Тогда там вообще не так нужно действовать.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Смысла нет однозначно , они так и будут сравнивать каждый оператор и писать в С на асм_стайл и голосить что компилятор лох...
Единицы из них осознают что такое структурное программирование и чем оно выгоднее лапшеобразной или линейной писанины...
Единицы из них осознают что такое структурное программирование и чем оно выгоднее лапшеобразной или линейной писанины...
Это переходный период, сам так же делал.
Первым блином по познанию Си был перенос термометра с динамической индикацией, и переключение разрядов на Си я делал так же, как на асме
Потом уже понял, что тут нужны иные подходы.
Первым блином по познанию Си был перенос термометра с динамической индикацией, и переключение разрядов на Си я делал так же, как на асме
Потом уже понял, что тут нужны иные подходы.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
- Сообщения: 139
- Зарегистрирован: Сб апр 03, 2010 17:24:43
В общем да переходный период, пока изучаю Си понемногу, пишу прогу будильника напоминалки. Считывание времени и вывод на LCD заработал. Заткнулся на цикле с проверкой порта для активации или пропуска звонка. В общем данный пример то что нужно судя по всему. Спасибо всем откликнувшимся.
Код: Выделить всё
for(count = 5; count > 0; count--)
{
proc();
if(!PORTBbits.RB1) break; // либо какое-то иное действие
}[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]
Дизасм:
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
а вот так если?
Код: Выделить всё
while((PORTB & (1<<1)) && count--) func();если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
По мере возрастания кода:



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

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


