Multiwii를 arduino mega board에 포팅할때 I2C 포트 찾기? by 설악이




Multiwii를 Arduino mega를 사용하여 만들고 싶다는 분이 있으셔서 간단히 설명 합니다. 

일단 Arduino의 경우 모든 포트의 셋팅은  setup 에서 하고 있습니다. 
그럼 우리도 핀에 대한 정보는 여기서 확인이 가능하겠죠?

그럼 Multiwii.cpp에서 setup() 을 찾아가 보겠습니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
void setup() {
  #if !defined(GPS_PROMINI)
    SerialOpen(0,SERIAL0_COM_SPEED);
    #if defined(PROMICRO)
      SerialOpen(1,SERIAL1_COM_SPEED);
    #endif
    #if defined(MEGA)
      SerialOpen(1,SERIAL1_COM_SPEED);
      SerialOpen(2,SERIAL2_COM_SPEED);
      SerialOpen(3,SERIAL3_COM_SPEED);
    #endif
  #endif
  LEDPIN_PINMODE;
  POWERPIN_PINMODE;
  BUZZERPIN_PINMODE;
  STABLEPIN_PINMODE;
  POWERPIN_OFF;
  initOutput();
  readGlobalSet();
  #ifndef NO_FLASH_CHECK
    #if defined(MEGA)
      uint16_t i = 65000;                             // only first ~64K for mega board due to pgm_read_byte limitation
    #else
      uint16_t i = 32000;
    #endif
    uint16_t flashsum = 0;
    uint8_t pbyt;
    while(i--) {
      pbyt =  pgm_read_byte(i);        // calculate flash checksum
      flashsum += pbyt;
      flashsum ^= (pbyt<<8);
    }
  #endif
  #ifdef MULTIPLE_CONFIGURATION_PROFILES
    global_conf.currentSet=2;
  #else
    global_conf.currentSet=0;
  #endif
  while(1) {                                                    // check settings integrity
  #ifndef NO_FLASH_CHECK
    if(readEEPROM()) {                                          // check current setting integrity
      if(flashsum != global_conf.flashsum) update_constants();  // update constants if firmware is changed and integrity is OK
    }
  #else
    readEEPROM();                                               // check current setting integrity
  #endif  
    if(global_conf.currentSet == 0break;                      // all checks is done
    global_conf.currentSet--;                                   // next setting for check
  }
  readGlobalSet();                              // reload global settings for get last profile number
  #ifndef NO_FLASH_CHECK
    if(flashsum != global_conf.flashsum) {
      global_conf.flashsum = flashsum;          // new flash sum
      writeGlobalSet(1);                        // update flash sum in global config
    }
  #endif
  readEEPROM();                                 // load setting data from last used profile
  blinkLED(2,40,global_conf.currentSet+1);          
  configureReceiver();
  #if defined (PILOTLAMP) 
    PL_INIT;
  #endif
  #if defined(OPENLRSv2MULTI)
    initOpenLRS();
  #endif
  initSensors();
  #if defined(I2C_GPS) || defined(GPS_SERIAL) || defined(GPS_FROM_OSD)
cs


위에 66번 째 라인에 initSensor() 가 보이네요.

자 그럼 initSensors를 따라가 보겠습니다.
sensors.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void initSensors() {
  delay(200);
  POWERPIN_ON;
  delay(100);
  i2c_init();
  delay(100);
  if (GYRO) Gyro_init();
  if (BARO) Baro_init();
  if (MAG) Mag_init();
  if (ACC) ACC_init();
  if (SONAR) Sonar_init();
  f.I2C_INIT_DONE = 1;
}
 
cs
그럼 딱... i2c_init() 함수가 위의 5번째 라인에서 보이는군요.. 

그럼 또 따라가 보겠습니다. (우리가 원하는건 i2C 핀 번호이니까요 ^^ 어딘가 있을겁니다. 자자 고고)

sensors.cpp
1
2
3
4
5
6
7
8
9
10
void i2c_init(void) {
  #if defined(INTERNAL_I2C_PULLUPS)
    I2C_PULLUPS_ENABLE
  #else
    I2C_PULLUPS_DISABLE
  #endif
  TWSR = 0;                                    // no prescaler => prescaler = 1
  TWBR = ((F_CPU / I2C_SPEED) - 16/ 2;       // change the I2C clock rate
  TWCR = 1<<TWEN;                              // enable twi module, no interrupt
}
cs

자 뭔지는 모르겠지만 I2C_PULLUPS_ENABLE 나  I2C_PULLUPS_DISABLE 이 보이네요.. 
이건 어디서 선언했을까요??? 
또 찾아 봅시다. 

찾아보니 defs.h 에서 세군대에서 선언이 되어 있습니다. 
그중 우리가 찾고 싶은건 MEGA 이니까요..599line에 가면 아래 부분이 나오네요
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**************************  all the Mega types  ***********************************/
#if defined(MEGA)
  #define LEDPIN_PINMODE             pinMode (13, OUTPUT);pinMode (30, OUTPUT);
  #define LEDPIN_TOGGLE              PINB  |= (1<<7); PINC  |= (1<<7);
  #define LEDPIN_ON                  PORTB |= (1<<7); PORTC |= (1<<7);
  #define LEDPIN_OFF                 PORTB &= ~(1<<7);PORTC &= ~(1<<7);
  #define BUZZERPIN_PINMODE          pinMode (32, OUTPUT);
  #if defined PILOTLAMP
    #define    PL_PIN_ON    PORTC |= 1<<5;
    #define    PL_PIN_OFF   PORTC &= ~(1<<5);
  #else
    #define BUZZERPIN_ON               PORTC |= 1<<5;
    #define BUZZERPIN_OFF              PORTC &= ~(1<<5);
  #endif 
    
  #if !defined(DISABLE_POWER_PIN)
    #define POWERPIN_PINMODE           pinMode (37, OUTPUT);
    #define POWERPIN_ON                PORTC |= 1<<0;
    #define POWERPIN_OFF               PORTC &= ~(1<<0);
  #else
    #define POWERPIN_PINMODE           ;
    #define POWERPIN_ON                ;
    #define POWERPIN_OFF               ;
  #endif
  #define I2C_PULLUPS_ENABLE         PORTD |= 1<<0; PORTD |= 1<<1;       // PIN 20&21 (SDA&SCL)
  #define I2C_PULLUPS_DISABLE        PORTD &= ~(1<<0); PORTD &= ~(1<<1);
cs

여기서.. 25번 줄에 20번과 21번이 SDA 와 SCL 이 나온다고 하네요. ^^;

일단 찾고자 한것은 찾았는데. .한가지 궁굼해 지는것.. 어디서  MEGA 를 선언할까요??

모 또 찾아 보면 되겠죠? ^^;
찾아 봅시다..

def.h 에 아래 부분이 있습니다. 
1
2
3
4
5
6
7
8
9
10
11
12
13
/**************************************************************************************/
/***************             Proc specific definitions             ********************/
/**************************************************************************************/
// Proc auto detection
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
  #define PROMINI
#endif
#if defined(__AVR_ATmega32U4__) || defined(TEENSY20)
  #define PROMICRO
#endif
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__)
  #define MEGA
#endif
cs

오...#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2560__) ||  defined(__AVR_ATmega2561__)
이렇게 네가지중 하나라도 선언이 되어 있으면  MEGA 를 선언하는군요..

마지막으로.. 이 네가지 선언은 어디서 하는걸까요??? 필자가 알기로는 arduino sdk 에서 빌드를 할때 칩을 선택하죠?
그렇게 하시면 pre define 되는걸로 알고 있습니다. (못 믿으시겠다구요.. 그럼 저기에 error 코드 넣고 빌드해보세요 ^^)

일단.. 메일로 궁굼하다고 보내주신 분.. ^^ 실명은 밝히지 못하겠고.. 메일로 답변 달면 이쁘게 답변 못들아서 이렇게 답변 사항 올려봅니다. 



덧글

  • 달곰이 2016/06/01 14:34 # 삭제 답글

    감동입니다..... 어떻게 찾는지 이렇게 잘 설명해주시다니.... 너무 감사합니다 ㅠㅠ
  • 설악이 2016/06/01 14:50 #

    ^^;
    도움이 되었다니 다행입니다.
    같이 공부하는거니까요.. 혹시 또 궁굼하신거 있음 메일로 문의 주세요. ^^;
댓글 입력 영역