roboforum.ru

Технический форум по робототехнике.
Текущее время: 23 апр 2025, 00:29

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Оператор if
СообщениеДобавлено: 30 дек 2005, 10:43 
Не в сети

Зарегистрирован: 22 окт 2005, 11:15
Сообщения: 345
Откуда: Красноярск
Пытаюсь его использовать а он не хочет. Вот код:
Код:
#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 
Не в сети
Аватара пользователя

Зарегистрирован: 30 окт 2005, 13:10
Сообщения: 114
Откуда: Москва
синтаксис.
вы видимо тоже паскалист либо просто плохо с сями знакомы.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 30 дек 2005, 11:23 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 30 дек 2005, 17:40 
Не в сети
Мастер Самоделкин
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 30 дек 2005, 18:49 
Не в сети
Аватара пользователя

Зарегистрирован: 27 дек 2005, 11:35
Сообщения: 10
Откуда: о. Сахалин, г. Холмск
В оффтоп:
А ведь создатели языка С насамом деле пошутили, когда придумали его. Они прям так и сказал "Мы пошутили, а вы поверили :)".

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 30 дек 2005, 18:52 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 30 дек 2005, 18:57 
Не в сети

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

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

Код:
void delaysa(unsigned int mks) {
while((mks--) > 0) ;
}

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 30 дек 2005, 19:07 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 30 дек 2005, 19:13 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 31 дек 2005, 00:07 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Цитата:
while((mks--) > 0) ;


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

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

while((mks-1) > 0) ;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 31 дек 2005, 00:08 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
только не забывайте что  
0 - 1 = 255
для беззнаковой char


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 31 дек 2005, 00:11 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
если переменная не отрицательная то

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 31 дек 2005, 00:34 
Не в сети

Зарегистрирован: 18 дек 2004, 03:14
Сообщения: 155
Откуда: Москва
avr123.nm.ru писал(а):
советую написать прямее:

while((mks-1) > 0) ;


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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 31 дек 2005, 03:53 
Не в сети

Зарегистрирован: 30 апр 2005, 03:11
Сообщения: 212
Откуда: Москва
прог. языки: C/C++, Verilog
ФИО: Гвоздев Александр Борисович
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;"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 31 дек 2005, 05:03 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
я лишь подсказал человеку что если он надеется на скобки то вероятно они не помогут!  я ж не написал что точно это так или что я это проверил!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа


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

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


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

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO