пятница, 30 апреля 2010 г.

Иллюстрации..

После оборения iPod-а (научил его запоминать место в книжку, которую слушал) собственно занимаюсь слушанием книжек, сейчас Метро 2033

А тут прям иллюстрации к книге (там страничка не автора, а кого-то, кто собрал кучу картинок) - http://www.inspireme.ru/post/3823/

четверг, 29 апреля 2010 г.

Самандрик...

Ай, в каком я офигении!

Upd: это вааще разрыв моска..

ffmpeg..

Я не настолько плох, как оказалось, не работал код с обновленными dll не из-за ошибок в заголовках, а из-за неправильно собранных dll – скачал собранные dll и все заработало; так что надо было обновить еще больше компиляторов и прочей чухни, чтобы оно скомпилилось и заработало и у меня (чужие dll мне не подходят, мне не надо 90% кодеков и 99% форматов, которые поддерживаются, поэтому я собираю “для себя”)

Так что обновленные pas-заголовки для dll из ffmpeg выложил на рапидшару (89 кб)

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

У меня в почте лежало несколько писем от пользователей, с комментами, багофиксами или пожеланиями; явные баги исправлял, а прочее оставлял “на потом”, но когда дело дошло до “потом”, почта успела потеряться (во время очередной переустановки винды.. как-то решил, что ничего важного в почте нет и не стал переносить письма).. Такой вот “упс..”

среда, 28 апреля 2010 г.

Есть две новости..

.. плохая и хорошая

Хорошая: не в лоб так по лбу решил забороть конвертацию в mpeg-файлы обновлением ffmpeg-ных библиотек, последний раз обновлял больше года назад. Пришлось как обычно подоустанавливать компиляторы разные и прочую чухню, но собрал, получил dll-ки. Потратил полтора дня, привел в соответствие h-файлам свои pas-файлы

Плохая: не работает код, который позавчера работал :)

понедельник, 26 апреля 2010 г.

И еще про “лампу настроения”..

Я почти придумал бехавиор® для нее, предистория:

поза- и прошлое лето я делал ремонты у себя в квартире, поэтому часто ездили в строймаг, а там система поощрения такая – определенный % от покупки тебе “дарится” на карточку клиента, потратить эти деньги можно только на покупку чего-нибудь в этом же магазине, деньги “сгорают” в начале следующего года

Так что мы перед Новым годом ездили их тратить на елочные игрушки, у меня “манечка” на стеклянные шарики, хоть жена и ругается, что их на нашу небезразмерную елку вешать некуда :)

Так вот там в “новогоднем” отделе продавались “арт-обьекты” (потому что бесполезные как.. ну как что.. как лампа настроения ;) ) – ветки, опутанные светодиодной (или просто мелко-лампочной) гирляндой.. жена начала “давай купим”, но 1) я хотел шарики, 2) я сказал “да твой муж спаял 140 светодиодов в потолок, да неушто он!..”

Там действительно делать нечего (и тех денег оно не стоит), но пообещал, а сделать все руки не доходили. А тут искал ссылку про usb софтварный и подумал, что usb – хороший источник напряжения для питания и той ветки, и лампы; а у меня есть комп, который на usb напряжение дает, даже когда выключен (usb-хаб в виде аквариума, в который я впаял синий светодиод, потому что на нем сэкономили китайцы, светится круглые сутки уже пару лет как)

Значит надо взять а) какую-то матовую емкость, в дно встроить схему лампы, чтобы она подсвечивала меееееедленно и неспешно эту емкость, сверху натыкать веток, их “украсить” светодиодами (как раз, когда посл. раз детали заказывал, “для суммы” и из жадности купил мелких синих светодиодов кучку), которые подключить к одной/нескольким ножкам контроллера (их там свободных туча остается еще) и тоже плавно менять яркость на ветках..

Все, к след. Новому году (всего-то 250 дней осталось) точно сделаю ;)

воскресенье, 25 апреля 2010 г.

Лампа настроения, убдате..

