R2A15220FP datasheet продолжение старой темы.

Efim
Offline
Зарегистрирован: 04.05.2018

Хотелось бы закончить начатое в старой теме но т.к. местные флудеры ее зафлудили и она была заблокирована то создаю новую.

Предыстория такая: Было необходимо создать инструмент для реверс инжиниринга r2a15220fp, это микросхема широко применялась/применяется в ресиверах японского производства.

И так собственно сам даташит Тык!

Немного об инструменте который применялся для реверса данной микросхемы.

Управление производится из монитора порта arduino, но лучше использовать Terminal1.9b, там можно назначить макросы для быстрого управления программой.

Собственно само управление простое, пишем в консоль команды и наблюдаем за происходящим.

Пишем команды в нижнем регистре, все значения в десятичном представлении.

r - Запуск авто режима перебора и отправки в SPI данных 

s - Остановка авто режима

d - В авто режиме данные будут уменьшатся на заданное значение

i - В авто режиме данные будут увеличиваться на заданное значение

t**** - (где **** значение от 0000...9999 миллисекунд) Время задержки между отправками пакетов в SPI

b** - (где ** значение от 01...32) Количество бит данных выводимых через SPI

q** - (где ** значение от 01...32) Начальный бит с которого будет стартовать авто режим

m********** - (где ********** значение от 0000000001...4294967295) Задаем маску для изменения сразу нескольких бит одновременно в авто режиме

0...4294967295 - Ну и собственно десятичное число для записи в регистр и отправки в SPI (можно писать сразу после всех выше описаных команд)

Все значения можно менять на лету и в любой последовательности. По умолчанию 8 пин MOSI, 9-SCK.

Ну и конечно сам скетч.


//определяем пины SPI
#define MOSI_PIN PB0  // MOSI PORTB.0 (Pin 8 Arduino)
#define SCK_PIN  PB1  // CLK PORTB.1  (Pin 9 Arduino)

unsigned long bitmask = 1;        // битовая маска для возведения в степень
unsigned long recievedByte2 = 0;  // промежуточная переменная для хранения принятого из Serial
unsigned long recievedByte3 = 0;  // переменная для хранения данных для отправки в SPI
unsigned int timeDelay = 1000;    // Значение задержки при выводе в автоматическом режиме
boolean dataOutFlag = false;      // Флаг готовности данных к выводу через SPI и Serial
boolean autoStart = false;        // Флаг авто сканирования 
boolean incDec = false;           // Флаг инкремента либо декремента
byte bitIncDec = 1;               // Начальный бит для авто режима
byte byteSerialIn = 0;            // определяем переменную для получаемого байта из Serial
byte bitNumber = 16;              // Переменная для хранения количества бит передаваемых через SPI


void setup() {  
  Serial.begin(115200);   //инициализируем последовательное соединение  
  pinMode(9, OUTPUT);  
  pinMode(8, OUTPUT);
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);  
}  

void loop()
{
 while (Serial.available())                                  // Если есть доступные данные то читаем
  { 
    byteSerialIn = Serial.read();                            // Сохраняем принятые данные в переменную            
    if (dataOutFlag == false) menu();                        // Если мы приняли первый байт то проверяем есть ли в нем информация о изминении режима (r,s,d,i,t,b,q)     
    if (byteSerialIn > 47 && byteSerialIn < 58)              // Проверяем не содержит ли текущий байт цифр (0...9)
      {
       recievedByte2 = recievedByte2*10 + byteSerialIn -'0'; // Заполняем регистр для передачи данных
       recievedByte3 = recievedByte2;                        // Копируем в регистр для вывода
      }                                 
      delay(100);                                             // Задержка для чтения второго байта     
      dataOutFlag=true;                                       // Первый байт принят               
  }    
        
 if(Serial.available() == 0 && dataOutFlag)    // Если данные приняты по Serial и готовы к отправке
   {    
    dataout();                                 // Выводим данные на SPI
    infoOutSerial();                           // Выводим информацию в терминал
    byteSerialIn = 0;                          // Обнуляем промежуточные переменные
    recievedByte2 = 0;        
    dataOutFlag=false;                         // Данные отправлены
   }
 if (Serial.available() == 0 && autoStart)     // Если включен режим авто то запускаем    
   {    
    if (incDec) recievedByte3 -=bitmask;       // - к текущему значению байта для вывода в SPI
    else recievedByte3 += bitmask;             // + к текущему значению байта для вывода в SPI
    dataout();                                 // Выводим данные на SPI
    infoOutSerial();                           // Выводим информацию в терминал
    delay(timeDelay);                          // Формируем задержку для авто режима      
   } 
  
}

void menu()                                    // Проверяем какой режим выбран
{
 switch (byteSerialIn) 
        {
    case 98:                                   // Если символ 'b' то принимаем еще два байта значения
         bitNumber = 0;
         for (byte b=0; b<2; b++)
         {
         delay(100);
         bitNumber = bitNumber*10 + Serial.read() -'0';
         }         
      break;
    case 113:                                  // Если символ 'q' то принимаем еще два байта значения
         bitIncDec = 0;
         for (byte b=0; b<2; b++)
         {
         delay(100);
         bitIncDec = bitIncDec*10 + Serial.read() -'0';
         }
         bitmask=1;
         for (byte b=(bitIncDec-1); b!=0; b--)
         {
          bitmask <<= 1;         
         }
      break;
    case 100:                                  // Если символ 'd' 
         incDec = true;                        // то в режиме авто данные в SPI будут уменьшаться                 
      break;
    case 105:                                  // Если символ 'i'
         incDec = false;                       // то в режиме авто данные в SPI будут увеличиваться
      break;
    case 109:                                  // Если символ 'm' то принимаем еще 11 байта значения
         bitmask = 0;
         for (byte b=0; b<10; b++)
         {
         delay(100);
         bitmask = bitmask*10 + Serial.read() -'0';
         }
         bitIncDec = 0;
         
      break;
    case 114:                                  // Если символ 'r'
         autoStart = true;                     // то включаем авто режим               
      break;
    case 115:                                  // Если символ 's'
         autoStart = false;                    // то выключаем авто режим                
      break;
    case 116:                                  // Если символ 't' то принимаем еще 4 байта значения
         timeDelay = 0;
         for (byte b=0; b<4; b++)
         {
         delay(100);
         timeDelay = timeDelay*10 + Serial.read() -'0';
         }                  
      break;     
        } 
}

void infoOutSerial()                            // Выводим данные в Serial
{
        Serial.print("BIN");                       
        Serial.print("-");
        print_binary((recievedByte3>>16),16);
        Serial.print("_");
        print_binary(recievedByte3,16);    
        Serial.print("  ");
        Serial.print("HEX");
        Serial.print("-");
        print_hex((recievedByte3>>16), 16);
        Serial.print("_");
        print_hex(recievedByte3, 16);
        Serial.print("  ");
        Serial.print("DEC");
        Serial.print("-");    
        Serial.print(recievedByte3,DEC);
        Serial.print("\t");
        Serial.print("TrBit");
        Serial.print("-");
        Serial.print(bitNumber,DEC);
        if (incDec)
        {
        Serial.print("  ");
        Serial.print("Auto--");            
        }
        else
        {
         Serial.print("  ");
         Serial.print("Auto++"); 
        }
        Serial.print("  ");
        Serial.print("Time ms");
        Serial.print("-");
        Serial.print(timeDelay,DEC);
        Serial.print("  ");
        Serial.print("StartBit");
        Serial.print("-");
        if (bitIncDec==0) Serial.print("Eigenvalue.");
        else Serial.print(bitIncDec,DEC);
        Serial.println();        
}

void dataout()                                              // Выводим данные в SPI
{   
    for (byte i=(bitNumber-1); i!=255; i--)                 // Определяем количество бит данных (bitNumber-1)
    {        
        if(recievedByte3&(1UL<<i)) PORTB |= (1<<MOSI_PIN);  // Если бит (i) равен 1 то устанавливаем бит в регистре PORTB.0 (MOSI)
        else PORTB &= ~(1<<MOSI_PIN);                       // Иначе сбрасываем бит в регистре PORTB.0 (MOSI)
        delayMicroseconds(2);                               // Формируем задержку для CLK
        PORTB |= (1<<SCK_PIN);                              // Устанавливаем бит на шине CLK (PORTB.1)
        delayMicroseconds(2);
        PORTB &= ~(1<<MOSI_PIN);                            // Сбрасываем бит в регистре PORTB.0 (MOSI)
        if (i==0)                                           // Проверяем не является ли текущий бит младшим
        {                                                   // Если бит младший:                                                            
          PORTB |= (1<<MOSI_PIN);                           // формируем защелку (устанавливаем бит в PORTB.0)
          delayMicroseconds(2);                             // формируем задержку для защелки
        } 
        else                                                // Если бит (i) не является младшим
        {
          delayMicroseconds(2);                             // Формируем задержку для CLK
        }        
        PORTB &= ~(1<<SCK_PIN);                             // Сбрасываем бит на шине CLK (PORTB.1)  
    }    
    delayMicroseconds(2);                                   // формируем задержку для сброса защелки
    PORTB &= ~(1<<MOSI_PIN);                                // Сбрасываем защелку PORTB.0 (MOSI)
}


void print_binary(int v, int num_places)       // Вывод BIN
{
    int mask=0, n;
    for (n=1; n<=num_places; n++)
    {
        mask = (mask << 1) | 0x0001;
    }
    v = v & mask;  // truncate v to specified number of places
    while(num_places)
    {
        if (v & (0x0001 << num_places-1))
        {
             Serial.print("1");
        }
        else
        {
             Serial.print("0");
        }
        --num_places;
        if(((num_places%4) == 0) && (num_places != 0))
        {
            Serial.print("_");
        }
    }
}

void print_hex(int v, int num_places)      // Вывод HEX
{
    int mask=0, n, num_nibbles, digit;
    for (n=1; n<=num_places; n++)
    {
        mask = (mask << 1) | 0x0001;
    }
    v = v & mask; // truncate v to specified number of places
    num_nibbles = num_places / 4;
    if ((num_places % 4) != 0)
    {
        ++num_nibbles;
    }
    do
    {
        digit = ((v >> (num_nibbles-1) * 4)) & 0x0f;
        Serial.print(digit, HEX);
    } while(--num_nibbles);

}
Efim
Offline
Зарегистрирован: 04.05.2018

https://drive.google.com/file/d/1549AUZB0ob-ALyLVXwvgwXOCnW8LoZi3/view?usp=sharing обновил ссылку на файл даташита.

Небольшая программа для согласования digital платы от RX-V475 c main от RX-V371.

Вход SPI 11-MOSI пин и 13-CLK (к этим пинам подключаем плату digital). Выход 8-MOSI пин и 9-CLK (Эти выводы подключаем к R2A).

Arduino 16 мГц. питание от 3,3 вольт для исключения согласования уровней.

Все основные функции работают, позже дополню код для активации выходов AV.

Код:

#define MOSI_PIN_1 PB0  // MOSI PORTB.0 (Pin 8 Arduino)
#define SCK_PIN_1  PB1  // CLK PORTB.1  (Pin 9 Arduino)

//определяем пины SPI IN
#define MOSI_PIN_2 11 
#define MISO_PIN_2 12 
#define SCK_PIN_2  13
#define SS_PIN_2 10


unsigned long sentByte;     // Буфер для отправки в Soft SPI 1
int recievedByte;           // Переменная принятого байта SPI 2
byte buf[100][2];           // Буфер принятых данных от контроллера на 200 байт
                             // Флаги окончания записи в ячейку буфера
boolean buflag[100] ={ false,false,false,false,false,
false,false,false,false,false,false,false,false,false,
false,false,false,false,false,false,false,false,false,
false,false,false,false,false,false,false,false,false,
false,false,false,false,false,false,false,false,false,
false,false,false,false,false,false,false,false,false,
false,false,false,false,false,false,false,false,false,
false,false,false,false,false,false,false,false,false,
false,false,false,false,false,false,false,false,false,
false,false,false,false,false,false,false,false,false,
false,false,false,false,false,false,false,false,false,
false,false,false,false,false };                
volatile byte posW = 0;     // Текущяя позиция записи в буфере
byte posR = 0;              // Текущяя позиция чтения из буфера

void dataout();             // Прототипы фунуций
void dataSaveOut ();

byte spi_receive();
void processingOfReceivedData ();
void print_binary(unsigned int v, int num_places);
                                                       // Тут хранятся предыдющие значения буфера отправки по адресам согласно даташита
unsigned long prevCond0 = B0;         //  -----        
unsigned long prevCond1 = 16385;         // D0-D3 inpet main, D4-D7 input sub,D8-D9 L\R Vol input, D15-D18 bass, D20 Rec I\O, D21-D23 address
unsigned long prevCond2 = B10;        // D0-D7 FLch Vol (0..-95dB), D8-D14 FLch Vol (0..+42dB), D15-D18 treble, D21-D23 address
unsigned long prevCond3 = B11;        // D0-D7 FRch Vol (0..-95dB), D8-D14 FRch Vol (0..+42dB), D15-D19 Rec out ON, D20 Rec M\S, D21-D23 address
unsigned long prevCond4 = B100;       // D0-D8 Cch Vol (-95..+42dB), D9-D17 SWch Vol (-95..+42dB), D18 C\SW input, D19-D20 ATT, D21-D23 address
unsigned long prevCond5 = B101;       // D0-D8 SLch Vol (-95..+42dB), D9-D17 SRch Vol (-95..+42dB), D18-D19 SL\SR input, D21-D23 address
unsigned long prevCond6 = B100110;       // D18 Bypass\Tone, D19 Tone + Mix, D21-D23 address
unsigned long prevCond7 = B111;       //  -----
												// Тут хранятся флаги для отправки предыдющего значения 
