Description:By default, U8g2 assumes the lowest possible I2C address of the display. This procedure will assign the I2C address to u8g2, if the display is configured to a different address. Call this procedure beforebegin().
Arguments:
u8g2: A pointer to the u8g2 structure.
adr: I2C address multiplied with 2 (the lowest bit must be zero)
Having gotten the program to work with two SSD1306 128x64 0.96" displays, I'm trying to move forward with the actual second display I wish to use. This is an Adafruit Featherwing OLED display which is listed as a SSD1306 128x32 I2C. I find no direct constructor for a display of this dimension on the 1306 (I saw one for the SSD1305, but it didn't work properly.)
My desire is to use a primary display of 128x64: U8G2_SSD1306_128X64_NONAME_F_HW_I2C screen1
and the secondary display of 128x32, which would be something like: U8G2_SSD1306_128X32_NONAME_F_HW_I2C screen2
As of now the second constructor 'U8G2_SSD1306_128X32_NONAME_F_HW_I2C' does not name a type.
Also, I belive I found some errors in the documentation for the constructors. There are many listed as: U8G2_SSD1306_128X64_NONAME_F_HW_I2C(rotation, [reset [, clock, data]]), but in the actual code I'm using it's "rotation, clock, data, reset"
일반적으로 아두이노를 사용할 때 소스코드외에 만들어지는 파일에 대해서는 관심이 없다. 사실 관심을 가질 필요가 거의 없다. 다만, 강의자료를 만드는 입장에서 아두이노라는 임베디드 시스템에 프로그램이 들어가는 과정, 그 안에 있는 프로그램을 밖으로 꺼내는 과정등을 설명할 때 아주 잠간이지만 hex 파일이라는 것을 소개하게 된다.
이 글은 hex 파일에 대해 간략한 소개와 함께 아두이노 사용시 만들어지는 hex 파일에 대한 겉핧기식의 정보를 제공한다.
아두이노 HEX 파일 위치
아두이노 IDE 를 실행시킨 후 다음과 같은 간단한 프로그램을 만들어서 컴파일 한 후 만들어지는 hex 파일을 찾도록 한다.
윈도우10 운영체제를 사용하고 있다면 [윈도우]키를 누른다음 %temp% 를 입력하면 폴더가 검색된다. 내 컴퓨터의 경우C:\Users\event\AppData\Local\Temp폴더가 나온다.
폴더를 찾아 간 다음 수정한 날짜를 최신으로 설정하면 방금 만든 파일과 폴더가 나온다. 폴더를 찾아서 내부에 보면 아두이노로 만든 파일들이 나온다.
파일 중 확장자가 hex 인 것이 헥사파일이다. 즉 아두이노에 들어갈 이진파일의 내용이다.
HEX 파일 내용 (Format)
hex 파일은 소스파일을 제대로 컴파일 했을때만 만들어진다. 즉, 오류가 발생하거나 아직 컴파일하지 않은 소스파일에 대해서는 hex 파일이 만들어지지 않는다.
Byte count, two hex digits (one hex digit pair), indicating the number of bytes (hex digit pairs) in the data field. The maximum byte count is 255 (0xFF). 16 (0x10) and 32 (0x20) are commonly used byte counts.
Address, four hex digits, representing the 16-bit beginning memory address offset of the data. The physical address of the data is computed by adding this offset to a previously established base address, thus allowing memory addressing beyond the 64 kilobyte limit of 16-bit addresses. The base address, which defaults to zero, can be changed by various types of records. Base addresses and address offsets are always expressed as big endian values.
Record type (see record types below), two hex digits, 00 to 05, defining the meaning of the data field.
Data, a sequence of n bytes of data, represented by 2n hex digits. Some records omit this field (n equals zero). The meaning and interpretation of data bytes depends on the application.
Checksum, two hex digits, a computed value that can be used to verify the record has no errors.
OLD NEW OLD NEW ============================== 't' 'u' 0x74 0x75 222 223 0xDE 0xDF 1046 1047 0x416 0x417
‘t’ 의 아스키코드는 0x74 고, ‘u’ 의 아스크코드는 0x75 다. 즉 4와 5가 다르다. (1) 에서 이 부분을 확인할 수 있다. 223 을 16진수로 고치면 0xDE 이고, 224를 16진수로 고치면 0xDF 이다. E와 F가 다르가 나오는 부분이 (2)이다. 마찬가지로 1046 을 16진수로 고치면 0x416 이고 1을 더한 값이 0x417 이다. (3)에서 6과 7이 다르게 나온다.
여기까지 아두이노 코드를 PC 에서 아두이노로 넘길 때 avr-gcc 를 사용해서 만들어지는 hex 파일에 대해 간략히 살펴보았다. 이 내용은 추후에 아두이노안에 들어있는 이진 파일을 받아온 후 어셈블리코드로 재구성할 때 도움이 된다.
사실 최근들어 어셈블리코드는 일반적으로 거의 사용되지 않는다. 사용되지 않는 이유는 첫째 C 컴파일러의 성능이 좋아졌기 때문이다. 불과 몇년전만 하더라도 C로 만들어진 8051 이나 AVR 코드를 신뢰하지 못하는 개발자들이 있었다. 그래서 시간이 걸려도 직접 어셈블러로 코드를 만들곤 했다. 하지만 컴파일러의 성능이 좋아지면서 이제는 C로 만들거나 어셈블러로 개발자가 직접 최적화를 한 것이 큰 차이를 가지지 않게 되었다. 또한 MCU 들의 성능이 과거에 비해 좋아지고 있다. 한 비트의 의미가 예전같지 않게 된 것이다.
아두이노가 대표적이다. 아두이노 우노는 Atmega328 AVR 칩을 사용하고 플래시메모리가 32kB 나 된다. SRAM 2kB, EEPROM 1kB 를 가지고 있다. 2000년대 초반에 8051을 사용할 때 저정도의 메모리는 상상하기 힘든 것이었다. 한참 8051 에 빠져있을때 AT89C51 을 사용해서 기존과 다른 8051 보드를 직접 만들어 사용한 적이 있다. AT89C51 은 4kB 플래시메모리를 가지고 있었고, 그 당시 이정도면 매우 훌륭한 MCU 였다. 아두이노 메가는 Atmega2560 칩을 사용하고, 메모리는 플래시 256kB 를 가지고 있다. Atmega2560 칩은 3D 프린터의 제어기로 일반적으로 사용된다.