//Адрессация выводов ATMEGA128, через штатную функцию digitalWrite() затруднена из-за усеченной адрессации этой функции в Arduino. //Поэтому, для каждого вывода порта, с подключенным к нему светодиодом, определяем собственный макрос включения и выключения. //Макрос включения (зажигания светодиода): L(номер светодиода на плате АрдуЁлка-01). //Макрос выключения (гашения светодиода): H(номер светодиода на плате АрдуЁлка-01). //Схемотехника АрдуЁлки-01 использует значительные токи управления светодиодами. Чтобы избежать перегрузки внутренней шины питания микроконтроллера ATMEGA128, //все светодиоды подключены катодами (-) к выводам микроконтроллера. //Это привело к тому, что для включения (зажигания) светодиода, необходимо записать низкий уровень в порт (L=Low), а для выключения (гашения) - высокий уровень (H=High). //Определяем макросы для каждого вывода микроконтроллера ATMEGA128 #define L1 PORTF&=~(1<<5); // RESET BIT; #define H1 PORTF|=(1<<5); //SET BIT; #define L2 PORTA&=~(1<<0); #define H2 PORTA|=(1<<0); #define L3 PORTA&=~(1<<1); #define H3 PORTA|=(1<<1); #define L4 PORTA&=~(1<<2); #define H4 PORTA|=(1<<2); #define L5 PORTA&=~(1<<5); #define H5 PORTA|=(1<<5); #define L6 PORTA&=~(1<<3); #define H6 PORTA|=(1<<3); #define L7 PORTF&=~(1<<7); #define H7 PORTF|=(1<<7); #define L8 PORTF&=~(1<<0); #define H8 PORTF|=(1<<0); #define L9 PORTF&=~(1<<1); #define H9 PORTF|=(1<<1); #define L10 PORTF&=~(1<<2); #define H10 PORTF|=(1<<2); #define L11 PORTF&=~(1<<3); #define H11 PORTF|=(1<<3); #define L12 PORTF&=~(1<<4); #define H12 PORTF|=(1<<4); #define L13 PORTA&=~(1<<6); #define H13 PORTA|=(1<<6); #define L14 PORTA&=~(1<<7); #define H14 PORTA|=(1<<7); #define L15 PORTG&=~(1<<2); #define H15 PORTG|=(1<<2); #define L16 PORTC&=~(1<<7); #define H16 PORTC|=(1<<7); #define L17 PORTC&=~(1<<6); #define H17 PORTC|=(1<<6); #define L18 PORTA&=~(1<<4); #define H18 PORTA|=(1<<4); #define L19 PORTF&=~(1<<6); #define H19 PORTF|=(1<<6); #define L20 PORTE&=~(1<<0); #define H20 PORTE|=(1<<0); #define L21 PORTE&=~(1<<5); #define H21 PORTE|=(1<<5); #define L22 PORTE&=~(1<<6); #define H22 PORTE|=(1<<6); #define L23 PORTE&=~(1<<4); #define H23 PORTE|=(1<<4); #define L24 PORTE&=~(1<<3); #define H24 PORTE|=(1<<3); #define L25 PORTE&=~(1<<2); #define H25 PORTE|=(1<<2); #define L26 PORTC&=~(1<<5); #define H26 PORTC|=(1<<5); #define L27 PORTC&=~(1<<4); #define H27 PORTC|=(1<<4); #define L28 PORTC&=~(1<<3); #define H28 PORTC|=(1<<3); #define L29 PORTC&=~(1<<2); #define H29 PORTC|=(1<<2); #define L30 PORTG&=~(1<<1); #define H30 PORTG|=(1<<1); #define L31 PORTG&=~(1<<0); #define H31 PORTG|=(1<<0); #define L32 PORTD&=~(1<<0); #define H32 PORTD|=(1<<0); #define L33 PORTB&=~(1<<7); #define H33 PORTB|=(1<<7); #define L34 PORTB&=~(1<<2); #define H34 PORTB|=(1<<2); #define L35 PORTB&=~(1<<0); #define H35 PORTB|=(1<<0); #define L36 PORTB&=~(1<<1); #define H36 PORTB|=(1<<1); #define L37 PORTE&=~(1<<1); #define H37 PORTE|=(1<<1); #define L38 PORTE&=~(1<<7); #define H38 PORTE|=(1<<7); #define L39 PORTC&=~(1<<1); #define H39 PORTC|=(1<<1); #define L40 PORTC&=~(1<<0); #define H40 PORTC|=(1<<0); #define L41 PORTD&=~(1<<7); #define H41 PORTD|=(1<<7); #define L42 PORTD&=~(1<<6); #define H42 PORTD|=(1<<6); #define L43 PORTD&=~(1<<5); #define H43 PORTD|=(1<<5); #define L44 PORTD&=~(1<<4); #define H44 PORTD|=(1<<4); #define L45 PORTD&=~(1<<3); #define H45 PORTD|=(1<<3); #define L46 PORTD&=~(1<<2); #define H46 PORTD|=(1<<2); #define L47 PORTD&=~(1<<1); #define H47 PORTD|=(1<<1); #define L48 PORTG&=~(1<<4); #define H48 PORTG|=(1<<4); #define L49 PORTG&=~(1<<3); #define H49 PORTG|=(1<<3); #define L50 PORTB&=~(1<<6); #define H50 PORTB|=(1<<6); #define L51 PORTB&=~(1<<5); #define H51 PORTB|=(1<<5); #define L52 PORTB&=~(1<<4); #define H52 PORTB|=(1<<4); #define L53 PORTB&=~(1<<3); #define H53 PORTB|=(1<<3); //Начальная настройка при старте програмы. //Выполняется каждый раз, при включении устройства или после сброса. //Гасим все светодиоды на всех портах. void setup() { DDRA |= 0xFF; PORTA = 0xFF; DDRB |= 0xFF; PORTB = 0xFF; DDRC |= 0xFF; PORTC = 0xFF; DDRD |= 0xFF; PORTD = 0xFF; DDRE |= 0xFF; PORTE = 0xFF; DDRF |= 0xFF; PORTF = 0xFF; DDRG |= 0xFF; PORTG = 0xFF; } //Тело программы. //Обычно, организовано в виде бесконечного цикла "петли" (loop). //Эта петля повторяется бесконечно. //Нашими простейшими макросами: //L(номер светодиода) - зажигаем светодиод. //H(номер светодиода) - гасим светодиод. //используем функцию delay(значение в миллисекундах) для организации задержки. void loop() { // Обращение напрямую к порту ввода/вывода - позволяет значительно сократить код, оперируя сразу всеми битами порта. PORTA = 0x00; PORTB = 0x00; PORTC = 0x00; PORTD = 0x00; PORTE = 0x00; PORTF = 0x00; PORTG = 0x00; delay(500); PORTA = 0xFF; PORTB = 0xFF; PORTC = 0xFF; PORTD = 0xFF; PORTE = 0xFF; PORTF = 0xFF; PORTG = 0xFF; delay(500); }