Страница 1 из 3
Переключатель гирлянд на Atmega16
Добавлено: Пт ноя 25, 2011 22:31:07
amirus
Доброго времени суток. Пытаюсь в первые самостоятельно написать переключатель гирлянд, прошу сильно не пинайте. Светодиодики бегут, вроде нормально. Хочу добавить немного других эффектов, но попал в ступор. Вот сам текст программы, подскажите пожалуйста, как сделать чтобы эта команда повторилась к примеру восемь раз, и после перешла к примеру к другой? Заранее благодарен за помощь.
Код: Выделить всё
{
rab = 0b10000000; // Сдвиг вправо
while (rab!=0)
{
PORTB=rab^0xFF; // Запись в порт
rab = rab >> 1; // Сдвиг
wait1 (); // Задержка
}
}
Re: Программа на atmega16
Добавлено: Пт ноя 25, 2011 22:55:04
diehard
Например так:
Код: Выделить всё
for(char i=0;i<8;i++)
{
rab = 0b10000000; // Сдвиг вправо
while (rab!=0)
{
PORTB=rab^0xFF; // Запись в порт
rab = rab >> 1; // Сдвиг
wait1 (); // Задержка
}
}
Re: Программа на atmega16
Добавлено: Пт ноя 25, 2011 23:19:05
К@Т
или так (ассемблерная вставка)
Код: Выделить всё
i=0;//вводим i и присваиваем 0
m1:{
rab = 0b10000000; // Сдвиг вправо
while (rab!=0)
{
PORTB=rab^0xFF; // Запись в порт
rab = rab >> 1; // Сдвиг
wait1 (); // Задержка
}
}
i=i+1;//увеличиваем на 1
if i<8 goto m1;//для 8 повторов переход на метку m1
else goto m 2;//переход на другой эфект под меткой m2
Re: Программа на atmega16
Добавлено: Сб ноя 26, 2011 00:19:19
amirus
Спасибо огромное. Если пишу как подсказал ув.
diehard при компиляции выходят три ошибки. Пытаюсь учиться по книге Белова, и ничего не могу найти по этим командам. Вот что получилось
Пишу на CV
Код: Выделить всё
#include <mega16.h>
#include <delay.h>
void wait1 (void)
{
TCNT1=0;
while (TCNT1<200) {};
}
void main(void)
{
unsigned char rab;
while (1)
{
for (char i=0;i<8;i++)
{
rab = 0b10000000; // Сдвиг вправо
while (rab!=0)
{
PORTB=rab^0xFF; // Запись в порт
rab = rab >> 1; // Сдвиг
wait1 (); // Задержка
}
}
};
}
Указывает что не верна эта строчка "for (char i=0;i<8;i++)"
А вот по подсказке ув
К@Т кажись мне очень будет тяжело. Тоже не смог вставить его. Вот эта строчка, на которую ругается компилятор
Код: Выделить всё
else goto m 2;//переход на другой эфект под меткой m2
Re: Программа на atmega16
Добавлено: Сб ноя 26, 2011 00:26:00
Аlex
Указывает что не верна эта строчка "for (char i=0;i<8;i++)"
Попробуйте так
Код: Выделить всё
void main(void)
{
unsigned char i;
...
...
for (i=0;i<8;i++)
...
...
Re: Программа на atmega16
Добавлено: Сб ноя 26, 2011 00:40:39
amirus
Re: Программа на atmega16
Добавлено: Сб ноя 26, 2011 09:58:07
К@Т
amirus писал(а):
А вот по подсказке ув
К@Т кажись мне очень будет тяжело. Тоже не смог вставить его. Вот эта строчка, на которую ругается компилятор
Код: Выделить всё
else goto m 2;//переход на другой эфект под меткой m2
А Вы пометили меткой m2 другой эфект?Ещё советую i сделать глобальной переменной и во всех
эфектах ей считать последовательно.

Re: Программа на atmega16
Добавлено: Сб ноя 26, 2011 10:58:36
BCluster
Господин К@Т написал истинно индусское решение

с целыми 2 goto там где они ваще не впились )
И где там ассемблерная вставка?
К@Т писал(а):Ещё советую i сделать глобальной переменной
И ПОБОЛЬШЕ глобальных переменных, а то когда их мало скучно жить.
Идеально когда вообще нет глобальных переменных
Re: Программа на atmega16
Добавлено: Сб ноя 26, 2011 11:08:10
amirus
К@Т писал(а):amirus писал(а): А Вы пометили меткой m2 другой эфект? Ещё советую i сделать глобальной переменной и во всех
эфектах ей считать последовательно.

Ну, наверное до таких решений мне очень далеко. Но, я буду стараться, спасибо огромное за подсказки. Я думаю нормальный программист то что я пишу, напишет в двух строчках, а я двумя эффектами умудряюсь почти забить треть памяти меги

