Страница 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
Вау!!! Спасибо ОГРОМНОЕ!!! Получилось, работает! Теперь надо почитать про это дело. :beer: :beer: :beer:

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 с С попутаете
Я вот тоже не увидел там никакой вставки. Может мы не туда смотрим :shock:
Одна глобальная переменная займёт меньше памяти камня чем например 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 писал(а):
интересно когда её заглючит?
Гирлянду, может и никогда.
Если так и будете делать только гирлянды, то шансы поймать глюк не увеличатся :)
А ТС что делает?Разве не гирлянду? :)