boolean flag0 = false;
boolean flag1 = false;
boolean flag2 = false;
boolean flag3 = false;
boolean flag4 = false;
boolean flag5 = false;
boolean flag6 = false;
boolean flag7 = false;

volatile boolean flagOver = false; // Флаг переполнения буфера
volatile boolean flagBuf = false;  // Флаг ячейки


void setup()
{  
  Serial.begin(250000); 
  SREG |= (1<<7);              // Включаем глобальные прерывания
  SPCR |= (1<<SPE)|(1<<SPIE);  // Включаем SPI Slave и прерывание по SPI 2  

  pinMode(9, OUTPUT);         //Определяем пины для работы с Soft SPI 1 OUT
  pinMode(8, OUTPUT);
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  
  pinMode(MOSI_PIN_2, INPUT);   //Определяем пины для работы с SPI IN
  pinMode(MISO_PIN_2, OUTPUT);
  pinMode(SCK_PIN_2, INPUT);
  pinMode(SS_PIN_2, INPUT);
}

void loop()
{
  
   if (buflag[posR])  // Читаем буфер пока он полный 
    {
     recievedByte = buf[posR][0]<<8|buf[posR][1];
     Serial.print("recievedByte= ");
     Serial.println(recievedByte,DEC);
     processingOfReceivedData ();
     buflag[posR] = false;
     posR++;
     if (posR>=100) posR = 0;
    }        
  
}


ISR (SPI_STC_vect) // Прерывание по приему данных SPI
{
  byte c = SPDR;
  if (posW>=100) posW = 0;
  if (flagBuf)
  {
    buf[posW][1] = c;
    buflag[posW++] = true;
  }
  else
  {
    buf [posW][0] = c;
  }
  flagBuf = !flagBuf;   
}

void processingOfReceivedData ()                                              // функция обработки принятых данных SPI 2
{
  
  byte address = 0x0F & recievedByte;                                         // Получаем адрес принятого байта
  unsigned long data1 = 0;                                                    // Переменная для хранения данных 8 бит
  unsigned long data2 = 0;                                                     // Переменная для хранения данных 9 бит
  unsigned long mask=0xFFFFF;
  switch (address)                                                            // Проверяем какой функции соответствует принятый адрес
  {
    case 0:                                                                   // Обработка селектора входов (Main) и выходов (REC)    
    data1 = recievedByte>>10;                                                 // Получаем данные о выбраном входе    
    mask=0xFFFFF;    
    if (data1 == 5)  prevCond1 = (prevCond1&mask)|((data1-1)<<20);            // Если выбран 5 вход то включаем IN 5 в D0-D3 по адресу 0х1
    if (data1 == 3)  prevCond1 = (prevCond1&mask)|((data1-1)<<20);            // Если выбран 3 вход то включаем IN 3 в D0-D3 по адресу 0х1
    if (data1 == 1)  prevCond1 = (prevCond1&mask)|(data1<<20);                // Если выбран 1 вход то включаем IN 2 в D0-D3 по адресу 0х1
    if (data1 == 9)  prevCond1 = (prevCond1&mask)|((data1+5)<<20);            // Если выбран 9 вход то включаем IN 13 в D0-D3 по адресу 0х1
    if (data1 == 10) prevCond1 = (prevCond1&mask)|((data1+3)<<20);            // Если выбран 10 вход то включаем IN 12 в D0-D3 по адресу 0х1
    if (data1 == 12) prevCond1 = (prevCond1&mask)|((data1-12)<<20);           // Если выбран 12 вход то включаем IN 1 в D0-D3 по адресу 0х1
    flag1 = true;    
    break;
    case 1:
    break;
    case 2:                                                                   // Обработка селектора входов (FL\FR) и ADC ATT    
    data1 = recievedByte>>14;                                                 // Получаем данные о выбраном входе     
    if (data1 == 3)  prevCond1 |= (1UL<<14);                                    // Если выбран Multi2 вход то включаем Multi1 в D8-D9 по адресу 0х1
    if (data1 == 1)  prevCond1 &=~(1UL<<14);                                    // Если выбран Main вход то включаем Main в D8-D9 по адресу 0х1
    data1 = 0x7 & (recievedByte>>4);                                          // Получаем данные о ADC ATT   
    mask=0xFFFFE7;
    if (data1 == 1)  prevCond4 = (prevCond4&mask)|((data1-1)<<3);             // Если ATT 0dB то устанавливаем ATT 0dB в D19-D20 по адресу 0х4
    if (data1 == 2)  prevCond4 = (prevCond4&mask)|((data1-1)<<3);             // Если ATT -6dB то устанавливаем ATT -6dB в D19-D20 по адресу 0х4
    if (data1 == 4)  prevCond4 = (prevCond4&mask)|((data1-2)<<3);             // Если ATT -7,5dB то устанавливаем ATT -12dB в D19-D20 по адресу 0х4
    if (data1 == 6)  prevCond4 = (prevCond4&mask)|((data1-3)<<3);             // Если ATT -12dB то устанавливаем ATT -18dB в D19-D20 по адресу 0х4
    flag1 = true;
    flag4 = true;
    break;
    case 3:                                                                   // Обработка громкости каналов
    data1 = recievedByte>>13;                                                 // Получаем данные о выбраном канале
    data2 = ((0x1FF0 & recievedByte)>>4);                                     // Получаем значение громкости    
    if (data1 == 0)                                                           // Если выбраный канал FR
    { 
      mask=0xFFFF;     
      if (data2 < 191) prevCond3 = (prevCond3&mask)|(data2<<16);              // Если громкость от 0..-95 то записываем без изменений в D0-D7 по адресу 0х3
      mask=0xFF01FF;
      if (data2 > 256&&data2 < 305) prevCond3 = (prevCond3&mask)|((data2-256)<<9);         // Если громкость от 0..+24 то записываем с учетом согласования (-256) в D8-D14 по адресу 0х3
      flag3 = true;
    }
    if (data1 == 1)                                                           // Если выбраный канал FL
    {
      mask=0xFFFF;      
      if (data2 < 191) prevCond2 = (prevCond2&mask)|(data2<<16);              // Если громкость от 0..-95 то записываем без изменений в D0-D7 по адресу 0х2
      mask=0xFFFF;
      if (data2 > 256&&data2 < 305) prevCond2 = (prevCond2&mask)|((data2-256)<<9);         // Если громкость от 0..+24 то записываем с учетом согласования (-256) в D8-D14 по адресу 0х2
      flag2 = true; 
    }
    if (data1 == 2)                                                           // Если выбраный канал SW
    { 
      mask=0xFF803F;     
      if (data2 < 191) prevCond4 = (prevCond4&mask)|(data2<<6);               // Если громкость от 0..-95 то записываем без изменений в D9-D17 по адресу 0х4
      if (data2 > 256&&data2 < 305) prevCond4 = (prevCond4&mask)|((data2+128)<<6);         // Если громкость от 0..+24 то записываем с учетом согласования (+128) в D9-D17 по адресу 0х4
      flag4 = true; 
    }
    if (data1 == 3)                                                           // Если выбраный канал C
    { 
      mask=0x7FFF;     
      if (data2 < 191) prevCond4 = (prevCond4&mask)|(data2<<15);              // Если громкость от 0..-95 то записываем без изменений в D0-D8 по адресу 0х4
      if (data2 > 256&&data2 < 305) prevCond4 = (prevCond4&mask)|((data2+128)<<15);        // Если громкость от 0..+24 то записываем с учетом согласования (+128) в D9-D17 по адресу 0х4
      flag4 = true; 
    }
    if (data1 == 4)                                                           // Если выбраный канал SR
    {   
      mask=0xFF803F;  
      if (data2 < 191) prevCond5 = (prevCond5&mask)|(data2<<6);               // Если громкость от 0..-95 то записываем без изменений в D9-D17 по адресу 0х5
      if (data2 > 256&&data2 < 305) prevCond5 = (prevCond5&mask)|((data2+128)<<6);         // Если громкость от 0..+24 то записываем с учетом согласования (+128) в D9-D17 по адресу 0х5
      flag5 = true; 
    }
    if (data1 == 5)                                                           // Если выбраный канал SL
    {  
      mask=0x7FFF;    
      if (data2 < 191) prevCond5 = (prevCond5&mask)|(data2<<15);              // Если громкость от 0..-95 то записываем без изменений в D0-D8 по адресу 0х5
      if (data2 > 256&&data2 < 305) prevCond5 = (prevCond5&mask)|((data2+128)<<15);        // Если громкость от 0..+24 то записываем с учетом согласования (+128) в D9-D17 по адресу 0х5
      flag5 = true; 
    }
    break;
    case 8:                                                                   // Обработка Tone и Bass
    data1 = recievedByte>>15;                                                 // Получаем значение Tone
    if (data1 == 0)  prevCond6 &= ~(1UL<<6);                                    // Если выбран Bypass то включаем Bypass в D18 по адресу 0х6
    if (data1 == 1)  prevCond6 |= (1UL<<6);                                     // Если выбран Tone то включаем Tone в D18 по адресу 0х6
    data1 = 0x1F & (recievedByte>>4);                                         // Получаем значение Bass
    mask=0xFFFE1F;
    if (data1==0) prevCond1 = (prevCond1&mask)|(data1<<5);                    // Если значение 0 то пишем без изменений в D15-D18 по адресу 0х1
    if ((data1>0&&data1<7)||(data1>=17&&data1<23)){
      if (data1%2==0){
       prevCond1 = (prevCond1&mask)|((data1/2)<<5);                           // Преобразуем согласно даташитов и пишем в D15-D18 по адресу 0х1
      }
    }
    if (data1>7&&data1<11) prevCond1 = (prevCond1&mask)|((data1-3)<<5);        // Преобразуем согласно даташитов и пишем в D15-D18 по адресу 0х1     
    if (data1>23&&data1<27) prevCond1 = (prevCond1&mask)|((data1-11)<<5);      // Преобразуем согласно даташитов и пишем в D15-D18 по адресу 0х1
    flag6 = true;
    flag1 = true;    
    break;
    case 9:                                                                   // Обработка Tone+Mix и Treble
    data1 = recievedByte>>15;                                                 // Получаем значение Tone+Mix
    if (data1 == 0)  prevCond6 &= ~(1UL<<5);                                    // Если выбран Tone то включаем Tone в D19 по адресу 0х6
    if (data1 == 1)  prevCond6 |= (1UL<<5);                                     // Если выбран Tone+Mix то включаем Tone+Mix в D19 по адресу 0х6
    data1 = 0x1F & (recievedByte>>4);                                         // Получаем значение Treble
    mask=0xFFFE1F;
    if (data1==0) prevCond2 = (prevCond2&mask)|(data1<<5);                    // Если значение 0 то пишем без изменений в D15-D18 по адресу 0х2
    if ((data1>0&&data1<7)||(data1>=17&&data1<23)){     
      if (data1%2==0){
       prevCond2 = (prevCond2&mask)|((data1/2)<<5);                           // Преобразуем согласно даташитов и пишем в D15-D18 по адресу 0х2
      }
    }
    if (data1>7&&data1<11) prevCond2 = (prevCond2&mask)|((data1-3)<<5);       // Преобразуем согласно даташитов и пишем в D15-D18 по адресу 0х2     
    if (data1>23&&data1<27) prevCond2 = (prevCond2&mask)|((data1-11)<<5);     // Преобразуем согласно даташитов и пишем в D15-D18 по адресу 0х2
    flag6 = true;
    flag2 = true;
    break;    
  }
  dataSaveOut();
}

void dataSaveOut (){
  if (flag0){
    sentByte = prevCond0;    
    Serial.print("sentByte= ");
    Serial.println(sentByte,DEC);
    dataout();
    flag0 = false;
  }
  if (flag1){
    sentByte = prevCond1;    
    Serial.print("sentByte= ");
    Serial.println(sentByte,DEC);
    dataout();
    flag1 = false;
  }
  if (flag2){
    sentByte = prevCond2;    
    Serial.print("sentByte= ");
    Serial.println(sentByte,DEC);
    dataout();
    flag2 = false;
  }
  if (flag3){
    sentByte = prevCond3;    
    Serial.print("sentByte= ");
    Serial.println(sentByte,DEC);
    dataout();
    flag3 = false;
  }
  if (flag4){
    sentByte = prevCond4;    
    Serial.print("sentByte= ");
    Serial.println(sentByte,DEC);
    dataout();
    flag4 = false;
  }
  if (flag5){
    sentByte = prevCond5;    
    Serial.print("sentByte= ");
    Serial.println(sentByte,DEC);
    dataout();
    flag5 = false;
  }
  if (flag6){
   sentByte = prevCond6;   
   Serial.print("sentByte= ");
   Serial.println(sentByte,DEC);
   dataout();
   flag6 = false; 
  }
  if (flag7){
   sentByte = prevCond7;   
   Serial.print("sentByte= ");
   Serial.println(sentByte,DEC);
   dataout();
   flag7 = false; 
  } 
  Serial.println(); 
}