“Аналитическое тупление” дало результаты, код изменился, хотя результат работы тот же – плавная смена цветов по кругу:

   1: #include <;;avr/io.h> 
   2: #include <;;avr/interrupt.h> 
   3: #include <;;avr/pgmspace.h> 
   4: #include "avrlibtypes.h" 
   5: #include "delay.h" 
   6:  
   7: #define F_OSC F_CPU 
   8:  
   9: volatile u08 r, g, b, counter = 0; 
  10: 
  11: // таблица нелинейности для яркости 
  12: // хотя как лучше – с ней или без – я пока не решил 
  13: // если без нее – тогда можно не включать pgmspace.h и выкинуть 2 строки из 
  14: // след. функции (v = pgm_…) 
  15: u08 gamma[256] PROGMEM = { 
  16:     0,   1,   1,   2,   2,   2,   2,   2,   2,   3,   3,   3,   3,   3,   3,   3, 
  17:     3,   3,   3,   3,   3,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,   4, 
  18:     4,   4,   4,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   6,   6,   6, 
  19:     6,   6,   6,   6,   6,   7,   7,   7,   7,   7,   7,   7,   8,   8,   8,   8, 
  20:     8,   8,   9,   9,   9,   9,   9,   9,   10,  10,  10,  10,  10,  11,  11,  11, 
  21:     11,  11,  12,  12,  12,  12,  12,  13,  13,  13,  13,  14,  14,  14,  14,  15, 
  22:     15,  15,  16,  16,  16,  16,  17,  17,  17,  18,  18,  18,  19,  19,  19,  20, 
  23:     20,  20,  21,  21,  22,  22,  22,  23,  23,  24,  24,  25,  25,  25,  26,  26, 
  24:     27,  27,  28,  28,  29,  29,  30,  30,  31,  32,  32,  33,  33,  34,  35,  35, 
  25:     36,  36,  37,  38,  38,  39,  40,  40,  41,  42,  43,  43,  44,  45,  46,  47, 
  26:     48,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62, 
  27:     63,  64,  65,  66,  68,  69,  70,  71,  73,  74,  75,  76,  78,  79,  81,  82, 
  28:     83,  85,  86,  88,  90,  91,  93,  94,  96,  98,  99,  101, 103, 105, 107, 109, 
  29:     110, 112, 114, 116, 118, 121, 123, 125, 127, 129, 132, 134, 136, 139, 141, 144, 
  30:     146, 149, 151, 154, 157, 159, 162, 165, 168, 171, 174, 177, 180, 183, 186, 190, 
  31:     193, 196, 200, 203, 207, 211, 214, 218, 222, 226, 230, 234, 238, 242, 248, 255 
  32: }; 
  33: 
  34: void getRGB (u16 h, u08 s, u08 v) 
  35: { 
  36:   u16 base; 
  37: 
  38:   v = pgm_read_byte(&gamma[v]); 
  39:   s = 255 - pgm_read_byte(&;;gamma[255 - s]); 
  40:  
  41:   if (s == 0) 
  42:   { 
  43:     r = v; 
  44:     g = v; 
  45:     b = v; 
  46:   } else { 
  47:     base = ((255 - s) * v) >;;> 8; 
  48:  
  49:     switch (h / 60) { 
  50:       case 0: 
  51:         r = v; 
  52:         g = (((v - base) * h) / 60) + base; 
  53:         b = base; 
  54:         break; 
  55:       case 1: 
  56:         r = (((v - base) * (60 - (h % 60))) / 60) + base; 
  57:         g = v; 
  58:         b = base; 
  59:         break; 
  60:       case 2: 
  61:         r = base; 
  62:         g = v; 
  63:         b = (((v - base) * (h % 60)) / 60) + base; 
  64:         break; 
  65:       case 3: 
  66:         r = base; 
  67:         g = (((v - base) * (60 - (h % 60))) / 60) + base; 
  68:         b = v; 
  69:         break; 
  70:       case 4: 
  71:         r = (((v - base) * (h % 60)) / 60) + base; 
  72:         g = base; 
  73:         b = v; 
  74:         break; 
  75:       case 5: 
  76:         r = v; 
  77:         g = base; 
  78:         b = (((v - base) * (60 - (h % 60))) / 60) + base; 
  79:       break; 
  80:     } 
  81:   } 
  82: } 
  83:  
  84: void init(void) 
  85: { 
  86: //{{AVR_IO_DESIGNER_INIT 
  87:     // Project Options - ambi-lamp 
  88:     // 
  89:     // Device Name = ATtiny2313 
  90:     // CPU Frequency (F_CPU) = 11,059 MHz 
  91:     // IC Package = DIP 
  92:     // Sort Pins by = Pin Number 
  93:     // Output Code File = ..\main.c 
  94:     // Output Header File = ..\hardware.h 
  95:     // Assume Default State = True 
  96:     // Write Unmodified Bits = True 
  97:     // Set Unused PORT Pins = Input 
  98:  
  99:     // 
 100:     // PORTD variable initializations 
 101:     // 
 102:     // PORTD3 for 1: led_red as Output - 
 103:     // PORTD4 for 1: led_green as Output - 
 104:     // PORTD5 for 1: led_blue as Output - 
 105:     DDRD = 0x38; 
 106: 
 107:     // 
 108:     // TIMER_COUNTER_0 -  - 
 109:     // 
 110:     // Clock Select = clk (No prescaling) 
 111:     // Timer Overflow Interrupt Enable = Enabled 
 112:     // Counter Frequency = 43,199 kHz 
 113:     // Counter Period = 23,149 usec 
 114:     // Seconds per Count = 90,424 nsec 
 115:     // Counts per Second = 11,059 MHz 
 116:     TIMSK = 0x02;    // (1<<TOIE0) 
 117:     TCCR0B = 0x01;    // (0<<CS02)|(0<<CS01)|(1<<CS00) 
 118: //}}AVR_IO_DESIGNER_INIT 
 119:  
 120:     sei(); 
 121: } 
 122:  
 123: ISR(TIMER0_OVF_vect) 
 124: {
 125:  
 126: #define    led_red_SHIFT           0x03 
 127: #define    led_green_SHIFT         0x04 
 128: #define    led_blue_SHIFT         0x05 
 129:  
 130:   PORTD = ((r >;; counter) << led_red_SHIFT) | ((g > counter) << led_green_SHIFT) | 
 131:           ((b >;; counter) << led_blue_SHIFT); 
 132:   counter++; 
 133: } 
 134:  
 135: int main(void) 
 136: { 
 137:   init(); 
 138: 
 139:   u16 h; 
 140:  
 141:   while(1) 
 142:   { 
 143:     for (h = 0; h < 360; h++) 
 144:     { 
 145:       // ф-ция принимает параметр – цвет, насыщенность и яркость 
 146:       // цвет от 0 до 360 == от красного к фиолетовому по радуге 
 147:       // насыщенность == 255 – “чистый” цвет, ближе к 0 – “серый”; на цветовом конусе это означает, что с 
 148:       // минимальной насыщенностью с изменением цвета тот собственно практич. не меняется – в моем 
 149:       // случае это практич. белый с любым значением цвета 
 150:       // яркость понятно, чем меньше, тем ближе к черному.. при маленьких значениях начинаются глюки в виде мерцания.. 
 151:       // з.ы. глюки больше (при маленьких значениях насыщенности и яркости) без корректирующей таблицы, с 
 152:       // другой стороны – таблица == четверть памяти контроллера (прошивка занимает 1400/1100 байт с и без таблицы) 
 153:       getRGB(h, 255, 150); 
 154: 
 155:       delay_ms(10); 
 156:     } 
 157:   } 
 158:  
 159:   return 0; 
 160: }

