roboforum.ru

Технический форум по робототехнике.


Оператор if

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

Оператор if

Сообщение KiCom » 30 дек 2005, 10:43

Пытаюсь его использовать а он не хочет. Вот код:
Код: Выделить всёРазвернуть
#include <io2313v.h>
#include <macros.h>
#define CENTER 2514
int mks_g=CENTER;
int del_0=CENTER;

char in;

void delaysa(unsigned int mks)
{
while(mks>0)
{
 mks--;
}
}

void port_init(void)
{
PORTB = 0xFF;
DDRB  = 0xFF;
PORTD = 0x00;
DDRD  = 0x00;
}

void timer0_init(void)
{
TCCR0 = 0x00; //stop timer
TCNT0 = 0x29; //set count
TCCR0 = 0x05; //start timer
}

#pragma interrupt_handler timer0_ovf_isr:7
void timer0_ovf_isr(void)
{

PORTB |=BIT(0);
delaysa(del_0);
PORTB &=~BIT(0);

TCNT0 = 0x29; //TIMER0 has overflowed
 //reload counter value

}

void uart0_init(void)
{
UCR  = 0x00; //disable while setting baud rate
UBRR = 0x47; //set baud rate
UCR  = 0xD8; //enable
}

#pragma interrupt_handler uart0_rx_isr:8
void uart0_rx_isr(void)
{
in=UDR;
in=in*1;
if (in=45)
PORTB^=BIT(7);
in=0;
}

#pragma interrupt_handler uart0_tx_isr:10
void uart0_tx_isr(void)
{


}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer0_init();
uart0_init();

MCUCR = 0x00;
GIMSK = 0x00;
TIMSK = 0x02;
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

//
void main(void)
{
init_devices();
while(1);


}


Смысл такой, по COM порту приходит число и если оно равно 45 то бит 7 инвертируется.
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение Карлсон » 30 дек 2005, 10:55

синтаксис.
вы видимо тоже паскалист либо просто плохо с сями знакомы.

нужно вот так:
if(in==45)
Аватара пользователя
Карлсон
 
Сообщения: 114
Зарегистрирован: 30 окт 2005, 13:10
Откуда: Москва

Сообщение KiCom » 30 дек 2005, 11:23

Ага с Паскаля начинал, но пол года Си в институте изучаю а всеравно та теже грабли наступаю :). Странно что ICC не ругаеться.
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение -= Александр =- » 30 дек 2005, 17:40

А он и не будет ругаться: оператор присвоения тоже возвращает значение...  :wink:
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение dogma » 30 дек 2005, 18:49

В оффтоп:
А ведь создатели языка С насамом деле пошутили, когда придумали его. Они прям так и сказал "Мы пошутили, а вы поверили :)".

Нет другого способа создать задержку как этот?
Код: Выделить всёРазвернуть
void delaysa(unsigned int mks) 
{
while(mks>0)
{
 mks--;
}
}
Аватара пользователя
dogma
 
Сообщения: 10
Зарегистрирован: 27 дек 2005, 11:35
Откуда: о. Сахалин, г. Холмск

Сообщение KiCom » 30 дек 2005, 18:52

Скажем так, в другом компиляторе можно при помощи функции delay, но это в другом, а тут ее нет поэтому пришлось так.
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение gab » 30 дек 2005, 18:57

dogma писал(а):В оффтоп:
А ведь создатели языка С насамом деле пошутили, когда придумали его. Они прям так и сказал "Мы пошутили, а вы поверили :)".

Нет другого способа создать задержку как этот?
Код: Выделить всёРазвернуть
void delaysa(unsigned int mks) 
{
while(mks>0)
{
 mks--;
}
}

Код: Выделить всёРазвернуть
void delaysa(unsigned int mks) { 
while((mks--) > 0) ;
}

Но неизвестно как это переварит ваш компилятор.
gab
 
Сообщения: 212
Зарегистрирован: 30 апр 2005, 03:11
Откуда: Москва
прог. языки: C/C++, Verilog
ФИО: Гвоздев Александр Борисович

Сообщение dogma » 30 дек 2005, 19:07

to KiCom
А можете рассказать по подробнее про то, что вы делаете?
На стороне чего работает это программа?
Аватара пользователя
dogma
 
Сообщения: 10
Зарегистрирован: 27 дек 2005, 11:35
Откуда: о. Сахалин, г. Холмск

Сообщение KiCom » 30 дек 2005, 19:13

Это конечно можно. Я пытаюсь сделать манипулятор, вот эта программа сегодня плавно превратилась в программу для управления сервами от компьютера. Вот собственно и все.
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение avr123.nm.ru » 31 дек 2005, 00:07

while((mks--) > 0) ;


здесь очень вероятно что декремент даже несмотря на скобки будет выполняться уже после сравнения mks с нулем

советую написать прямее:

while((mks-1) > 0) ;
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение avr123.nm.ru » 31 дек 2005, 00:08

только не забывайте что  
0 - 1 = 255
для беззнаковой char
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение avr123.nm.ru » 31 дек 2005, 00:11

если переменная не отрицательная то

while(mks>0)   можно заменить на  while(mks)

так как в Си истино это "не ноль",  а ложно это только ноль
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение ASin » 31 дек 2005, 00:34

avr123.nm.ru писал(а):советую написать прямее:

while((mks-1) > 0) ;


Гм... И что этот код будет делать?

Ой, дурному человека учите  :lol:
ASin
 
Сообщения: 155
Зарегистрирован: 18 дек 2004, 03:14
Откуда: Москва

Сообщение gab » 31 дек 2005, 03:53

avr123.nm.ru писал(а):
while((mks--) > 0) ;


здесь очень вероятно что декремент даже несмотря на скобки будет выполняться уже после сравнения mks с нулем

советую написать прямее:

while((mks-1) > 0) ;

Здесь вы не правы, т.к. после "mks-1"  нет изменения переменной mks. Этот код будет выполняться один раз при mks == 1 и бесконечное число раз при mks == 0 или mks >= 2.

(mks-- >0) в классическом С раскладывается как "mks > 0? да -- mks = mks - 1; return 1; иначе -- return 0;"
gab
 
Сообщения: 212
Зарегистрирован: 30 апр 2005, 03:11
Откуда: Москва
прог. языки: C/C++, Verilog
ФИО: Гвоздев Александр Борисович

Сообщение avr123.nm.ru » 31 дек 2005, 05:03

я лишь подсказал человеку что если он надеется на скобки то вероятно они не помогут!  я ж не написал что точно это так или что я это проверил!
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

След.

Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12