void dataout()                                                // функция для отправки байта в SPI 1
{   
    for (byte i=23; i!=255; i--)                              // (24 бита) количество бит данных для вывода 
    {        
        if(sentByte&(1UL<<i)) PORTB |= (1<<MOSI_PIN_1);       // Если бит (i) равен 1 то устанавливаем бит в регистре PORTB.0 (MOSI)
        else PORTB &= ~(1<<MOSI_PIN_1);                       // Иначе сбрасываем бит в регистре PORTB.0 (MOSI)
        delayMicroseconds(2);                                 // Формируем задержку для CLK
        PORTB |= (1<<SCK_PIN_1);                              // Устанавливаем бит на шине CLK (PORTB.1)
        delayMicroseconds(2);
        PORTB &= ~(1<<MOSI_PIN_1);                            // Сбрасываем бит в регистре PORTB.0 (MOSI)
        if (i==0)                                             // Проверяем не является ли текущий бит младшим
        {                                                     // Если бит младший:                                                            
          PORTB |= (1<<MOSI_PIN_1);                           // формируем защелку (устанавливаем бит в PORTB.0)
          delayMicroseconds(2);                               // формируем задержку для защелки
        } 
        else                                                  // Если бит (i) не является младшим
        {
          delayMicroseconds(2);                               // Формируем задержку для CLK
        }        
        PORTB &= ~(1<<SCK_PIN_1);                             // Сбрасываем бит на шине CLK (PORTB.1)  
    }    
    delayMicroseconds(2);                                     // формируем задержку для сброса защелки
    PORTB &= ~(1<<MOSI_PIN_1);                                // Сбрасываем защелку PORTB.0 (MOSI)
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Efim, не вполне понтно, что за ардуина у вас?

Почему вы одни пины обозначаете PB0 PB1. а другие - номерами?

#define MOSI_PIN_1 PB0  // MOSI PORTB.0 (Pin 8 Arduino)
#define SCK_PIN_1  PB1  // CLK PORTB.1  (Pin 9 Arduino)

//определяем пины SPI IN
#define MOSI_PIN_2 11 
#define MISO_PIN_2 12 
#define SCK_PIN_2  13
#define SS_PIN_2 10

Если это обычная Про мини или Нано(на что намекают типичные для Атмеги168/328 номера пинов )- я не вполне понимаю, как работает такая конструкция:

PORTB |= (1<<SCK_PIN_1);

если  SCK_PIN_1  - это PB1

Или для обычной Атмеги тоже можно образаться к портам по символическим именам?

Efim
Offline
Зарегистрирован: 04.05.2018

b707

Обычная Про мини, а конструкция такая используется для прямого обращения к порту т.к. если пользоватся стандартными средствами ардуино то скорость падает в разы. Просто плата работает в режиме буфера и необходима большая скорость обработки и отправки, прием идет на скорости 180 кГц.

 

b707
Offline
Зарегистрирован: 26.05.2017

Не знал, что в Про мини тоже определены макросы типа PB0 PB1. Или вы их сами где-то описали?

Efim
Offline
Зарегистрирован: 04.05.2018

b707

Нет, ничего нигде не описывал, это вроде как стандартные средства языка СИ для данного микроконтроллера. Все брал из даташита на микросхему.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Стандартные средства языка СИ не при чём. PB0, PB1 и т.д. определены где-то в заголовочных файлах.

Efim
Offline
Зарегистрирован: 04.05.2018

Jeka_M

Не хотел углубляться но вы правы! Все это определено в файлах portpin.hio.h и iom328p.h в моем случае. Файлы лежат по пути C:\arduino-1.8.5\hardware\tools\avr\avr\include\avr. Среда ардуино подключает эти файлы автоматически при выборе платы. Поэтому я и указал что это стандартные средства для данного микроконтроллера. Вообще это все сделано для удобства чтоб не путаться. А товарищу выше разъяснять это нету желания т.к. он наговорил мне кучу гадостей, пел какой он крутой прогер, а такие простые вещи не знает.

/* Copyright (c) 2007 Atmel Corporation
   All rights reserved.

   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions are met:

   * Redistributions of source code must retain the above copyright
     notice, this list of conditions and the following disclaimer.

   * Redistributions in binary form must reproduce the above copyright
     notice, this list of conditions and the following disclaimer in
     the documentation and/or other materials provided with the
     distribution.

   * Neither the name of the copyright holders nor the names of
     contributors may be used to endorse or promote products derived
     from this software without specific prior written permission.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE. 
*/

/* $Id: iom328p.h 2444 2014-08-11 22:10:47Z joerg_wunsch $ */

/* avr/iom328p.h - definitions for ATmega328P. */

/* This file should only be included from <avr/io.h>, never directly. */

#ifndef _AVR_IO_H_
#  error "Include <avr/io.h> instead of this file."
#endif

#ifndef _AVR_IOXXX_H_
#  define _AVR_IOXXX_H_ "iom328p.h"
#else
#  error "Attempt to include more than one <avr/ioXXX.h> file."
#endif 


#ifndef _AVR_IOM328P_H_
#define _AVR_IOM328P_H_ 1

/* Registers and associated bit numbers */

#define PINB _SFR_IO8(0x03)
#define PINB0 0
#define PINB1 1
#define PINB2 2
#define PINB3 3
#define PINB4 4
#define PINB5 5
#define PINB6 6
#define PINB7 7

#define DDRB _SFR_IO8(0x04)
#define DDB0 0
#define DDB1 1
#define DDB2 2
#define DDB3 3
#define DDB4 4
#define DDB5 5
#define DDB6 6
#define DDB7 7

#define PORTB _SFR_IO8(0x05)
#define PORTB0 0
#define PORTB1 1
#define PORTB2 2
#define PORTB3 3
#define PORTB4 4
#define PORTB5 5
#define PORTB6 6
#define PORTB7 7

#define PINC _SFR_IO8(0x06)
#define PINC0 0
#define PINC1 1
#define PINC2 2
#define PINC3 3
#define PINC4 4
#define PINC5 5
#define PINC6 6

#define DDRC _SFR_IO8(0x07)
#define DDC0 0
#define DDC1 1
#define DDC2 2
#define DDC3 3
#define DDC4 4
#define DDC5 5
#define DDC6 6

#define PORTC _SFR_IO8(0x08)
#define PORTC0 0
#define PORTC1 1
#define PORTC2 2
#define PORTC3 3
#define PORTC4 4
#define PORTC5 5
#define PORTC6 6

#define PIND _SFR_IO8(0x09)
#define PIND0 0
#define PIND1 1
#define PIND2 2
#define PIND3 3
#define PIND4 4
#define PIND5 5
#define PIND6 6
#define PIND7 7

#define DDRD _SFR_IO8(0x0A)
#define DDD0 0
#define DDD1 1
#define DDD2 2
#define DDD3 3
#define DDD4 4
#define DDD5 5
#define DDD6 6
#define DDD7 7

#define PORTD _SFR_IO8(0x0B)
#define PORTD0 0
#define PORTD1 1
#define PORTD2 2
#define PORTD3 3
#define PORTD4 4
#define PORTD5 5
#define PORTD6 6
#define PORTD7 7

#define TIFR0 _SFR_IO8(0x15)
#define TOV0 0
#define OCF0A 1
#define OCF0B 2

#define TIFR1 _SFR_IO8(0x16)
#define TOV1 0
#define OCF1A 1
#define OCF1B 2
#define ICF1 5

#define TIFR2 _SFR_IO8(0x17)
#define TOV2 0
#define OCF2A 1
#define OCF2B 2

#define PCIFR _SFR_IO8(0x1B)
#define PCIF0 0
#define PCIF1 1
#define PCIF2 2

#define EIFR _SFR_IO8(0x1C)
#define INTF0 0
#define INTF1 1

#define EIMSK _SFR_IO8(0x1D)
#define INT0 0
#define INT1 1

#define GPIOR0 _SFR_IO8(0x1E)
#define GPIOR00 0
#define GPIOR01 1
#define GPIOR02 2
#define GPIOR03 3
#define GPIOR04 4
#define GPIOR05 5
#define GPIOR06 6
#define GPIOR07 7

#define EECR _SFR_IO8(0x1F)
#define EERE 0
#define EEPE 1
#define EEMPE 2
#define EERIE 3
#define EEPM0 4
#define EEPM1 5

#define EEDR _SFR_IO8(0x20)
#define EEDR0 0
#define EEDR1 1
#define EEDR2 2
#define EEDR3 3
#define EEDR4 4
#define EEDR5 5
#define EEDR6 6
#define EEDR7 7

#define EEAR _SFR_IO16(0x21)

#define EEARL _SFR_IO8(0x21)
#define EEAR0 0
#define EEAR1 1
#define EEAR2 2
#define EEAR3 3
#define EEAR4 4
#define EEAR5 5
#define EEAR6 6
#define EEAR7 7

#define EEARH _SFR_IO8(0x22)
#define EEAR8 0
#define EEAR9 1

#define _EEPROM_REG_LOCATIONS_ 1F2021

#define GTCCR _SFR_IO8(0x23)
#define PSRSYNC 0
#define PSRASY 1
#define TSM 7

#define TCCR0A _SFR_IO8(0x24)
#define WGM00 0
#define WGM01 1
#define COM0B0 4
#define COM0B1 5
#define COM0A0 6
#define COM0A1 7

#define TCCR0B _SFR_IO8(0x25)
#define CS00 0
#define CS01 1
#define CS02 2
#define WGM02 3
#define FOC0B 6
#define FOC0A 7

#define TCNT0 _SFR_IO8(0x26)
#define TCNT0_0 0
#define TCNT0_1 1
#define TCNT0_2 2
#define TCNT0_3 3
#define TCNT0_4 4
#define TCNT0_5 5
#define TCNT0_6 6
#define TCNT0_7 7

#define OCR0A _SFR_IO8(0x27)
#define OCR0A_0 0
#define OCR0A_1 1
#define OCR0A_2 2
#define OCR0A_3 3
#define OCR0A_4 4
#define OCR0A_5 5
#define OCR0A_6 6
#define OCR0A_7 7

#define OCR0B _SFR_IO8(0x28)
#define OCR0B_0 0
#define OCR0B_1 1
#define OCR0B_2 2
#define OCR0B_3 3
#define OCR0B_4 4
#define OCR0B_5 5
#define OCR0B_6 6
#define OCR0B_7 7

#define GPIOR1 _SFR_IO8(0x2A)
#define GPIOR10 0
#define GPIOR11 1
#define GPIOR12 2
#define GPIOR13 3
#define GPIOR14 4
#define GPIOR15 5
#define GPIOR16 6
#define GPIOR17 7

#define GPIOR2 _SFR_IO8(0x2B)
#define GPIOR20 0
#define GPIOR21 1
#define GPIOR22 2
#define GPIOR23 3
#define GPIOR24 4
#define GPIOR25 5
#define GPIOR26 6
#define GPIOR27 7

#define SPCR _SFR_IO8(0x2C)
#define SPR0 0
#define SPR1 1
#define CPHA 2
#define CPOL 3
#define MSTR 4
#define DORD 5
#define SPE 6
#define SPIE 7

#define SPSR _SFR_IO8(0x2D)
#define SPI2X 0
#define WCOL 6
#define SPIF 7

#define SPDR _SFR_IO8(0x2E)
#define SPDR0 0
#define SPDR1 1
#define SPDR2 2
#define SPDR3 3
#define SPDR4 4
#define SPDR5 5
#define SPDR6 6
#define SPDR7 7

#define ACSR _SFR_IO8(0x30)
#define ACIS0 0
#define ACIS1 1
#define ACIC 2
#define ACIE 3
#define ACI 4
#define ACO 5
#define ACBG 6
#define ACD 7

#define SMCR _SFR_IO8(0x33)
#define SE 0
#define SM0 1
#define SM1 2
#define SM2 3

#define MCUSR _SFR_IO8(0x34)
#define PORF 0
#define EXTRF 1
#define BORF 2
#define WDRF 3

#define MCUCR _SFR_IO8(0x35)
#define IVCE 0
#define IVSEL 1
#define PUD 4
#define BODSE 5
#define BODS 6

#define SPMCSR _SFR_IO8(0x37)
#define SELFPRGEN 0 /* only for backwards compatibility with previous
		     * avr-libc versions; not an official name */
#define SPMEN 0
#define PGERS 1
#define PGWRT 2
#define BLBSET 3
#define RWWSRE 4
#define SIGRD 5
#define RWWSB 6
#define SPMIE 7

#define WDTCSR _SFR_MEM8(0x60)
#define WDP0 0
#define WDP1 1
#define WDP2 2
#define WDE 3
#define WDCE 4
#define WDP3 5
#define WDIE 6
#define WDIF 7

#define CLKPR _SFR_MEM8(0x61)
#define CLKPS0 0
#define CLKPS1 1
#define CLKPS2 2
#define CLKPS3 3
#define CLKPCE 7

#define PRR _SFR_MEM8(0x64)
#define PRADC 0
#define PRUSART0 1
#define PRSPI 2
#define PRTIM1 3
#define PRTIM0 5
#define PRTIM2 6
#define PRTWI 7

#define __AVR_HAVE_PRR	((1<<PRADC)|(1<<PRUSART0)|(1<<PRSPI)|(1<<PRTIM1)|(1<<PRTIM0)|(1<<PRTIM2)|(1<<PRTWI))
#define __AVR_HAVE_PRR_PRADC
#define __AVR_HAVE_PRR_PRUSART0
#define __AVR_HAVE_PRR_PRSPI
#define __AVR_HAVE_PRR_PRTIM1
#define __AVR_HAVE_PRR_PRTIM0
#define __AVR_HAVE_PRR_PRTIM2
#define __AVR_HAVE_PRR_PRTWI

#define OSCCAL _SFR_MEM8(0x66)
#define CAL0 0
#define CAL1 1
#define CAL2 2
#define CAL3 3
#define CAL4 4
#define CAL5 5
#define CAL6 6
#define CAL7 7

#define PCICR _SFR_MEM8(0x68)
#define PCIE0 0
#define PCIE1 1
#define PCIE2 2

#define EICRA _SFR_MEM8(0x69)
#define ISC00 0
#define ISC01 1
#define ISC10 2
#define ISC11 3

#define PCMSK0 _SFR_MEM8(0x6B)
#define PCINT0 0
#define PCINT1 1
#define PCINT2 2
#define PCINT3 3
#define PCINT4 4
#define PCINT5 5
#define PCINT6 6
#define PCINT7 7

#define PCMSK1 _SFR_MEM8(0x6C)
#define PCINT8 0
#define PCINT9 1
#define PCINT10 2
#define PCINT11 3
#define PCINT12 4
#define PCINT13 5
#define PCINT14 6

#define PCMSK2 _SFR_MEM8(0x6D)
#define PCINT16 0
#define PCINT17 1
#define PCINT18 2
#define PCINT19 3
#define PCINT20 4
#define PCINT21 5
#define PCINT22 6
#define PCINT23 7

#define TIMSK0 _SFR_MEM8(0x6E)
#define TOIE0 0
#define OCIE0A 1
#define OCIE0B 2

#define TIMSK1 _SFR_MEM8(0x6F)
#define TOIE1 0
#define OCIE1A 1
#define OCIE1B 2
#define ICIE1 5

#define TIMSK2 _SFR_MEM8(0x70)
#define TOIE2 0
#define OCIE2A 1
#define OCIE2B 2

#ifndef __ASSEMBLER__
#define ADC     _SFR_MEM16(0x78)
#endif
#define ADCW    _SFR_MEM16(0x78)

#define ADCL _SFR_MEM8(0x78)
#define ADCL0 0
#define ADCL1 1
#define ADCL2 2
#define ADCL3 3
#define ADCL4 4
#define ADCL5 5
#define ADCL6 6
#define ADCL7 7

#define ADCH _SFR_MEM8(0x79)
#define ADCH0 0
#define ADCH1 1
#define ADCH2 2
#define ADCH3 3
#define ADCH4 4
#define ADCH5 5
#define ADCH6 6
#define ADCH7 7

#define ADCSRA _SFR_MEM8(0x7A)
#define ADPS0 0
#define ADPS1 1
#define ADPS2 2
#define ADIE 3
#define ADIF 4
#define ADATE 5
#define ADSC 6
#define ADEN 7

#define ADCSRB _SFR_MEM8(0x7B)
#define ADTS0 0
#define ADTS1 1
#define ADTS2 2
#define ACME 6

#define ADMUX _SFR_MEM8(0x7C)
#define MUX0 0
#define MUX1 1
#define MUX2 2
#define MUX3 3
#define ADLAR 5
#define REFS0 6
#define REFS1 7

#define DIDR0 _SFR_MEM8(0x7E)
#define ADC0D 0
#define ADC1D 1
#define ADC2D 2
#define ADC3D 3
#define ADC4D 4
#define ADC5D 5

#define DIDR1 _SFR_MEM8(0x7F)
#define AIN0D 0
#define AIN1D 1

#define TCCR1A _SFR_MEM8(0x80)
#define WGM10 0
#define WGM11 1
#define COM1B0 4
#define COM1B1 5
#define COM1A0 6
#define COM1A1 7

#define TCCR1B _SFR_MEM8(0x81)
#define CS10 0
#define CS11 1
#define CS12 2
#define WGM12 3
#define WGM13 4
#define ICES1 6
#define ICNC1 7

#define TCCR1C _SFR_MEM8(0x82)
#define FOC1B 6
#define FOC1A 7

#define TCNT1 _SFR_MEM16(0x84)

#define TCNT1L _SFR_MEM8(0x84)
#define TCNT1L0 0
#define TCNT1L1 1
#define TCNT1L2 2
#define TCNT1L3 3
#define TCNT1L4 4
#define TCNT1L5 5
#define TCNT1L6 6
#define TCNT1L7 7

#define TCNT1H _SFR_MEM8(0x85)
#define TCNT1H0 0
#define TCNT1H1 1
#define TCNT1H2 2
#define TCNT1H3 3
#define TCNT1H4 4
#define TCNT1H5 5
#define TCNT1H6 6
#define TCNT1H7 7

#define ICR1 _SFR_MEM16(0x86)

#define ICR1L _SFR_MEM8(0x86)
#define ICR1L0 0
#define ICR1L1 1
#define ICR1L2 2
#define ICR1L3 3
#define ICR1L4 4
#define ICR1L5 5
#define ICR1L6 6
#define ICR1L7 7

#define ICR1H _SFR_MEM8(0x87)
#define ICR1H0 0
#define ICR1H1 1
#define ICR1H2 2
#define ICR1H3 3
#define ICR1H4 4
#define ICR1H5 5
#define ICR1H6 6
#define ICR1H7 7

#define OCR1A _SFR_MEM16(0x88)

#define OCR1AL _SFR_MEM8(0x88)
#define OCR1AL0 0
#define OCR1AL1 1
#define OCR1AL2 2
#define OCR1AL3 3
#define OCR1AL4 4
#define OCR1AL5 5
#define OCR1AL6 6
#define OCR1AL7 7

#define OCR1AH _SFR_MEM8(0x89)
#define OCR1AH0 0
#define OCR1AH1 1
#define OCR1AH2 2
#define OCR1AH3 3
#define OCR1AH4 4
#define OCR1AH5 5
#define OCR1AH6 6
#define OCR1AH7 7

#define OCR1B _SFR_MEM16(0x8A)

#define OCR1BL _SFR_MEM8(0x8A)
#define OCR1BL0 0
#define OCR1BL1 1
#define OCR1BL2 2
#define OCR1BL3 3
#define OCR1BL4 4
#define OCR1BL5 5
#define OCR1BL6 6
#define OCR1BL7 7

#define OCR1BH _SFR_MEM8(0x8B)
#define OCR1BH0 0
#define OCR1BH1 1
#define OCR1BH2 2
#define OCR1BH3 3
#define OCR1BH4 4
#define OCR1BH5 5
#define OCR1BH6 6
#define OCR1BH7 7

#define TCCR2A _SFR_MEM8(0xB0)
#define WGM20 0
#define WGM21 1
#define COM2B0 4
#define COM2B1 5
#define COM2A0 6
#define COM2A1 7

#define TCCR2B _SFR_MEM8(0xB1)
#define CS20 0
#define CS21 1
#define CS22 2
#define WGM22 3
#define FOC2B 6
#define FOC2A 7

#define TCNT2 _SFR_MEM8(0xB2)
#define TCNT2_0 0
#define TCNT2_1 1
#define TCNT2_2 2
#define TCNT2_3 3
#define TCNT2_4 4
#define TCNT2_5 5
#define TCNT2_6 6
#define TCNT2_7 7

#define OCR2A _SFR_MEM8(0xB3)
#define OCR2_0 0
#define OCR2_1 1
#define OCR2_2 2
#define OCR2_3 3
#define OCR2_4 4
#define OCR2_5 5
#define OCR2_6 6
#define OCR2_7 7

#define OCR2B _SFR_MEM8(0xB4)
#define OCR2_0 0
#define OCR2_1 1
#define OCR2_2 2
#define OCR2_3 3
#define OCR2_4 4
#define OCR2_5 5
#define OCR2_6 6
#define OCR2_7 7

#define ASSR _SFR_MEM8(0xB6)
#define TCR2BUB 0
#define TCR2AUB 1
#define OCR2BUB 2
#define OCR2AUB 3
#define TCN2UB 4
#define AS2 5
#define EXCLK 6

#define TWBR _SFR_MEM8(0xB8)
#define TWBR0 0
#define TWBR1 1
#define TWBR2 2
#define TWBR3 3
#define TWBR4 4
#define TWBR5 5
#define TWBR6 6
#define TWBR7 7

#define TWSR _SFR_MEM8(0xB9)
#define TWPS0 0
#define TWPS1 1
#define TWS3 3
#define TWS4 4
#define TWS5 5
#define TWS6 6
#define TWS7 7

#define TWAR _SFR_MEM8(0xBA)
#define TWGCE 0
#define TWA0 1
#define TWA1 2
#define TWA2 3
#define TWA3 4
#define TWA4 5
#define TWA5 6
#define TWA6 7

#define TWDR _SFR_MEM8(0xBB)
#define TWD0 0
#define TWD1 1
#define TWD2 2
#define TWD3 3
#define TWD4 4
#define TWD5 5
#define TWD6 6
#define TWD7 7

#define TWCR _SFR_MEM8(0xBC)
#define TWIE 0
#define TWEN 2
#define TWWC 3
#define TWSTO 4
#define TWSTA 5
#define TWEA 6
#define TWINT 7

#define TWAMR _SFR_MEM8(0xBD)
#define TWAM0 0
#define TWAM1 1
#define TWAM2 2
#define TWAM3 3
#define TWAM4 4
#define TWAM5 5
#define TWAM6 6

#define UCSR0A _SFR_MEM8(0xC0)
#define MPCM0 0
#define U2X0 1
#define UPE0 2
#define DOR0 3
#define FE0 4
#define UDRE0 5
#define TXC0 6
#define RXC0 7

#define UCSR0B _SFR_MEM8(0xC1)
#define TXB80 0
#define RXB80 1
#define UCSZ02 2
#define TXEN0 3
#define RXEN0 4
#define UDRIE0 5
#define TXCIE0 6
#define RXCIE0 7

#define UCSR0C _SFR_MEM8(0xC2)
#define UCPOL0 0
#define UCSZ00 1
#define UCPHA0 1
#define UCSZ01 2
#define UDORD0 2
#define USBS0 3
#define UPM00 4
#define UPM01 5
#define UMSEL00 6
#define UMSEL01 7

#define UBRR0 _SFR_MEM16(0xC4)

#define UBRR0L _SFR_MEM8(0xC4)
#define UBRR0_0 0
#define UBRR0_1 1
#define UBRR0_2 2
#define UBRR0_3 3
#define UBRR0_4 4
#define UBRR0_5 5
#define UBRR0_6 6
#define UBRR0_7 7

#define UBRR0H _SFR_MEM8(0xC5)
#define UBRR0_8 0
#define UBRR0_9 1
#define UBRR0_10 2
#define UBRR0_11 3

#define UDR0 _SFR_MEM8(0xC6)
#define UDR0_0 0
#define UDR0_1 1
#define UDR0_2 2
#define UDR0_3 3
#define UDR0_4 4
#define UDR0_5 5
#define UDR0_6 6
#define UDR0_7 7



/* Interrupt Vectors */
/* Interrupt Vector 0 is the reset vector. */

#define INT0_vect_num     1
#define INT0_vect         _VECTOR(1)   /* External Interrupt Request 0 */

#define INT1_vect_num     2
#define INT1_vect         _VECTOR(2)   /* External Interrupt Request 1 */

#define PCINT0_vect_num   3
#define PCINT0_vect       _VECTOR(3)   /* Pin Change Interrupt Request 0 */

#define PCINT1_vect_num   4
#define PCINT1_vect       _VECTOR(4)   /* Pin Change Interrupt Request 0 */

#define PCINT2_vect_num   5
#define PCINT2_vect       _VECTOR(5)   /* Pin Change Interrupt Request 1 */

#define WDT_vect_num      6
#define WDT_vect          _VECTOR(6)   /* Watchdog Time-out Interrupt */

#define TIMER2_COMPA_vect_num 7
#define TIMER2_COMPA_vect _VECTOR(7)   /* Timer/Counter2 Compare Match A */

#define TIMER2_COMPB_vect_num 8
#define TIMER2_COMPB_vect _VECTOR(8)   /* Timer/Counter2 Compare Match A */

#define TIMER2_OVF_vect_num   9
#define TIMER2_OVF_vect   _VECTOR(9)   /* Timer/Counter2 Overflow */

#define TIMER1_CAPT_vect_num  10
#define TIMER1_CAPT_vect  _VECTOR(10)  /* Timer/Counter1 Capture Event */

#define TIMER1_COMPA_vect_num 11
#define TIMER1_COMPA_vect _VECTOR(11)  /* Timer/Counter1 Compare Match A */

#define TIMER1_COMPB_vect_num 12
#define TIMER1_COMPB_vect _VECTOR(12)  /* Timer/Counter1 Compare Match B */ 

#define TIMER1_OVF_vect_num   13
#define TIMER1_OVF_vect   _VECTOR(13)  /* Timer/Counter1 Overflow */

#define TIMER0_COMPA_vect_num 14
#define TIMER0_COMPA_vect _VECTOR(14)  /* TimerCounter0 Compare Match A */

#define TIMER0_COMPB_vect_num 15
#define TIMER0_COMPB_vect _VECTOR(15)  /* TimerCounter0 Compare Match B */

#define TIMER0_OVF_vect_num  16
#define TIMER0_OVF_vect   _VECTOR(16)  /* Timer/Couner0 Overflow */

#define SPI_STC_vect_num  17
#define SPI_STC_vect      _VECTOR(17)  /* SPI Serial Transfer Complete */

#define USART_RX_vect_num 18
#define USART_RX_vect     _VECTOR(18)  /* USART Rx Complete */

#define USART_UDRE_vect_num   19
#define USART_UDRE_vect   _VECTOR(19)  /* USART, Data Register Empty */

#define USART_TX_vect_num 20
#define USART_TX_vect     _VECTOR(20)  /* USART Tx Complete */

#define ADC_vect_num      21
#define ADC_vect          _VECTOR(21)  /* ADC Conversion Complete */

#define EE_READY_vect_num 22
#define EE_READY_vect     _VECTOR(22)  /* EEPROM Ready */

#define ANALOG_COMP_vect_num  23
#define ANALOG_COMP_vect  _VECTOR(23)  /* Analog Comparator */

#define TWI_vect_num      24
#define TWI_vect          _VECTOR(24)  /* Two-wire Serial Interface */

#define SPM_READY_vect_num    25
#define SPM_READY_vect    _VECTOR(25)  /* Store Program Memory Read */

#define _VECTORS_SIZE (26 * 4)



/* Constants */
#define SPM_PAGESIZE 128
#define RAMSTART     (0x100)
#define RAMEND       0x8FF     /* Last On-Chip SRAM Location */
#define XRAMSIZE     0
#define XRAMEND      RAMEND
#define E2END        0x3FF
#define E2PAGESIZE   4
#define FLASHEND     0x7FFF



/* Fuses */
#define FUSE_MEMORY_SIZE 3

/* Low Fuse Byte */
#define FUSE_CKSEL0 (unsigned char)~_BV(0)  /* Select Clock Source */
#define FUSE_CKSEL1 (unsigned char)~_BV(1)  /* Select Clock Source */
#define FUSE_CKSEL2 (unsigned char)~_BV(2)  /* Select Clock Source */
#define FUSE_CKSEL3 (unsigned char)~_BV(3)  /* Select Clock Source */
#define FUSE_SUT0   (unsigned char)~_BV(4)  /* Select start-up time */
#define FUSE_SUT1   (unsigned char)~_BV(5)  /* Select start-up time */
#define FUSE_CKOUT  (unsigned char)~_BV(6)  /* Clock output */
#define FUSE_CKDIV8 (unsigned char)~_BV(7) /* Divide clock by 8 */
#define LFUSE_DEFAULT (FUSE_CKSEL0 & FUSE_CKSEL2 & FUSE_CKSEL3 & FUSE_SUT0 & FUSE_CKDIV8)

/* High Fuse Byte */
#define FUSE_BOOTRST (unsigned char)~_BV(0)
#define FUSE_BOOTSZ0 (unsigned char)~_BV(1)
#define FUSE_BOOTSZ1 (unsigned char)~_BV(2)
#define FUSE_EESAVE    (unsigned char)~_BV(3)  /* EEPROM memory is preserved through chip erase */
#define FUSE_WDTON     (unsigned char)~_BV(4)  /* Watchdog Timer Always On */
#define FUSE_SPIEN     (unsigned char)~_BV(5)  /* Enable Serial programming and Data Downloading */
#define FUSE_DWEN      (unsigned char)~_BV(6)  /* debugWIRE Enable */
#define FUSE_RSTDISBL  (unsigned char)~_BV(7)  /* External reset disable */
#define HFUSE_DEFAULT (FUSE_BOOTSZ0 & FUSE_BOOTSZ1 & FUSE_SPIEN)

/* Extended Fuse Byte */
#define FUSE_BODLEVEL0 (unsigned char)~_BV(0)  /* Brown-out Detector trigger level */
#define FUSE_BODLEVEL1 (unsigned char)~_BV(1)  /* Brown-out Detector trigger level */
#define FUSE_BODLEVEL2 (unsigned char)~_BV(2)  /* Brown-out Detector trigger level */
#define EFUSE_DEFAULT  (0xFF)



/* Lock Bits */
#define __LOCK_BITS_EXIST
#define __BOOT_LOCK_BITS_0_EXIST
#define __BOOT_LOCK_BITS_1_EXIST 


/* Signature */
#define SIGNATURE_0 0x1E
#define SIGNATURE_1 0x95
#if defined(__AVR_ATmega328__)
#  define SIGNATURE_2 0x14
#else /* ATmega328P */
#  define SIGNATURE_2 0x0F
#endif

#define SLEEP_MODE_IDLE (0x00<<1)
#define SLEEP_MODE_ADC (0x01<<1)
#define SLEEP_MODE_PWR_DOWN (0x02<<1)
#define SLEEP_MODE_PWR_SAVE (0x03<<1)
#define SLEEP_MODE_STANDBY (0x06<<1)
#define SLEEP_MODE_EXT_STANDBY (0x07<<1)

#endif  /* _AVR_IOM328P_H_ */


/* Copyright (c) 2002,2003,2005,2006,2007 Marek Michalkiewicz, Joerg Wunsch
   Copyright (c) 2007 Eric B. Weddington
   All rights reserved.

   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions are met:

   * Redistributions of source code must retain the above copyright
     notice, this list of conditions and the following disclaimer.

   * Redistributions in binary form must reproduce the above copyright
     notice, this list of conditions and the following disclaimer in
     the documentation and/or other materials provided with the
     distribution.

   * Neither the name of the copyright holders nor the names of
     contributors may be used to endorse or promote products derived
     from this software without specific prior written permission.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE. */

/* $Id$ */

/** \file */
/** \defgroup avr_io <avr/io.h>: AVR device-specific IO definitions
    \code #include <avr/io.h> \endcode

    This header file includes the apropriate IO definitions for the
    device that has been specified by the <tt>-mmcu=</tt> compiler
    command-line switch.  This is done by diverting to the appropriate
    file <tt>&lt;avr/io</tt><em>XXXX</em><tt>.h&gt;</tt> which should
    never be included directly.  Some register names common to all
    AVR devices are defined directly within <tt>&lt;avr/common.h&gt;</tt>,
    which is included in <tt>&lt;avr/io.h&gt;</tt>,
    but most of the details come from the respective include file.

    Note that this file always includes the following files:
    \code 
    #include <avr/sfr_defs.h>
    #include <avr/portpins.h>
    #include <avr/common.h>
    #include <avr/version.h>
    \endcode
    See \ref avr_sfr for more details about that header file.

    Included are definitions of the IO register set and their
    respective bit values as specified in the Atmel documentation.
    Note that inconsistencies in naming conventions,
    so even identical functions sometimes get different names on
    different devices.

    Also included are the specific names useable for interrupt
    function definitions as documented
    \ref avr_signames "here".

    Finally, the following macros are defined:

    - \b RAMEND
    <br>
    The last on-chip RAM address.
    <br>
    - \b XRAMEND
    <br>
    The last possible RAM location that is addressable. This is equal to 
    RAMEND for devices that do not allow for external RAM. For devices 
    that allow external RAM, this will be larger than RAMEND.
    <br>
    - \b E2END
    <br>
    The last EEPROM address.
    <br>
    - \b FLASHEND
    <br>
    The last byte address in the Flash program space.
    <br>
    - \b SPM_PAGESIZE
    <br>
    For devices with bootloader support, the flash pagesize
    (in bytes) to be used for the \c SPM instruction. 
    - \b E2PAGESIZE
    <br>
    The size of the EEPROM page.
    
*/

#ifndef _AVR_IO_H_
#define _AVR_IO_H_

#include <avr/sfr_defs.h>

#if defined (__AVR_AT94K__)
#  include <avr/ioat94k.h>
#elif defined (__AVR_AT43USB320__)
#  include <avr/io43u32x.h>
#elif defined (__AVR_AT43USB355__)
#  include <avr/io43u35x.h>
#elif defined (__AVR_AT76C711__)
#  include <avr/io76c711.h>
#elif defined (__AVR_AT86RF401__)
#  include <avr/io86r401.h>
#elif defined (__AVR_AT90PWM1__)
#  include <avr/io90pwm1.h>
#elif defined (__AVR_AT90PWM2__)
#  include <avr/io90pwmx.h>
#elif defined (__AVR_AT90PWM2B__)
#  include <avr/io90pwm2b.h>
#elif defined (__AVR_AT90PWM3__)
#  include <avr/io90pwmx.h>
#elif defined (__AVR_AT90PWM3B__)
#  include <avr/io90pwm3b.h>
#elif defined (__AVR_AT90PWM216__)
#  include <avr/io90pwm216.h>
#elif defined (__AVR_AT90PWM316__)
#  include <avr/io90pwm316.h>
#elif defined (__AVR_AT90PWM161__)
#  include <avr/io90pwm161.h>
#elif defined (__AVR_AT90PWM81__)
#  include <avr/io90pwm81.h>
#elif defined (__AVR_ATmega8U2__)
#  include <avr/iom8u2.h>
#elif defined (__AVR_ATmega16M1__)
#  include <avr/iom16m1.h>
#elif defined (__AVR_ATmega16U2__)
#  include <avr/iom16u2.h>
#elif defined (__AVR_ATmega16U4__)
#  include <avr/iom16u4.h>
#elif defined (__AVR_ATmega32C1__)
#  include <avr/iom32c1.h>
#elif defined (__AVR_ATmega32M1__)
#  include <avr/iom32m1.h>
#elif defined (__AVR_ATmega32U2__)
#  include <avr/iom32u2.h>
#elif defined (__AVR_ATmega32U4__)
#  include <avr/iom32u4.h>
#elif defined (__AVR_ATmega32U6__)
#  include <avr/iom32u6.h>
#elif defined (__AVR_ATmega64C1__)
#  include <avr/iom64c1.h>
#elif defined (__AVR_ATmega64M1__)
#  include <avr/iom64m1.h>
#elif defined (__AVR_ATmega128__)
#  include <avr/iom128.h>
#elif defined (__AVR_ATmega128A__)
#  include <avr/iom128a.h>
#elif defined (__AVR_ATmega1280__)
#  include <avr/iom1280.h>
#elif defined (__AVR_ATmega1281__)
#  include <avr/iom1281.h>
#elif defined (__AVR_ATmega1284__)
#  include <avr/iom1284.h>
#elif defined (__AVR_ATmega1284P__)
#  include <avr/iom1284p.h>
#elif defined (__AVR_ATmega128RFA1__)
#  include <avr/iom128rfa1.h>
#elif defined (__AVR_ATmega1284RFR2__)
#  include <avr/iom1284rfr2.h>
#elif defined (__AVR_ATmega128RFR2__)
#  include <avr/iom128rfr2.h>
#elif defined (__AVR_ATmega2564RFR2__)
#  include <avr/iom2564rfr2.h>
#elif defined (__AVR_ATmega256RFR2__)
#  include <avr/iom256rfr2.h>
#elif defined (__AVR_ATmega2560__)
#  include <avr/iom2560.h>
#elif defined (__AVR_ATmega2561__)
#  include <avr/iom2561.h>
#elif defined (__AVR_AT90CAN32__)
#  include <avr/iocan32.h>
#elif defined (__AVR_AT90CAN64__)
#  include <avr/iocan64.h>
#elif defined (__AVR_AT90CAN128__)
#  include <avr/iocan128.h>
#elif defined (__AVR_AT90USB82__)
#  include <avr/iousb82.h>
#elif defined (__AVR_AT90USB162__)
#  include <avr/iousb162.h>
#elif defined (__AVR_AT90USB646__)
#  include <avr/iousb646.h>
#elif defined (__AVR_AT90USB647__)
#  include <avr/iousb647.h>
#elif defined (__AVR_AT90USB1286__)
#  include <avr/iousb1286.h>
#elif defined (__AVR_AT90USB1287__)
#  include <avr/iousb1287.h>
#elif defined (__AVR_ATmega644RFR2__)
#  include <avr/iom644rfr2.h>
#elif defined (__AVR_ATmega64RFR2__)
#  include <avr/iom64rfr2.h>
#elif defined (__AVR_ATmega64__)
#  include <avr/iom64.h>
#elif defined (__AVR_ATmega64A__)
#  include <avr/iom64a.h>
#elif defined (__AVR_ATmega640__)
#  include <avr/iom640.h>
#elif defined (__AVR_ATmega644__)
#  include <avr/iom644.h>
#elif defined (__AVR_ATmega644A__)
#  include <avr/iom644a.h>
#elif defined (__AVR_ATmega644P__)
#  include <avr/iom644p.h>
#elif defined (__AVR_ATmega644PA__)
#  include <avr/iom644pa.h>
#elif defined (__AVR_ATmega645__)
#  include <avr/iom645.h>
#elif (defined __AVR_ATmega645A__)
#include <avr/iom645a.h>
#elif (defined __AVR_ATmega645P__)
#include <avr/iom645p.h>
#elif defined (__AVR_ATmega6450__)
#  include <avr/iom6450.h>
#elif (defined __AVR_ATmega6450A__)
#include <avr/iom6450a.h>
#elif (defined __AVR_ATmega6450P__)
#include <avr/iom6450p.h>
#elif defined (__AVR_ATmega649__)
#  include <avr/iom649.h>
#elif (defined __AVR_ATmega649A__)
#include <avr/iom649a.h>
#elif defined (__AVR_ATmega6490__)
#  include <avr/iom6490.h>
#elif (defined __AVR_ATmega6490A__)
#include <avr/iom6490a.h>
#elif (defined __AVR_ATmega6490P__)
#include <avr/iom6490p.h>
#elif defined (__AVR_ATmega649P__)
#  include <avr/iom649p.h>
#elif defined (__AVR_ATmega64HVE__)
#  include <avr/iom64hve.h>
#elif defined (__AVR_ATmega64HVE2__)
#  include <avr/iom64hve2.h>
#elif defined (__AVR_ATmega103__)
#  include <avr/iom103.h>
#elif defined (__AVR_ATmega32__)
#  include <avr/iom32.h>
#elif defined (__AVR_ATmega32A__)
#  include <avr/iom32a.h>
#elif defined (__AVR_ATmega323__)
#  include <avr/iom323.h>
#elif defined (__AVR_ATmega324P__)
#  include <avr/iom324p.h>
#elif (defined __AVR_ATmega324A__)
#include <avr/iom324a.h>
#elif defined (__AVR_ATmega324PA__)
#  include <avr/iom324pa.h>
#elif defined (__AVR_ATmega325__)
#  include <avr/iom325.h>
#elif (defined __AVR_ATmega325A__)
#include <avr/iom325a.h>
#elif defined (__AVR_ATmega325P__)
#  include <avr/iom325p.h>
#elif defined (__AVR_ATmega325PA__)
#  include <avr/iom325pa.h>  
#elif defined (__AVR_ATmega3250__) 
#  include <avr/iom3250.h>
#elif (defined __AVR_ATmega3250A__)
#include <avr/iom3250a.h>
#elif defined (__AVR_ATmega3250P__)
#  include <avr/iom3250p.h>
#elif defined (__AVR_ATmega3250PA__)
#  include <avr/iom3250pa.h>  
#elif defined (__AVR_ATmega328P__)
#  include <avr/iom328p.h>
#elif (defined __AVR_ATmega328__)
#include <avr/iom328.h>
#elif defined (__AVR_ATmega329__)
#  include <avr/iom329.h>
#elif (defined __AVR_ATmega329A__)
#include <avr/iom329a.h>
#elif defined (__AVR_ATmega329P__) 
#  include <avr/iom329p.h>
#elif (defined __AVR_ATmega329PA__)
#include <avr/iom329pa.h>
#elif (defined __AVR_ATmega3290PA__)
#include <avr/iom3290pa.h>
#elif defined (__AVR_ATmega3290__)
#  include <avr/iom3290.h>
#elif (defined __AVR_ATmega3290A__)
#include <avr/iom3290a.h>
#elif defined (__AVR_ATmega3290P__)
#  include <avr/iom3290.h>
#elif defined (__AVR_ATmega32HVB__)
#  include <avr/iom32hvb.h>
#elif defined (__AVR_ATmega32HVBREVB__)
#  include <avr/iom32hvbrevb.h>
#elif defined (__AVR_ATmega406__)
#  include <avr/iom406.h>
#elif defined (__AVR_ATmega16__)
#  include <avr/iom16.h>
#elif defined (__AVR_ATmega16A__)
#  include <avr/iom16a.h>
#elif defined (__AVR_ATmega161__)
#  include <avr/iom161.h>
#elif defined (__AVR_ATmega162__)
#  include <avr/iom162.h>
#elif defined (__AVR_ATmega163__)
#  include <avr/iom163.h>
#elif defined (__AVR_ATmega164P__)
#  include <avr/iom164p.h>
#elif (defined __AVR_ATmega164A__)
#include <avr/iom164a.h>
#elif defined (__AVR_ATmega164PA__)
#  include <avr/iom164pa.h>
#elif defined (__AVR_ATmega165__)
#  include <avr/iom165.h>
#elif defined (__AVR_ATmega165A__)
#  include <avr/iom165a.h>
#elif defined (__AVR_ATmega165P__)
#  include <avr/iom165p.h>
#elif defined (__AVR_ATmega165PA__)
#  include <avr/iom165pa.h>
#elif defined (__AVR_ATmega168__)
#  include <avr/iom168.h>
#elif defined (__AVR_ATmega168A__)
#  include <avr/iom168a.h>
#elif defined (__AVR_ATmega168P__)
#  include <avr/iom168p.h>
#elif defined (__AVR_ATmega168PA__)
#  include <avr/iom168pa.h>
#elif defined (__AVR_ATmega168PB__)
#  include <avr/iom168pb.h>
#elif defined (__AVR_ATmega169__)
#  include <avr/iom169.h>
#elif (defined __AVR_ATmega169A__)
#include <avr/iom169a.h>
#elif defined (__AVR_ATmega169P__)
#  include <avr/iom169p.h>
#elif defined (__AVR_ATmega169PA__)
#  include <avr/iom169pa.h>
#elif defined (__AVR_ATmega8HVA__)
#  include <avr/iom8hva.h>
#elif defined (__AVR_ATmega16HVA__)
#  include <avr/iom16hva.h>
#elif defined (__AVR_ATmega16HVA2__)
#  include <avr/iom16hva2.h>
#elif defined (__AVR_ATmega16HVB__)
#  include <avr/iom16hvb.h>
#elif defined (__AVR_ATmega16HVBREVB__)
#  include <avr/iom16hvbrevb.h>
#elif defined (__AVR_ATmega8__)
#  include <avr/iom8.h>
#elif defined (__AVR_ATmega8A__)
#  include <avr/iom8a.h>
#elif defined (__AVR_ATmega48__)
#  include <avr/iom48.h>
#elif defined (__AVR_ATmega48A__)
#  include <avr/iom48a.h>
#elif defined (__AVR_ATmega48PA__)
#  include <avr/iom48pa.h>
#elif defined (__AVR_ATmega48PB__)
#  include <avr/iom48pb.h>
#elif defined (__AVR_ATmega48P__)
#  include <avr/iom48p.h>
#elif defined (__AVR_ATmega88__)
#  include <avr/iom88.h>
#elif defined (__AVR_ATmega88A__)
#  include <avr/iom88a.h>
#elif defined (__AVR_ATmega88P__)
#  include <avr/iom88p.h>
#elif defined (__AVR_ATmega88PA__)
#  include <avr/iom88pa.h>
#elif defined (__AVR_ATmega88PB__)
#  include <avr/iom88pb.h>
#elif defined (__AVR_ATmega8515__)
#  include <avr/iom8515.h>
#elif defined (__AVR_ATmega8535__)
#  include <avr/iom8535.h>
#elif defined (__AVR_AT90S8535__)
#  include <avr/io8535.h>
#elif defined (__AVR_AT90C8534__)
#  include <avr/io8534.h>
#elif defined (__AVR_AT90S8515__)
#  include <avr/io8515.h>
#elif defined (__AVR_AT90S4434__)
#  include <avr/io4434.h>
#elif defined (__AVR_AT90S4433__)
#  include <avr/io4433.h>
#elif defined (__AVR_AT90S4414__)
#  include <avr/io4414.h>
#elif defined (__AVR_ATtiny22__)
#  include <avr/iotn22.h>
#elif defined (__AVR_ATtiny26__)
#  include <avr/iotn26.h>
#elif defined (__AVR_AT90S2343__)
#  include <avr/io2343.h>
#elif defined (__AVR_AT90S2333__)
#  include <avr/io2333.h>
#elif defined (__AVR_AT90S2323__)
#  include <avr/io2323.h>
#elif defined (__AVR_AT90S2313__)
#  include <avr/io2313.h>
#elif defined (__AVR_ATtiny4__)
#  include <avr/iotn4.h>
#elif defined (__AVR_ATtiny5__)
#  include <avr/iotn5.h>
#elif defined (__AVR_ATtiny9__)
#  include <avr/iotn9.h>
#elif defined (__AVR_ATtiny10__)
#  include <avr/iotn10.h>
#elif defined (__AVR_ATtiny20__)
#  include <avr/iotn20.h>
#elif defined (__AVR_ATtiny40__)
#  include <avr/iotn40.h>
#elif defined (__AVR_ATtiny2313__)
#  include <avr/iotn2313.h>
#elif defined (__AVR_ATtiny2313A__)
#  include <avr/iotn2313a.h>
#elif defined (__AVR_ATtiny13__)
#  include <avr/iotn13.h>
#elif defined (__AVR_ATtiny13A__)
#  include <avr/iotn13a.h>
#elif defined (__AVR_ATtiny25__)
#  include <avr/iotn25.h>
#elif defined (__AVR_ATtiny4313__)
#  include <avr/iotn4313.h>
#elif defined (__AVR_ATtiny45__)
#  include <avr/iotn45.h>
#elif defined (__AVR_ATtiny85__)
#  include <avr/iotn85.h>
#elif defined (__AVR_ATtiny24__)
#  include <avr/iotn24.h>
#elif defined (__AVR_ATtiny24A__)
#  include <avr/iotn24a.h>
#elif defined (__AVR_ATtiny44__)
#  include <avr/iotn44.h>
#elif defined (__AVR_ATtiny44A__)
#  include <avr/iotn44a.h>
#elif defined (__AVR_ATtiny441__)
#  include <avr/iotn441.h>
#elif defined (__AVR_ATtiny84__)
#  include <avr/iotn84.h>
#elif defined (__AVR_ATtiny84A__)
#  include <avr/iotn84a.h> 
#elif defined (__AVR_ATtiny841__)
#  include <avr/iotn841.h> 
#elif defined (__AVR_ATtiny261__)
#  include <avr/iotn261.h>
#elif defined (__AVR_ATtiny261A__)
#  include <avr/iotn261a.h>
#elif defined (__AVR_ATtiny461__)
#  include <avr/iotn461.h>
#elif defined (__AVR_ATtiny461A__)
#  include <avr/iotn461a.h>
#elif defined (__AVR_ATtiny861__)
#  include <avr/iotn861.h>
#elif defined (__AVR_ATtiny861A__)
#  include <avr/iotn861a.h>
#elif defined (__AVR_ATtiny43U__)
#  include <avr/iotn43u.h>
#elif defined (__AVR_ATtiny48__)
#  include <avr/iotn48.h>
#elif defined (__AVR_ATtiny88__)
#  include <avr/iotn88.h>
#elif defined (__AVR_ATtiny828__)
#  include <avr/iotn828.h>
#elif defined (__AVR_ATtiny87__)
#  include <avr/iotn87.h>
#elif defined (__AVR_ATtiny167__)
#  include <avr/iotn167.h>
#elif defined (__AVR_ATtiny1634__)
#  include <avr/iotn1634.h>
#elif defined (__AVR_AT90SCR100__)
#  include <avr/io90scr100.h>
#elif defined (__AVR_ATxmega8E5__)
#  include <avr/iox8e5.h>
#elif defined (__AVR_ATxmega16A4__)
#  include <avr/iox16a4.h>
#elif defined (__AVR_ATxmega16A4U__)
#  include <avr/iox16a4u.h>
#elif defined (__AVR_ATxmega16C4__)
#  include <avr/iox16c4.h>
#elif defined (__AVR_ATxmega16D4__)
#  include <avr/iox16d4.h>
#elif defined (__AVR_ATxmega16E5__)
#  include <avr/iox16e5.h>
#elif defined (__AVR_ATxmega32A4__)
#  include <avr/iox32a4.h>
#elif defined (__AVR_ATxmega32A4U__)
#  include <avr/iox32a4u.h>
#elif defined (__AVR_ATxmega32C3__)
#  include <avr/iox32c3.h>
#elif defined (__AVR_ATxmega32C4__)
#  include <avr/iox32c4.h>
#elif defined (__AVR_ATxmega32D3__)
#  include <avr/iox32d3.h>
#elif defined (__AVR_ATxmega32D4__)
#  include <avr/iox32d4.h>
#elif defined (__AVR_ATxmega32E5__)
#  include <avr/iox32e5.h>
#elif defined (__AVR_ATxmega64A1__)
#  include <avr/iox64a1.h>
#elif defined (__AVR_ATxmega64A1U__)
#  include <avr/iox64a1u.h>
#elif defined (__AVR_ATxmega64A3__)
#  include <avr/iox64a3.h>
#elif defined (__AVR_ATxmega64A3U__)
#  include <avr/iox64a3u.h>
#elif defined (__AVR_ATxmega64A4U__)
#  include <avr/iox64a4u.h>
#elif defined (__AVR_ATxmega64B1__)
#  include <avr/iox64b1.h>
#elif defined (__AVR_ATxmega64B3__)
#  include <avr/iox64b3.h>
#elif defined (__AVR_ATxmega64C3__)
#  include <avr/iox64c3.h>
#elif defined (__AVR_ATxmega64D3__)
#  include <avr/iox64d3.h>
#elif defined (__AVR_ATxmega64D4__)
#  include <avr/iox64d4.h>
#elif defined (__AVR_ATxmega128A1__)
#  include <avr/iox128a1.h>
#elif defined (__AVR_ATxmega128A1U__)
#  include <avr/iox128a1u.h>
#elif defined (__AVR_ATxmega128A4U__)
#  include <avr/iox128a4u.h>
#elif defined (__AVR_ATxmega128A3__)
#  include <avr/iox128a3.h>
#elif defined (__AVR_ATxmega128A3U__)
#  include <avr/iox128a3u.h>
#elif defined (__AVR_ATxmega128B1__)
#  include <avr/iox128b1.h>
#elif defined (__AVR_ATxmega128B3__)
#  include <avr/iox128b3.h>
#elif defined (__AVR_ATxmega128C3__)
#  include <avr/iox128c3.h>
#elif defined (__AVR_ATxmega128D3__)
#  include <avr/iox128d3.h>
#elif defined (__AVR_ATxmega128D4__)
#  include <avr/iox128d4.h>
#elif defined (__AVR_ATxmega192A3__)
#  include <avr/iox192a3.h>
#elif defined (__AVR_ATxmega192A3U__)
#  include <avr/iox192a3u.h>
#elif defined (__AVR_ATxmega192C3__)
#  include <avr/iox192c3.h>
#elif defined (__AVR_ATxmega192D3__)
#  include <avr/iox192d3.h>
#elif defined (__AVR_ATxmega256A3__)
#  include <avr/iox256a3.h>
#elif defined (__AVR_ATxmega256A3U__)
#  include <avr/iox256a3u.h>
#elif defined (__AVR_ATxmega256A3B__)
#  include <avr/iox256a3b.h>
#elif defined (__AVR_ATxmega256A3BU__)
#  include <avr/iox256a3bu.h>
#elif defined (__AVR_ATxmega256C3__)
#  include <avr/iox256c3.h>
#elif defined (__AVR_ATxmega256D3__)
#  include <avr/iox256d3.h>
#elif defined (__AVR_ATxmega384C3__)
#  include <avr/iox384c3.h>
#elif defined (__AVR_ATxmega384D3__)
#  include <avr/iox384d3.h>
#elif defined (__AVR_ATA5702M322__)
#  include <avr/ioa5702m322.h>
#elif defined (__AVR_ATA5782__)
#  include <avr/ioa5782.h>
#elif defined (__AVR_ATA5790__)
#  include <avr/ioa5790.h>
#elif defined (__AVR_ATA5790N__)
#  include <avr/ioa5790n.h>
#elif defined (__AVR_ATA5791__)
#  include <avr/ioa5791.h>
#elif defined (__AVR_ATA5831__)
#  include <avr/ioa5831.h>
#elif defined (__AVR_ATA5272__)
#  include <avr/ioa5272.h>
#elif defined (__AVR_ATA5505__)
#  include <avr/ioa5505.h>
#elif defined (__AVR_ATA5795__)
#  include <avr/ioa5795.h>
#elif defined (__AVR_ATA6285__)
#  include <avr/ioa6285.h>
#elif defined (__AVR_ATA6286__)
#  include <avr/ioa6286.h>
#elif defined (__AVR_ATA6289__)
#  include <avr/ioa6289.h>
#elif defined (__AVR_ATA6612C__)
#  include <avr/ioa6612c.h>
#elif defined (__AVR_ATA6613C__)
#  include <avr/ioa6613c.h>
#elif defined (__AVR_ATA6614Q__)
#  include <avr/ioa6614q.h>
#elif defined (__AVR_ATA6616C__)
#  include <avr/ioa6616c.h>
#elif defined (__AVR_ATA6617C__)
#  include <avr/ioa6617c.h>
#elif defined (__AVR_ATA664251__)
#  include <avr/ioa664251.h>
#elif defined (__AVR_ATA8210__)
#  include <avr/ioa8210.h>
#elif defined (__AVR_ATA8510__)
#  include <avr/ioa8510.h>
/* avr1: the following only supported for assembler programs */
#elif defined (__AVR_ATtiny28__)
#  include <avr/iotn28.h>
#elif defined (__AVR_AT90S1200__)
#  include <avr/io1200.h>
#elif defined (__AVR_ATtiny15__)
#  include <avr/iotn15.h>
#elif defined (__AVR_ATtiny12__)
#  include <avr/iotn12.h>
#elif defined (__AVR_ATtiny11__)
#  include <avr/iotn11.h>
#elif defined (__AVR_M3000__)
#  include <avr/iom3000.h>
#elif defined (__AVR_DEV_LIB_NAME__)
#  define __concat__(a,b) a##b
#  define __header1__(a,b) __concat__(a,b)
#  define __AVR_DEVICE_HEADER__ <avr/__header1__(io,__AVR_DEV_LIB_NAME__).h>
#  include __AVR_DEVICE_HEADER__
#else
#  if !defined(__COMPILING_AVR_LIBC__)
#    warning "device type not defined"
#  endif
#endif

#include <avr/portpins.h>

#include <avr/common.h>

#include <avr/version.h>

#if __AVR_ARCH__ >= 100
#  include <avr/xmega.h>
#endif

/* Include fuse.h after individual IO header files. */
#include <avr/fuse.h>

/* Include lock.h after individual IO header files. */
#include <avr/lock.h>

#endif /* _AVR_IO_H_ */
/* Copyright (c) 2003  Theodore A. Roth
   All rights reserved.

   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions are met:

   * Redistributions of source code must retain the above copyright
     notice, this list of conditions and the following disclaimer.

   * Redistributions in binary form must reproduce the above copyright
     notice, this list of conditions and the following disclaimer in
     the documentation and/or other materials provided with the
     distribution.

   * Neither the name of the copyright holders nor the names of
     contributors may be used to endorse or promote products derived
     from this software without specific prior written permission.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE. */

/* $Id$ */

#ifndef _AVR_PORTPINS_H_
#define _AVR_PORTPINS_H_ 1

/* This file should only be included from <avr/io.h>, never directly. */

#ifndef _AVR_IO_H_
#  error "Include <avr/io.h> instead of this file."
#endif

/* Define Generic PORTn, DDn, and PINn values. */

/* Port Data Register (generic) */
#define    PORT7        7
#define    PORT6        6
#define    PORT5        5
#define    PORT4        4
#define    PORT3        3
#define    PORT2        2
#define    PORT1        1
#define    PORT0        0

/* Port Data Direction Register (generic) */
#define    DD7          7
#define    DD6          6
#define    DD5          5
#define    DD4          4
#define    DD3          3
#define    DD2          2
#define    DD1          1
#define    DD0          0

/* Port Input Pins (generic) */
#define    PIN7         7
#define    PIN6         6
#define    PIN5         5
#define    PIN4         4
#define    PIN3         3
#define    PIN2         2
#define    PIN1         1
#define    PIN0         0

/* Define PORTxn an Pxn values for all possible port pins if not defined already by io.h. */

/* PORT A */

#if defined(PA0) && !defined(PORTA0)
#  define PORTA0 PA0
#elif defined(PORTA0) && !defined(PA0)
#  define PA0 PORTA0
#endif
#if defined(PA1) && !defined(PORTA1)
#  define PORTA1 PA1
#elif defined(PORTA1) && !defined(PA1)
#  define PA1 PORTA1
#endif
#if defined(PA2) && !defined(PORTA2)
#  define PORTA2 PA2
#elif defined(PORTA2) && !defined(PA2)
#  define PA2 PORTA2
#endif
#if defined(PA3) && !defined(PORTA3)
#  define PORTA3 PA3
#elif defined(PORTA3) && !defined(PA3)
#  define PA3 PORTA3
#endif
#if defined(PA4) && !defined(PORTA4)
#  define PORTA4 PA4
#elif defined(PORTA4) && !defined(PA4)
#  define PA4 PORTA4
#endif
#if defined(PA5) && !defined(PORTA5)
#  define PORTA5 PA5
#elif defined(PORTA5) && !defined(PA5)
#  define PA5 PORTA5
#endif
#if defined(PA6) && !defined(PORTA6)
#  define PORTA6 PA6
#elif defined(PORTA6) && !defined(PA6)
#  define PA6 PORTA6
#endif
#if defined(PA7) && !defined(PORTA7)
#  define PORTA7 PA7
#elif defined(PORTA7) && !defined(PA7)
#  define PA7 PORTA7
#endif

/* PORT B */

#if defined(PB0) && !defined(PORTB0)
#  define PORTB0 PB0
#elif defined(PORTB0) && !defined(PB0)
#  define PB0 PORTB0
#endif
#if defined(PB1) && !defined(PORTB1)
#  define PORTB1 PB1
#elif defined(PORTB1) && !defined(PB1)
#  define PB1 PORTB1
#endif
#if defined(PB2) && !defined(PORTB2)
#  define PORTB2 PB2
#elif defined(PORTB2) && !defined(PB2)
#  define PB2 PORTB2
#endif
#if defined(PB3) && !defined(PORTB3)
#  define PORTB3 PB3
#elif defined(PORTB3) && !defined(PB3)
#  define PB3 PORTB3
#endif
#if defined(PB4) && !defined(PORTB4)
#  define PORTB4 PB4
#elif defined(PORTB4) && !defined(PB4)
#  define PB4 PORTB4
#endif
#if defined(PB5) && !defined(PORTB5)
#  define PORTB5 PB5
#elif defined(PORTB5) && !defined(PB5)
#  define PB5 PORTB5
#endif
#if defined(PB6) && !defined(PORTB6)
#  define PORTB6 PB6
#elif defined(PORTB6) && !defined(PB6)
#  define PB6 PORTB6
#endif
#if defined(PB7) && !defined(PORTB7)
#  define PORTB7 PB7
#elif defined(PORTB7) && !defined(PB7)
#  define PB7 PORTB7
#endif

/* PORT C */

#if defined(PC0) && !defined(PORTC0)
#  define PORTC0 PC0
#elif defined(PORTC0) && !defined(PC0)
#  define PC0 PORTC0
#endif
#if defined(PC1) && !defined(PORTC1)
#  define PORTC1 PC1
#elif defined(PORTC1) && !defined(PC1)
#  define PC1 PORTC1
#endif
#if defined(PC2) && !defined(PORTC2)
#  define PORTC2 PC2
#elif defined(PORTC2) && !defined(PC2)
#  define PC2 PORTC2
#endif
#if defined(PC3) && !defined(PORTC3)
#  define PORTC3 PC3
#elif defined(PORTC3) && !defined(PC3)
#  define PC3 PORTC3
#endif
#if defined(PC4) && !defined(PORTC4)
#  define PORTC4 PC4
#elif defined(PORTC4) && !defined(PC4)
#  define PC4 PORTC4
#endif
#if defined(PC5) && !defined(PORTC5)
#  define PORTC5 PC5
#elif defined(PORTC5) && !defined(PC5)
#  define PC5 PORTC5
#endif
#if defined(PC6) && !defined(PORTC6)
#  define PORTC6 PC6
#elif defined(PORTC6) && !defined(PC6)
#  define PC6 PORTC6
#endif
#if defined(PC7) && !defined(PORTC7)
#  define PORTC7 PC7
#elif defined(PORTC7) && !defined(PC7)
#  define PC7 PORTC7
#endif

/* PORT D */

#if defined(PD0) && !defined(PORTD0)
#  define PORTD0 PD0
#elif defined(PORTD0) && !defined(PD0)
#  define PD0 PORTD0
#endif
#if defined(PD1) && !defined(PORTD1)
#  define PORTD1 PD1
#elif defined(PORTD1) && !defined(PD1)
#  define PD1 PORTD1
#endif
#if defined(PD2) && !defined(PORTD2)
#  define PORTD2 PD2
#elif defined(PORTD2) && !defined(PD2)
#  define PD2 PORTD2
#endif
#if defined(PD3) && !defined(PORTD3)
#  define PORTD3 PD3
#elif defined(PORTD3) && !defined(PD3)
#  define PD3 PORTD3
#endif
#if defined(PD4) && !defined(PORTD4)
#  define PORTD4 PD4
#elif defined(PORTD4) && !defined(PD4)
#  define PD4 PORTD4
#endif
#if defined(PD5) && !defined(PORTD5)
#  define PORTD5 PD5
#elif defined(PORTD5) && !defined(PD5)
#  define PD5 PORTD5
#endif
#if defined(PD6) && !defined(PORTD6)
#  define PORTD6 PD6
#elif defined(PORTD6) && !defined(PD6)
#  define PD6 PORTD6
#endif
#if defined(PD7) && !defined(PORTD7)
#  define PORTD7 PD7
#elif defined(PORTD7) && !defined(PD7)
#  define PD7 PORTD7
#endif

/* PORT E */

#if defined(PE0) && !defined(PORTE0)
#  define PORTE0 PE0
#elif defined(PORTE0) && !defined(PE0)
#  define PE0 PORTE0
#endif
#if defined(PE1) && !defined(PORTE1)
#  define PORTE1 PE1
#elif defined(PORTE1) && !defined(PE1)
#  define PE1 PORTE1
#endif
#if defined(PE2) && !defined(PORTE2)
#  define PORTE2 PE2
#elif defined(PORTE2) && !defined(PE2)
#  define PE2 PORTE2
#endif
#if defined(PE3) && !defined(PORTE3)
#  define PORTE3 PE3
#elif defined(PORTE3) && !defined(PE3)
#  define PE3 PORTE3
#endif
#if defined(PE4) && !defined(PORTE4)
#  define PORTE4 PE4
#elif defined(PORTE4) && !defined(PE4)
#  define PE4 PORTE4
#endif
#if defined(PE5) && !defined(PORTE5)
#  define PORTE5 PE5
#elif defined(PORTE5) && !defined(PE5)
#  define PE5 PORTE5
#endif
#if defined(PE6) && !defined(PORTE6)
#  define PORTE6 PE6
#elif defined(PORTE6) && !defined(PE6)
#  define PE6 PORTE6
#endif
#if defined(PE7) && !defined(PORTE7)
#  define PORTE7 PE7
#elif defined(PORTE7) && !defined(PE7)
#  define PE7 PORTE7
#endif

/* PORT F */

#if defined(PF0) && !defined(PORTF0)
#  define PORTF0 PF0
#elif defined(PORTF0) && !defined(PF0)
#  define PF0 PORTF0
#endif
#if defined(PF1) && !defined(PORTF1)
#  define PORTF1 PF1
#elif defined(PORTF1) && !defined(PF1)
#  define PF1 PORTF1
#endif
#if defined(PF2) && !defined(PORTF2)
#  define PORTF2 PF2
#elif defined(PORTF2) && !defined(PF2)
#  define PF2 PORTF2
#endif
#if defined(PF3) && !defined(PORTF3)
#  define PORTF3 PF3
#elif defined(PORTF3) && !defined(PF3)
#  define PF3 PORTF3
#endif
#if defined(PF4) && !defined(PORTF4)
#  define PORTF4 PF4
#elif defined(PORTF4) && !defined(PF4)
#  define PF4 PORTF4
#endif
#if defined(PF5) && !defined(PORTF5)
#  define PORTF5 PF5
#elif defined(PORTF5) && !defined(PF5)
#  define PF5 PORTF5
#endif
#if defined(PF6) && !defined(PORTF6)
#  define PORTF6 PF6
#elif defined(PORTF6) && !defined(PF6)
#  define PF6 PORTF6
#endif
#if defined(PF7) && !defined(PORTF7)
#  define PORTF7 PF7
#elif defined(PORTF7) && !defined(PF7)
#  define PF7 PORTF7
#endif

/* PORT G */

#if defined(PG0) && !defined(PORTG0)
#  define PORTG0 PG0
#elif defined(PORTG0) && !defined(PG0)
#  define PG0 PORTG0
#endif
#if defined(PG1) && !defined(PORTG1)
#  define PORTG1 PG1
#elif defined(PORTG1) && !defined(PG1)
#  define PG1 PORTG1
#endif
#if defined(PG2) && !defined(PORTG2)
#  define PORTG2 PG2
#elif defined(PORTG2) && !defined(PG2)
#  define PG2 PORTG2
#endif
#if defined(PG3) && !defined(PORTG3)
#  define PORTG3 PG3
#elif defined(PORTG3) && !defined(PG3)
#  define PG3 PORTG3
#endif
#if defined(PG4) && !defined(PORTG4)
#  define PORTG4 PG4
#elif defined(PORTG4) && !defined(PG4)
#  define PG4 PORTG4
#endif
#if defined(PG5) && !defined(PORTG5)
#  define PORTG5 PG5
#elif defined(PORTG5) && !defined(PG5)
#  define PG5 PORTG5
#endif
#if defined(PG6) && !defined(PORTG6)
#  define PORTG6 PG6
#elif defined(PORTG6) && !defined(PG6)
#  define PG6 PORTG6
#endif
#if defined(PG7) && !defined(PORTG7)
#  define PORTG7 PG7
#elif defined(PORTG7) && !defined(PG7)
#  define PG7 PORTG7
#endif

/* PORT H */

#if defined(PH0) && !defined(PORTH0)
#  define PORTH0 PH0
#elif defined(PORTH0) && !defined(PH0)
#  define PH0 PORTH0
#endif
#if defined(PH1) && !defined(PORTH1)
#  define PORTH1 PH1
#elif defined(PORTH1) && !defined(PH1)
#  define PH1 PORTH1
#endif
#if defined(PH2) && !defined(PORTH2)
#  define PORTH2 PH2
#elif defined(PORTH2) && !defined(PH2)
#  define PH2 PORTH2
#endif
#if defined(PH3) && !defined(PORTH3)
#  define PORTH3 PH3
#elif defined(PORTH3) && !defined(PH3)
#  define PH3 PORTH3
#endif
#if defined(PH4) && !defined(PORTH4)
#  define PORTH4 PH4
#elif defined(PORTH4) && !defined(PH4)
#  define PH4 PORTH4
#endif
#if defined(PH5) && !defined(PORTH5)
#  define PORTH5 PH5
#elif defined(PORTH5) && !defined(PH5)
#  define PH5 PORTH5
#endif
#if defined(PH6) && !defined(PORTH6)
#  define PORTH6 PH6
#elif defined(PORTH6) && !defined(PH6)
#  define PH6 PORTH6
#endif
#if defined(PH7) && !defined(PORTH7)
#  define PORTH7 PH7
#elif defined(PORTH7) && !defined(PH7)
#  define PH7 PORTH7
#endif

/* PORT J */

#if defined(PJ0) && !defined(PORTJ0)
#  define PORTJ0 PJ0
#elif defined(PORTJ0) && !defined(PJ0)
#  define PJ0 PORTJ0
#endif
#if defined(PJ1) && !defined(PORTJ1)
#  define PORTJ1 PJ1
#elif defined(PORTJ1) && !defined(PJ1)
#  define PJ1 PORTJ1
#endif
#if defined(PJ2) && !defined(PORTJ2)
#  define PORTJ2 PJ2
#elif defined(PORTJ2) && !defined(PJ2)
#  define PJ2 PORTJ2
#endif
#if defined(PJ3) && !defined(PORTJ3)
#  define PORTJ3 PJ3
#elif defined(PORTJ3) && !defined(PJ3)
#  define PJ3 PORTJ3
#endif
#if defined(PJ4) && !defined(PORTJ4)
#  define PORTJ4 PJ4
#elif defined(PORTJ4) && !defined(PJ4)
#  define PJ4 PORTJ4
#endif
#if defined(PJ5) && !defined(PORTJ5)
#  define PORTJ5 PJ5
#elif defined(PORTJ5) && !defined(PJ5)
#  define PJ5 PORTJ5
#endif
#if defined(PJ6) && !defined(PORTJ6)
#  define PORTJ6 PJ6
#elif defined(PORTJ6) && !defined(PJ6)
#  define PJ6 PORTJ6
#endif
#if defined(PJ7) && !defined(PORTJ7)
#  define PORTJ7 PJ7
#elif defined(PORTJ7) && !defined(PJ7)
#  define PJ7 PORTJ7
#endif

/* PORT K */

#if defined(PK0) && !defined(PORTK0)
#  define PORTK0 PK0
#elif defined(PORTK0) && !defined(PK0)
#  define PK0 PORTK0
#endif
#if defined(PK1) && !defined(PORTK1)
#  define PORTK1 PK1
#elif defined(PORTK1) && !defined(PK1)
#  define PK1 PORTK1
#endif
#if defined(PK2) && !defined(PORTK2)
#  define PORTK2 PK2
#elif defined(PORTK2) && !defined(PK2)
#  define PK2 PORTK2
#endif
#if defined(PK3) && !defined(PORTK3)
#  define PORTK3 PK3
#elif defined(PORTK3) && !defined(PK3)
#  define PK3 PORTK3
#endif
#if defined(PK4) && !defined(PORTK4)
#  define PORTK4 PK4
#elif defined(PORTK4) && !defined(PK4)
#  define PK4 PORTK4
#endif
#if defined(PK5) && !defined(PORTK5)
#  define PORTK5 PK5
#elif defined(PORTK5) && !defined(PK5)
#  define PK5 PORTK5
#endif
#if defined(PK6) && !defined(PORTK6)
#  define PORTK6 PK6
#elif defined(PORTK6) && !defined(PK6)
#  define PK6 PORTK6
#endif
#if defined(PK7) && !defined(PORTK7)
#  define PORTK7 PK7
#elif defined(PORTK7) && !defined(PK7)
#  define PK7 PORTK7
#endif

/* PORT L */

#if defined(PL0) && !defined(PORTL0)
#  define PORTL0 PL0
#elif defined(PORTL0) && !defined(PL0)
#  define PL0 PORTL0
#endif
#if defined(PL1) && !defined(PORTL1)
#  define PORTL1 PL1
#elif defined(PORTL1) && !defined(PL1)
#  define PL1 PORTL1
#endif
#if defined(PL2) && !defined(PORTL2)
#  define PORTL2 PL2
#elif defined(PORTL2) && !defined(PL2)
#  define PL2 PORTL2
#endif
#if defined(PL3) && !defined(PORTL3)
#  define PORTL3 PL3
#elif defined(PORTL3) && !defined(PL3)
#  define PL3 PORTL3
#endif
#if defined(PL4) && !defined(PORTL4)
#  define PORTL4 PL4
#elif defined(PORTL4) && !defined(PL4)
#  define PL4 PORTL4
#endif
#if defined(PL5) && !defined(PORTL5)
#  define PORTL5 PL5
#elif defined(PORTL5) && !defined(PL5)
#  define PL5 PORTL5
#endif
#if defined(PL6) && !defined(PORTL6)
#  define PORTL6 PL6
#elif defined(PORTL6) && !defined(PL6)
#  define PL6 PORTL6
#endif
#if defined(PL7) && !defined(PORTL7)
#  define PORTL7 PL7
#elif defined(PORTL7) && !defined(PL7)
#  define PL7 PORTL7
#endif

#endif /* _AVR_PORTPINS_H_ */


 

b707
Offline
Зарегистрирован: 26.05.2017

Efim пишет:

 Поэтому я и указал что это стандартные средства для данного микроконтроллера. Вообще это все сделано для удобства чтоб не путаться. А товарищу выше разъяснять это нету желания т.к. он наговорил мне кучу гадостей, пел какой он крутой прогер, а такие простые вещи не знает.

ну зачем же врать-то? :) О том, что я крутой прогер - я нигде не писал, не имею такой привычки. Извольте подкрепить свои слова цитатой.