Лампа настроения

Лампу как законченный обьект я конечно не сделал (пока по крайней мере)

Но тесты с цветом проводил, так что при желании можно было бы собрать все в кучу и подарить кому-нибудь; а так на макетке собрана такая схема:

ambi-lamp 

Программа проста, как 5 копеек, но памяти забрала аж 3/4 (от 2-х килобайт тини2313); аппаратные шим-ы не используются, яркость управляется программно с помощью таймера, после включения на секунду включаются поочередно каждый цвет, а потом цвет меняется по кругу по известному правилу “Каждый охотник желает знать..”

Плавно вывести все цвета с использованием модели RGB так же непросто, как легко это сделать с помощью модели HSV, которая описывает цвет именно как цвет (в википедии написано больше); бОльшую часть прошивки у меня занимает таблица пред-рассчитанных значений для всего цветового круга, прошивка собственно выглядит так:

   1: #include <avr/io.h> 
   2: #include <avr/interrupt.h> 
   3: #include <avr/pgmspace.h> 
   4: // в след. h-файле содержаться описания типов, типа u08 = uint_8 
   5: #include "avrlibtypes.h" 
   6: // в hardware.h описывается, что такое led_red_SHIFT – собственно 
   7: // в этом случае можно было бы не выпендриваться и вписать 3 цифры.. 
   8: #include "hardware.h" 
   9: // готовый модуль из примеров в протеусе для задержек; в общем-то вообще неважно, как делать паузы.. 
  10: #include "delay.h" 
  11:  
  12: // модуль delay.h старый и ищет F_OSC для расчета задержек 
  13: #define F_OSC F_CPU 
  14:  
  15: // собственно значения компонент цвета 
  16: volatile u08 r, g, b, counter; 
  17:  
  18: // init чуть менее чем полностью автогенеренный программкой AVR IO designer 
  19: void init(void) 
  20: { 
  21: //{{AVR_IO_DESIGNER_INIT  
  22:     // Project Options - ambi-lamp 
  23:     // 
  24:     // Device Name = ATtiny2313 
  25:     // CPU Frequency (F_CPU) = 3,68 MHz 
  26:     // IC Package = DIP 
  27:     // Sort Pins by = Pin Number 
  28:     // Output Code File = ..\main.c 
  29:     // Output Header File = ..\hardware.h 
  30:     // Assume Default State = True 
  31:     // Write Unmodified Bits = True 
  32:     // Set Unused PORT Pins = Input 
  33:  
  34:     // 
  35:     // PORTD variable initializations 
  36:     // 
  37:     // PORTD3 for 1: led_red as Output - 
  38:     // PORTD4 for 1: led_green as Output - 
  39:     // PORTD5 for 1: led_blue as Output - 
  40:     DDRD = 0x38; 
  41:  
  42:     // 
  43:     // TIMER_COUNTER_0 -  - 
  44:     // 
  45:     // Clock Select = clk (No prescaling) 
  46:     // Timer Overflow Interrupt Enable = Enabled 
  47:     // Counter Frequency = 14,375 kHz 
  48:     // Counter Period = 69,565 usec 
  49:     // Seconds per Count = 271,739 nsec 
  50:     // Counts per Second = 3,68 MHz 
  51:     TIMSK = 0x02;    // (1<<TOIE0) 
  52:     TCCR0B = 0x01;    // (0<<CS02)|(0<<CS01)|(1<<CS00) 
  53: //}}AVR_IO_DESIGNER_INIT 
  54:  
  55:     sei(); 
  56: } 
  57:  
  58: // собственно вот здесь яркость и управляется.. 
  59: ISR(TIMER0_OVF_vect) 
  60: { 
  61:   PORTD = ((r >; counter) << led_red_SHIFT) | ((g > counter) << led_green_SHIFT) | ((b > counter) << led_blue_SHIFT); 
  62:   counter++; 
  63: } 
  64:  
  65: // значение hue (цветовой тон) меняется в пределах от 0 до 360, от красного соотв. до фиолетового 
  66: // в этом массиве – посчитанные в программке на делфи значения rgb для каждого значения hue 
  67: u08 pre_colors [3 * 360] PROGMEM = { 
  68:       255, 0, 0, 255, 4, 0, 255, 8, 0, 255, 12, 0, 255, 17, 0, 
  69:       255, 21, 0, 255, 25, 0, 255, 29, 0, 255, 34, 0, 
  70:       255, 38, 0, 255, 42, 0, 255, 46, 0, 255, 51, 0, 255, 55, 0, 
  71:       255, 59, 0, 255, 63, 0, 255, 68, 0, 255, 72, 0, 
  72:       255, 76, 0, 255, 80, 0, 255, 85, 0, 255, 89, 0, 255, 93, 0, 
  73:       255, 97, 0, 255, 102, 0, 255, 106, 0, 255, 110, 0, 
  74:       255, 114, 0, 255, 119, 0, 255, 123, 0, 255, 127, 0, 
  75:       255, 131, 0, 255, 136, 0, 255, 140, 0, 255, 144, 0, 
  76:       255, 148, 0, 255, 153, 0, 255, 157, 0, 255, 161, 0, 
  77:       255, 165, 0, 255, 170, 0, 255, 174, 0, 255, 178, 0, 
  78:       255, 182, 0, 255, 187, 0, 255, 191, 0, 255, 195, 0, 
  79:       255, 199, 0, 255, 204, 0, 255, 208, 0, 255, 212, 0, 
  80:       255, 216, 0, 255, 221, 0, 255, 225, 0, 255, 229, 0, 
  81:       255, 233, 0, 255, 238, 0, 255, 242, 0, 255, 246, 0, 
  82:       255, 250, 0, 255, 255, 0, 250, 255, 0, 246, 255, 0, 
  83:       242, 255, 0, 238, 255, 0, 233, 255, 0, 229, 255, 0, 
  84:       225, 255, 0, 221, 255, 0, 216, 255, 0, 212, 255, 0, 
  85:       208, 255, 0, 204, 255, 0, 199, 255, 0, 195, 255, 0, 191, 
  86:       255, 0, 187, 255, 0, 182, 255, 0, 178, 255, 0, 174, 
  87:       255, 0, 170, 255, 0, 165, 255, 0, 161, 255, 0, 157, 
  88:       255, 0, 153, 255, 0, 148, 255, 0, 144, 255, 0, 140, 
  89:       255, 0, 136, 255, 0, 131, 255, 0, 127, 255, 0, 123, 
  90:       255, 0, 119, 255, 0, 114, 255, 0, 110, 255, 0, 106, 
  91:       255, 0, 102, 255, 0, 97, 255, 0, 93, 255, 0, 89, 255, 0, 85, 
  92:       255, 0, 80, 255, 0, 76, 255, 0, 72, 255, 0, 68, 255, 
  93:       0, 63, 255, 0, 59, 255, 0, 55, 255, 0, 51, 255, 0, 46, 
  94:       255, 0, 42, 255, 0, 38, 255, 0, 34, 255, 0, 29, 255, 
  95:       0, 25, 255, 0, 21, 255, 0, 17, 255, 0, 12, 255, 0, 8, 
  96:       255, 0, 4, 255, 0, 0, 255, 0, 0, 255, 4, 0, 255, 8, 
  97:       0, 255, 12, 0, 255, 17, 0, 255, 21, 0, 255, 25, 0, 
  98:       255, 29, 0, 255, 34, 0, 255, 38, 0, 255, 42, 0, 255, 
  99:       46, 0, 255, 51, 0, 255, 55, 0, 255, 59, 0, 255, 63, 0, 
 100:       255, 68, 0, 255, 72, 0, 255, 76, 0, 255, 80, 0, 255, 
 101:       85, 0, 255, 89, 0, 255, 93, 0, 255, 97, 0, 255, 102, 0, 
 102:       255, 106, 0, 255, 110, 0, 255, 114, 0, 255, 119, 0, 
 103:       255, 123, 0, 255, 127, 0, 255, 131, 0, 255, 136, 0, 
 104:       255, 140, 0, 255, 144, 0, 255, 148, 0, 255, 153, 0, 
 105:       255, 157, 0, 255, 161, 0, 255, 165, 0, 255, 170, 0, 
 106:       255, 174, 0, 255, 178, 0, 255, 182, 0, 255, 187, 0, 
 107:       255, 191, 0, 255, 195, 0, 255, 199, 0, 255, 204, 0, 
 108:       255, 208, 0, 255, 212, 0, 255, 216, 0, 255, 221, 0, 
 109:       255, 225, 0, 255, 229, 0, 255, 233, 0, 255, 238, 0, 
 110:       255, 242, 0, 255, 246, 0, 255, 250, 0, 255, 255, 0, 
 111:       250, 255, 0, 246, 255, 0, 242, 255, 0, 238, 255, 0, 233, 
 112:       255, 0, 229, 255, 0, 225, 255, 0, 221, 255, 0, 216, 
 113:       255, 0, 212, 255, 0, 208, 255, 0, 204, 255, 0, 199, 
 114:       255, 0, 195, 255, 0, 191, 255, 0, 187, 255, 0, 182, 
 115:       255, 0, 178, 255, 0, 174, 255, 0, 170, 255, 0, 165, 
 116:       255, 0, 161, 255, 0, 157, 255, 0, 153, 255, 0, 148, 
 117:       255, 0, 144, 255, 0, 140, 255, 0, 136, 255, 0, 131, 
 118:       255, 0, 127, 255, 0, 123, 255, 0, 119, 255, 0, 114, 
 119:       255, 0, 110, 255, 0, 106, 255, 0, 102, 255, 0, 97, 
 120:       255, 0, 93, 255, 0, 89, 255, 0, 85, 255, 0, 80, 255, 
 121:       0, 76, 255, 0, 72, 255, 0, 68, 255, 0, 63, 255, 0, 59, 
 122:       255, 0, 55, 255, 0, 51, 255, 0, 46, 255, 0, 42, 255, 
 123:       0, 38, 255, 0, 34, 255, 0, 29, 255, 0, 25, 255, 0, 21, 
 124:       255, 0, 17, 255, 0, 12, 255, 0, 8, 255, 0, 4, 255, 0, 
 125:       0, 255, 4, 0, 255, 8, 0, 255, 12, 0, 255, 17, 0, 
 126:       255, 21, 0, 255, 25, 0, 255, 29, 0, 255, 34, 0, 255, 
 127:       38, 0, 255, 42, 0, 255, 46, 0, 255, 51, 0, 255, 55, 0, 
 128:       255, 59, 0, 255, 63, 0, 255, 68, 0, 255, 72, 0, 255, 
 129:       76, 0, 255, 80, 0, 255, 85, 0, 255, 89, 0, 255, 93, 0, 
 130:       255, 97, 0, 255, 102, 0, 255, 106, 0, 255, 110, 0, 
 131:       255, 114, 0, 255, 119, 0, 255, 123, 0, 255, 127, 0, 
 132:       255, 131, 0, 255, 136, 0, 255, 140, 0, 255, 144, 0, 
 133:       255, 148, 0, 255, 153, 0, 255, 157, 0, 255, 161, 0, 
 134:       255, 165, 0, 255, 170, 0, 255, 174, 0, 255, 178, 0, 
 135:       255, 182, 0, 255, 187, 0, 255, 191, 0, 255, 195, 0, 
 136:       255, 199, 0, 255, 204, 0, 255, 208, 0, 255, 212, 0, 
 137:       255, 216, 0, 255, 221, 0, 255, 225, 0, 255, 229, 0, 
 138:       255, 233, 0, 255, 238, 0, 255, 242, 0, 255, 246, 0, 
 139:       255, 250, 0, 255, 255, 0, 255, 255, 0, 250, 255, 0, 246, 
 140:       255, 0, 242, 255, 0, 238, 255, 0, 233, 255, 0, 229, 
 141:       255, 0, 225, 255, 0, 221, 255, 0, 216, 255, 0, 212, 
 142:       255, 0, 208, 255, 0, 204, 255, 0, 199, 255, 0, 195, 
 143:       255, 0, 191, 255, 0, 187, 255, 0, 182, 255, 0, 178, 
 144:       255, 0, 174, 255, 0, 170, 255, 0, 165, 255, 0, 161, 
 145:       255, 0, 157, 255, 0, 153, 255, 0, 148, 255, 0, 144, 
 146:       255, 0, 140, 255, 0, 136, 255, 0, 131, 255, 0, 127, 
 147:       255, 0, 123, 255, 0, 119, 255, 0, 114, 255, 0, 110, 
 148:       255, 0, 106, 255, 0, 102, 255, 0, 97, 255, 0, 93, 255, 
 149:       0, 89, 255, 0, 85, 255, 0, 80, 255, 0, 76, 255, 0, 72, 
 150:       255, 0, 68, 255, 0, 63, 255, 0, 59, 255, 0, 55, 255, 
 151:       0, 51, 255, 0, 46, 255, 0, 42, 255, 0, 38, 255, 0, 34, 
 152:       255, 0, 29, 255, 0, 25, 255, 0, 21, 255, 0, 17, 255, 
 153:       0, 12, 255, 0, 8, 255, 0, 4 
 154: }; 
 155:  
 156: // ну и собственно “программа” – на секунду показываю чистые цвета, а потом 
 157: // бесконечно меняю цвет.. 
 158: int main(void) 
 159: { 
 160:   init(); 
 161:  
 162:   r = 255; g = b = 0; 
 163:   delay_ms(1000); 
 164:   r = 0; g = 255; b = 0; 
 165:   delay_ms(1000); 
 166:   r = g = 0; b = 255; 
 167:   delay_ms(1000); 
 168:  
 169:   int h = 0; 
 170:  
 171:   while(1) 
 172:   { 
 173:     for (h = 0; h < 360; h++) 
 174:     {  
 175:       r = pgm_read_byte(&;pre_colors[h * 3]); 
 176:       g = pgm_read_byte(&;pre_colors[h * 3 + 1]); 
 177:       b = pgm_read_byte(&;pre_colors[h * 3 + 2]); 
 178:  
 179:       delay_ms(10); 
 180:     } 
 181:   } 
 182:  
 183:   return 0; 
 184: }