Еще ни как не могу решить как сделать эффект бегущей тени и эффект накапливания. И исходников на С не могу найти, все что нашел либо на баскоме, либо на асме.
Re: Программа на atmega16
Добавлено: Сб ноя 26, 2011 22:08:02
К@Т
BCluster писал(а):
И где там ассемблерная вставка?
Учите языки,а то так скоро Delfi с С попутаете(подсказка разница не в командах а в их расписывании).
BCluster писал(а):
И ПОБОЛЬШЕ глобальных переменных, а то когда их мало скучно жить.
Идеально когда вообще нет глобальных переменных
Одна глобальная переменная займёт
меньше памяти камня чем например 10 локальных(т.е. если 10 эфектов и повторы в них будут считать локальные).

amirus писал(а):Я думаю нормальный программист то что я пишу, напишет в двух строчках,
Не надо в исходнике добиватса двух строчек,их надо в хексине добиватса.Например пога написаная на ассемблере имеет исходник в разы больше сишного,а вот хексина наоборот меньше получаетса.

Re: Программа на atmega16
Добавлено: Сб ноя 26, 2011 22:32:40
Аlex
К@Т писал(а):Учите языки,а то так скоро Delfi с С попутаете
Я вот тоже не увидел там никакой вставки. Может мы не туда смотрим
Одна глобальная переменная займёт меньше памяти камня чем например 10 локальных
А одна локальная меньше чем 10 глобальных. И что ?
И ещё не факт, что 10 локальных займут больше одной глобальной. Всё будет зависеть от положения вызовов ф-ий, в которых находятся локальные переменные.
Да и вообще, глупо использовать глобальную переменную в одном месте программы. Она не для этого предназначена.
К@Т писал(а):а вот хексина наоборот меньше получаетса.
И тут можно поспорить. С дури, как говориться, можно и х... (хвост) сломать. Хотя..., не мудрено, с Вашими советами.
Re: Программа на atmega16
Добавлено: Сб ноя 26, 2011 22:41:18
К@Т
Аlex писал(а):
Да и вообще, глупо использовать глобальную переменную в одном месте программы.
Не в одном эфекте а во всех для последовательного счёта.
Re: Программа на atmega16
Добавлено: Сб ноя 26, 2011 23:26:41
BCluster
К@Т писал(а):Учите языки,а то так скоро Delfi с С попутаете(подсказка разница не в командах а в их расписывании)
Иногда лучше жевать чем говорить, ей богу.
К@Т писал(а):Одна глобальная переменная займёт меньше памяти камня чем например 10 локальных(т.е. если 10 эфектов и повторы в них будут считать локальные)
А с чего бы? Память под переменную будет создана при вызове функции, при завершении функции будет уничтожена.
Re: Программа на atmega16
Добавлено: Сб ноя 26, 2011 23:31:19
К@Т
BCluster писал(а):
А с чего бы? Память под переменную будет создана при вызове функции, при завершении функции будет уничтожена.
Хексина с 10 локальными будет больше чем с одной глобальной(проверено),а иногда каждый байт на счету.
Re: Программа на atmega16
Добавлено: Сб ноя 26, 2011 23:37:34
Аlex
К@Т писал(а):Хексина с 10 локальными будет больше чем с одной глобальной(проверено)
Вам же говорят - будет зависить от вызова ф-ии. Если будете ф-ии вызывать из одной другую, тогда да, для каждой переменной будет выделена память.
Re: Программа на atmega16
Добавлено: Сб ноя 26, 2011 23:39:46
К@Т
Аlex писал(а):К@Т писал(а):Хексина с 10 локальными будет больше чем с одной глобальной(проверено)
Вам же говорят - будет зависить от вызова ф-ии. Если будете ф-ии вызывать из одной другую, тогда да, для каждой переменной будет выделена память.
Я про это и толкую.
Re: Программа на atmega16
Добавлено: Вс ноя 27, 2011 00:15:50
Аlex
К@Т писал(а):Я про это и толкую.
Про что ? Что нужно, для всех ф-ий, использовать одну переменную ? Причём эти ф-ии будут вызываться друг из друга ?
Ню-ню... Дерзайте... В скором будущем глюк Вам обеспечен.
Глобальная переменная нужна только в случае обмена данными между модулями/функциями. В остальных случаях - только локальные переменные.
Re: Программа на atmega16
Добавлено: Вс ноя 27, 2011 00:20:55
К@Т
Аlex писал(а):К@Т писал(а):Я про это и толкую.
Про что ? Что нужно, для всех ф-ий, использовать одну переменную ? Причём эти ф-ии будут вызываться друг из друга ?
Ню-ню... Дерзайте... В скором будущем глюк Вам обеспечен.
Уже 2 новых года встречал с герляндой на 56 эфектом с кодом написанной подобным образом(т.е.с одной глобольной переменной) и глюков не было скоро третий будет и интересно когда её заглючит?

Re: Программа на atmega16
Добавлено: Вс ноя 27, 2011 00:24:13
Аlex
интересно когда её заглючит?
Гирлянду, может и никогда.
Если так и будете делать только гирлянды, то шансы поймать глюк не увеличатся

Re: Программа на atmega16
Добавлено: Вс ноя 27, 2011 00:25:54
К@Т
Аlex писал(а):интересно когда её заглючит?
Гирлянду, может и никогда.
Если так и будете делать только гирлянды, то шансы поймать глюк не увеличатся

А ТС что делает?Разве не гирлянду?