Писать про вас гадости - это было, не отрицаю. Но себя не восхвалял.

Что касается того, что я чего-то не знаю -никогда не поздно учиться новому.

Efim
Offline
Зарегистрирован: 04.05.2018

b707

Конечно, я могу вам напомнить эти моменты из темы http://arduino.ru/forum/programmirovanie/2xspi-na-arduino?page=1:

0) Пост 54 - Тут я понял, что вы владеете множеством языков и можете переводить технические документации на лету. Так же стало ясно что ваше мастерство по владению клавиатурой в набирание запросов гугл превзошло мое. 

1) Пост 66 - первые предпосылки к тому что ваш мозг превзошел мой, вы написали GPS навигатор длиною 20 строк). 

2) Пост 75 - вы раскритиковали некоторые мои наблюдения по недостатка платформы arduino, это говорит о том, что вы хорошо знаете эту платформу и знаете все тонкости и нюансы (мы сейчас не про Си чтоб вы понимали). По началу я даже в себе усомнился и все перепроверил но как оказалось ничего не изменилось. Так же из этого поста я понял что вы очень хорошо разбираетесь в библиотеках написанных для arduino

3) Пост 77 - тут я узнал что вы большой специалист по циклу for

4) Пост 78,81 - Дают понять что вы явно интеллектуально выше меня,  хотя вы даже не понимаете что 2 строчки кода это образное выражение. Если хотите знать точно то там 487 строк кода переписанных с нуля.