Почему так через ж***? Процедура, которую я написал для huv –> rgb на паскале, по непонятной пока причине глючит, если я пытаюсь ее написать на Си, поэтому махнул рукой и забил (учитывая, что каждое 3-е предупреждение компилятора мне по прежнему о том, что я путаю “=” и “==”, то неудивительно, что оно не работает.. но не очень то и хотелось просто на самом деле)

Хотя, учитывая, что для конвертации используется умножение/деление и т.д., размер не намного меньше получается – ну половина от всей памяти – можно и так оставить :)

Но зато если считать “на месте” – то яркость опять же легко меняется..

з.ы. естественно не отменяется самый простой способ получить плавный переход по всем цветам

   1: int main(void) 
   2: { 
   3:   init(); 
   4:  
   5:   r = 255; g = b = 0; 
   6:  
   7: #define delay_val 10 
   8:  
   9:   while(1) 
  10:   { 
  11:     for (g = 0; g < 255; g++) 
  12:       delay_ms(delay_val); 
  13:     for (r = 255; r > 0; r--) 
  14:       delay_ms(delay_val); 
  15:     for (b = 0; b < 255; b++) 
  16:       delay_ms(delay_val); 
  17:     for (g = 255; g > 0; g--) 
  18:       delay_ms(delay_val); 
  19:     for (r = 0; r < 255; r++) 
  20:       delay_ms(delay_val); 
  21:     for (b = 255; b > 0; b--) 
  22:       delay_ms(delay_val); 
  23:   } 
  24:  
  25:   return 0; 
  26: }
  27:  

получится те же к –> о –> ж –> з… и займет это всего 600 байт, но тогда сложнее сделать скажем “перейти от зеленого к красному”, если конечно вдруг такое приспичит :)