izhevsk.ru Главная /  Радио /  Вопрос по Си для AVR
тема закрыта

Имя:
Пароль:
 зарегистрироваться | Войти через
напоминатель пароля
Вопрос по Си для AVR
НОВАЯ ТЕМА правила | поиск | картинки | | | о форуме |
  Новости | Авто | Недвижимость | Работа | Бизнес | Стройка | Объявления | Совместная покупка | | |
  следующая тема | предыдущая тема
Автор Тема:   Вопрос по Си для AVR   версия для печати
Romantik
Рейтинг: 180/-40
-- написано 22-11-2012 20:09 Romantik

Доброго времени суток всем присутствующим.
Начинаю так сказать малехо изучать. Налдабал тут малость типа бегущий огонь на основе всем известной "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
Рейтинг: 546/-186
-- написано 22-11-2012 21:02 rk

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

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

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

Что _BV делает?

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

}
{label1:

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

история редактирования

Samael
Рейтинг: 6/0
-- написано 22-11-2012 21:42 Samael

quote:
Originally posted by rk:

Что _BV делает?



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

Наличие видимо от компилятора зависит.
Samael
Рейтинг: 6/0
-- написано 22-11-2012 23:16 Samael

это из GCC повелось
Aleksey_N
Рейтинг: 7/0
-- написано 23-11-2012 09:53 Aleksey_N

набацал свой вариант бегущего огня. Сделал выход на порт 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
Рейтинг: 6/0
-- написано 23-11-2012 10:10 Samael

а
quote:
Originally posted by Aleksey_N:

OUT_PORT=0;



зачем ?
аааа. увидел там накладывается в bit_set.

история редактирования

Aleksey_N
Рейтинг: 7/0
-- написано 23-11-2012 10:33 Aleksey_N

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

верно
Aleksey_N
Рейтинг: 7/0
-- написано 23-11-2012 10:39 Aleksey_N

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


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
Рейтинг: 7/0
-- написано 25-11-2012 17:01 Aleksey_N

тема померла что ли?
Romantik
Рейтинг: 180/-40
-- написано 25-11-2012 17:25 Romantik

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

ждемс..

200x150 320x240 400x300 800x600    без переносов   
быстрый ответ   

подпись
следующая тема | предыдущая тема

Главная /  Радио /  Вопрос по Си для AVR форумы izhevsk.ru

 
 
 
 
 
© ООО "Марк" 2020
 
Интернет-провайдер КК МАРК-ИТТ