Радио

Вопрос по Си для AVR

Romantik 22-11-2012 20:09

Доброго времени суток всем присутствующим.
Начинаю так сказать малехо изучать. Налдабал тут малость типа бегущий огонь на основе всем известной "hello world" программы. Светодиоды сидят на порту А. Еще один, на выходе 0 порта Б. Немного изменяю и усложняю. Учусь так сказать. Вопрос в следующем. не могу условный переход сделать: if - goto - else. ошибку выдает. гляньте-вразумите, что не так...

#include <avr/io.h> // Õîòèì èñïîëüçîâàòü ïîðòû ââîäà/âûâîäà
#include <util/delay.h> // Õîòèì èñïîëüçîâàòü ôóíêöèè çàäåðæåê

int main()
{
// Ðåãèñòð DDRB îòâå÷àåò çà íàïðàâëåíèå
// ëèíèé ïîðòà. Åñëè êàêîé ëèáî áèò ðàâåí
// ëîã. 1, ñîîòâåòñòâóþùàÿ ëèíèÿ ïîðòà
// èñïîëüçóåòñÿ äëÿ âûâîäà äàííûõ. Èíà÷å äëÿ ââîäà.
// Ìû óêàçûâàåì, ÷òî ñîáèðàåìñÿ èñïîëüçîâàòü
// ëèíèþ 0 äëÿ âûâîäà äàííûõ (óñòàíàâëèâàåì áèò 0
// â ëîã. 1).
DDRA = 0xFF;
DDRB = 0x01;

// Íà÷èíàåì âå÷íûé öèêë.
for (;
{
// Èíèöèàëèçèðóåì ïåðåìåííóþ, õàðàêòåðèçóþùóþ
// âðåìÿ çàäåðæêè â ìèëëèñåêóíäàõ äëÿ çàìêíóòûõ êîíòàêòîâ.
int SleepTime = 10;

// Åñëè áèò 1 ïîðòà B óñòàíîâëåí â ëîã. 1, (êîíòàêòû ðàçîìêíóòû
// óâåëè÷èâàåì âäâîå âðåìÿ çàäåðæêè.
if (PINB & _BV(PB1)) goto label1;

else PORTB | = _BV(PB0);


// Óñòàíàâëèâàåì áèò 0 ïîðòà A â ëîã. 1.
// (çàæèãàåì ñâåòîäèîä .
PORTA | = _BV(PA0);

// Æäåì óêàçàííîå âðåìÿ.
_delay_ms(SleepTime);


// Óñòàíàâëèâàåì áèò 1 ïîðòà A â ëîã. 1.
// (çàæèãàåì ñâåòîäèîä .
PORTA | = _BV(PA1);

// Æäåì óêàçàííîå âðåìÿ.
_delay_ms(SleepTime);

// Óñòàíàâëèâàåì áèò 2 ïîðòà A â ëîã. 1.
// (çàæèãàåì ñâåòîäèîä .
PORTA | = _BV(PA2);

// Æäåì óêàçàííîå âðåìÿ.
_delay_ms(SleepTime);

// Óñòàíàâëèâàåì áèò 0 ïîðòà A â ëîã. 0.
// (ãàñèì ñâåòîäèîä .
PORTA &= ~_BV(PA0);

// Æäåì óêàçàííîå âðåìÿ.
_delay_ms(SleepTime);

// Óñòàíàâëèâàåì áèò 3 ïîðòà A â ëîã. 1.
// (çàæèãàåì ñâåòîäèîä .
PORTA | = _BV(PA3);

// Æäåì óêàçàííîå âðåìÿ.
_delay_ms(SleepTime);


// Óñòàíàâëèâàåì áèò 1 ïîðòà A â ëîã. 0.
// (ãàñèì ñâåòîäèîä .
PORTA &= ~_BV(PA1);

// Æäåì óêàçàííîå âðåìÿ.
_delay_ms(SleepTime);

// Óñòàíàâëèâàåì áèò 4 ïîðòà A â ëîã. 1.
// (çàæèãàåì ñâåòîäèîä .
PORTA | = _BV(PA4);

// Æäåì óêàçàííîå âðåìÿ.
_delay_ms(SleepTime);

// Óñòàíàâëèâàåì áèò 1 ïîðòà A â ëîã. 0.
// (ãàñèì ñâåòîäèîä .
PORTA &= ~_BV(PA2);

// Æäåì óêàçàííîå âðåìÿ.
_delay_ms(SleepTime);

// Óñòàíàâëèâàåì áèò 5 ïîðòà A â ëîã. 1.
// (çàæèãàåì ñâåòîäèîä .
PORTA | = _BV(PA5);

// Æäåì óêàçàííîå âðåìÿ.
_delay_ms(SleepTime);


// Óñòàíàâëèâàåì áèò 3 ïîðòà A â ëîã. 0.
// (ãàñèì ñâåòîäèîä .
PORTA &= ~_BV(PA3);

// Æäåì óêàçàííîå âðåìÿ.
_delay_ms(SleepTime);

// Óñòàíàâëèâàåì áèò 6 ïîðòà A â ëîã. 1.
// (çàæèãàåì ñâåòîäèîä .
PORTA | = _BV(PA6);

// Æäåì óêàçàííîå âðåìÿ.
_delay_ms(SleepTime);


// Óñòàíàâëèâàåì áèò 4 ïîðòà A â ëîã. 0.
// (ãàñèì ñâåòîäèîä .
PORTA &= ~_BV(PA4);

// Æäåì óêàçàííîå âðåìÿ.
_delay_ms(SleepTime);

// Óñòàíàâëèâàåì áèò 7 ïîðòà A â ëîã. 1.
// (çàæèãàåì ñâåòîäèîä .
PORTA | = _BV(PA7);

// Æäåì óêàçàííîå âðåìÿ.
_delay_ms(SleepTime);

// Óñòàíàâëèâàåì áèò 6 ïîðòà A â ëîã. 0.
// (ãàñèì ñâåòîäèîä .
PORTA &= ~_BV(PA6);

// Æäåì óêàçàííîå âðåìÿ.
_delay_ms(SleepTime);

// Óñòàíàâëèâàåì áèò 5 ïîðòà A â ëîã. 0.
// (ãàñèì ñâåòîäèîä .
PORTA &= ~_BV(PA5);

// Æäåì óêàçàííîå âðåìÿ.
_delay_ms(SleepTime);

// Óñòàíàâëèâàåì áèò 7 ïîðòà A â ëîã. 0.
// (ãàñèì ñâåòîäèîä .
PORTA &= ~_BV(PA7);

// Æäåì óêàçàííîå âðåìÿ.
_delay_ms(SleepTime);

_delay_ms(000);

}
{label1:


PORTB &= ~_BV(PB0);
SleepTime = SleepTime*5;
}
return;
return 0;

}

AVR studio пишет:
../main.c:153:3: error: 'SleepTime' undeclared (first use in this function)

rk 22-11-2012 21:02

Лучше программить без переходов по меткам. Применять структурное программирование, которое меток не приемлет.

А так не хватает вот тут, объявления SleepTime

int main()
{
unsigned long SleepTime=100; //Хотя бь со 100мс начать.
...
...

Что _BV делает?

ps.
ммм, SleepTime объявлен локально, не сразу заметил, в блоке цикла for, за его пределами, после :

}
{label1:

эта переменная уже не определена.
Объявление в цикле for удалить, и добавить в начало программы, куда я указал.

Samael 22-11-2012 21:42

quote:
Originally posted by rk:

Что _BV делает?



BV это вроде как BitValue. вместо сдвига. чтоб не писать (1<<PB0) например. тоже самое _BV(PB0) будет
rk 22-11-2012 22:29

Наличие видимо от компилятора зависит.
Samael 22-11-2012 23:16

это из GCC повелось
Aleksey_N 23-11-2012 09:53

набацал свой вариант бегущего огня. Сделал выход на порт B (8-бит)


#define bit_set(var,bitno) ((var) | = 1 << (bitno))
#define OUT_PORT PORTB

void main(void)
{
unsigned int S=0;

INIT();

while (1)
{
OUT_PORT=0;
bit_set(OUT_PORT,S);
S++;
if (S>7) S=0;
}
}

Samael 23-11-2012 10:10

а
quote:
Originally posted by Aleksey_N:

OUT_PORT=0;



зачем ?
аааа. увидел там накладывается в bit_set.
Aleksey_N 23-11-2012 10:33

quote:
увидел там накладывается в bit_set.

верно
Aleksey_N 23-11-2012 10:39

использование условных переходов - вещь не красивая


quote:
if (PINB & _BV(PB1)) goto label1;

else PORTB | = _BV(PB0);


это вот не красиво
если уже так хочется "связываться" с IF
то тогда уж так сделайте

if (PINB & _BV(PB1))
{
PORTB &= ~_BV(PB0);
SleepTime = SleepTime*5;
}
else PORTB | = _BV(PB0);

Aleksey_N 25-11-2012 17:01

тема померла что ли?
Romantik 25-11-2012 17:25

Нет. пока некогда было поковыряться.. А вопросы еще будут...
Aleksey_N 25-11-2012 17:31

ждемс..