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 инвертируется.

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

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

нужно вот так:
if(in==45)

KiCom » 30 дек 2005, 11:23

Ага с Паскаля начинал, но пол года Си в институте изучаю а всеравно та теже грабли наступаю :). Странно что ICC не ругаеться.

-= Александр =- » 30 дек 2005, 17:40

А он и не будет ругаться: оператор присвоения тоже возвращает значение...  :wink:

dogma » 30 дек 2005, 18:49

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

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

KiCom » 30 дек 2005, 18:52

Скажем так, в другом компиляторе можно при помощи функции delay, но это в другом, а тут ее нет поэтому пришлось так.

gab » 30 дек 2005, 18:57

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

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

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

Но неизвестно как это переварит ваш компилятор.

dogma » 30 дек 2005, 19:07

to KiCom
А можете рассказать по подробнее про то, что вы делаете?
На стороне чего работает это программа?

KiCom » 30 дек 2005, 19:13

Это конечно можно. Я пытаюсь сделать манипулятор, вот эта программа сегодня плавно превратилась в программу для управления сервами от компьютера. Вот собственно и все.

avr123.nm.ru » 31 дек 2005, 00:07

while((mks--) > 0) ;


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

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

while((mks-1) > 0) ;

avr123.nm.ru » 31 дек 2005, 00:08

только не забывайте что  
0 - 1 = 255
для беззнаковой char

avr123.nm.ru » 31 дек 2005, 00:11

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

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

так как в Си истино это "не ноль",  а ложно это только ноль

ASin » 31 дек 2005, 00:34

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

while((mks-1) > 0) ;


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

Ой, дурному человека учите  :lol:

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;"

avr123.nm.ru » 31 дек 2005, 05:03

я лишь подсказал человеку что если он надеется на скобки то вероятно они не помогут!  я ж не написал что точно это так или что я это проверил!


Rambler\'s Top100 Mail.ru counter