И после этого вы спрашиваете про PAPBPCPD,) Задаете просто глупейший вопрос. Скорее всего, вы даже не знаете, как напрямую обратится к порту или области памяти в программе вообще без всех этих улучшайзеров имея только даташит. А это ведь все из ассемблера пришло, а вы раскритиковали и это.

b707
Offline
Зарегистрирован: 26.05.2017

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

[quote=Efim]

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

[\quote]

Когда я чего-то не знаю - я никогда не стыжусь этого признать. В данном случае я действительно не знал, что для отдельных битов каждого порта Атмеги328 определены макросы PB0 PB1 и тд.  Я полагал, что подобные макросы есть только на других МК, в частности на СТМ32

 

А вот вы, похоже, крайне болезненно относитесь к любой критике. В прошлый свой приход вы в ответ нз поначалу  довольно дружелюбные замечания устроили срач. Сейчас вы явно пришли с целью реванша - показать, как круто вы решили свою проблему без помощи форума. Но опять заходите неверно - на совершенно спокойный вопрос снова начинаете дрязгу.

Efim
Offline
Зарегистрирован: 04.05.2018

b707

Для какого реванша? Это вы же развиваете тему в данном направлении. А я свои обещания выполняю.

Если вы еще не поняли, поясню. В той теме был хороший человек Alex_Ferrum, дал хорошие советы. И если вы не заметили именно по  его советам и написан код. В посте 20 я подробно расписал что и как будет происходить дальше. За что Alex_Ferrum огромное спасибо! 

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

