Технический форум по робототехнике.
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
я лишь подсказал человеку что если он надеется на скобки то вероятно они не помогут! я ж не написал что точно это так или что я это проверил!