b707
Offline
Зарегистрирован: 26.05.2017

ну я действительно не хочу провоцировать новый срач. Хорошо, что вы привели ссылку на ту ветку - каждый желающий может пойти и убедится самостоятельно, кто тут кто...

Efim
Offline
Зарегистрирован: 04.05.2018

Конечно поэтому давайте не будем двигаться в данном направление, я давно призывал к взаимоуважению. А по изначальному вопросу могли бы и погуглить, вы ведь в этом мастер)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Забавно. Не понимаю, чего там вы не поделили.

Мне не понятна изначальная задача программы. Было несколько блоков от разных рессиверов и хотелось их соединить? Или как?

У меня самого RX-V475 и менять его на RX-V371 не вижу смысла. Лучше починю. Наоборот я бы понял.

Efim
Offline
Зарегистрирован: 04.05.2018

mykaida

А у меня наоборот есть RX-V371 но сгорел процессор на плате digital, а т.к. валялась плата от RX-V475 то решил ее прикрутить) Появились допы в виде USB и интернет радио. Заодно сделал даташит для r2a15220fp, может самоделкиным пригодится. А покупать новую плату по цене ресивера не было желания.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Efim пишет:

mykaida

 Заодно сделал даташит для r2a15220fp, может самоделкиным пригодится. 

Дело нужное! А если сделаешь библиотеку, так и мировая известность. Удачи! 

Efim
Offline
Зарегистрирован: 04.05.2018

mykaida

Спасибо!