31/jan/2013 新規
26/dec/2015 更新
Arduino の CPU 能力をパワーアップする基板です。
本基板 (Atmel 製 ATmega1284P:以下「Uno1284P 基板」と呼びます) を、Arduino UNO R3 の DIP 28ピン CPU (Atmel 製 ATmega328P) と換装させる事で、
Arduino の CPU 能力をパワーアップさせます。
プログラムメモリは 128 kB (Arduino UNO R3 と比べて、4倍)、SRAM は 16 kB (同8倍)、EEPROM は 4kB (同4倍)、I/O は32点 (同+12点) に強化されます。
ブートローダー(Optiboot, 1kBサイズ) 書き込み済みですので、組み立てて換装すれば、即、動きます。
御注意!!:CPU が表面実装タイプの Arduino では、本基板は換装できません!!DIP タイプのみ換装可能です。
本製品は組み立て式キットとなっています。組み立て方は組立て方法を御覧下さい。
2015/12/26 追記:Arduino IDE 1.6.7 に暫定対応しました。
2014/2/3 追記:Arduino IDE 付属の SoftwareSerial ライブラリと GSM ライブラリで、コンパイルが通らなかったバグを修正しました。
2013/7/10 追記:SPI 通信機能において、Arduino UNO R3 と非互換な部分が有る事が判明しました。 詳細は、後述の SPI について をご覧下さい。
Q | A |
なぜ Arduino 互換機ではなく、CPU 換装基板なのですか? | その方が安上がりだからです。現状、Arduino UNO R3 が 3000円以下、これに Uno1284P 基板を加えても 6000円を切りますが、 Arduino 互換機にした場合、相当数が見込めないと、この値段以下にするのは難しいだろう、と判断しました。 |
既に Arduino Mega2560 R3 があるじゃないか。これって必要? | @ Arduino Mega よりも小型にできる A Arduino Mega よりもシールドの互換性が高い(ハズ) B SRAM が 16kB と大きい |
Sanguino と、どう違うの? | ピンの並びが違っています。そもそも Sanguino 基板は Arduino 用シールドが物理的に挿さりません。 |
Bobuino と、どう違うの? | ピンの並びが違っています。当初、Bobuino とピン並びを一緒にしようかと思っていたのですが、Bobuino の PWM のピン配置が Arduino 互換で無いので、 色々と見直していくうちに、全然別物になってしまいました。 |
スライドスイッチを手で切り替えるのが面倒くさい | 追加された I/O 12点から3点割り振って、自動切換えさせる、というのは考えたのですが、その為の部品によるコストアップ、Arduino IDE の改造やライブラリの追加、 3点の I/O が自由に使えなくなる事、そして、そもそも頻繁に切り替える事はあるのか?と考えて、結局、手で切り替える方法にしました。 |
本製品は、以下のサイトで取り扱って頂いております。
(株)スイッチサイエンス様
本製品は、電源を OFF にした状態で、スライド SW の切り替えを行ってください。通電中にスライド SW を切り替えますと、IC 等を破壊する恐れがあります。
電源を OFF にした状態でも、スライド SW を切り替える時は、静電気を逃がしてから行ってください。
また、本製品は端子等が露出しており、ショートなどで容易に故障しやすくなっておりますので、取り扱いには十分に注意してください。
鋭利な部分も多数有りますので、怪我等に十分に注意してください。
本製品は人命等に関わる装置への利用につきまして、考慮されておりません。
また、本製品を使用した事によって発生しました如何なる事象につきまして、弊社は責任を負いかねますので御了承下さい。
寸法 | : | 幅約49mm×長さ約35.6mm | ||
高さ | : | 約7.5mm | ※ スライドSW から ピンヘッダーの根元まで(更に ICソケットに挿さるピン長が約4mm あります) | |
固定方法 | : | DIP 28ピン | ※ IC ソケットに挿入して、固定させます | |
駆動電圧 | : | 直流+5V | ※ +3.3V での動作は未確認です | |
確認した基板 | : | Arduino UNO R3 AE-ATmega 基板 | ※ これ以外の基板では、物理的に挿さるかどうかを含めて、確認しておりません。 |
Arduino UNO R3 | Uno1284P | コメント | ||||
CPU 型番 | ATmega328P | ATmega1284P | Atmel 社製 | |||
Flash 容量 | 32 kB | 128 kB | 4倍 ※但し 1kB はブートローダー領域に使用済み | |||
SRAM 容量 | 2 kB | 16 kB | 8倍 | |||
EEPROM 容量 | 1 kB | 4 kB | 4倍 | |||
I/O 点数 | 20点 | 32点 | +12点 (D14〜D23, A6〜A7 が追加) | |||
├ ADC 点数 | 6点 | 8点 | +2点 (A6〜A7 が追加) | |||
├ PWM 点数 | 6点 | 8点 | +2点 | |||
└ 割込み点数 | 2点 | 3点 | +1点 (INT2 が追加) | |||
ブートローダー | Optiboot, 512Bサイズ | Optiboot, 1kBサイズ | ※ ATmega1284P の仕様上、ブートローダー領域は 1kB が最小で、512B に設定できません。 |
左側 | 説明 | 右側 | 説明 | |||
SW1 | PWM11 | pin11 を PWM 出力にします。 SPI 通信は不可になります。 | SPI | SPI 通信する時は、こちらに設定します。 代替機能:pin8 が PWM 出力可能です。 | ||
SW2 | PWM3 | pin3 を PWM 出力にします。 代替機能:pin4 が INT1 割込みになります。 | INT | pin3 を INT1 割込みにします。 代替機能:pin4 が PWM 出力可能です。 | ||
SW3 | TWI | pin A4/A5 を TWI 通信にします。 アナログ入力 A4/A5 は EXT2 のみ、になります。 | ANA | pin A4/A5 をアナログ入力 A4/A5 にします。 TWI 通信は EXT3 を使えば、引き続き使用可能です。 |
############################################################## uno1284p.name=Uno1284P uno1284p.upload.protocol=arduino uno1284p.upload.maximum_size=130048 uno1284p.upload.speed=115200 uno1284p.bootloader.low_fuses=0xFF uno1284p.bootloader.high_fuses=0xDE uno1284p.bootloader.extended_fuses=0xFD uno1284p.bootloader.path=optiboot_uno1284p uno1284p.bootloader.file=optiboot_uno1284p.hex uno1284p.bootloader.unlock_bits=0xFF uno1284p.bootloader.lock_bits=0xCF uno1284p.build.mcu=atmega1284p uno1284p.build.f_cpu=16000000L uno1284p.build.core=arduino uno1284p.build.variant=uno1284p |
// Uno1284P #elif defined(__AVR_ATmega1284P_UNO1284P__) #define TOTAL_ANALOG_PINS 8 #define TOTAL_PINS 32 // 24 digital + 8 analog #define VERSION_BLINK_PIN 13 #define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) < TOTAL_PINS) #define IS_PIN_ANALOG(p) ((p) >= 24 && (p) < TOTAL_PINS) #define IS_PIN_PWM(p) digitalPinHasPWM(p) #define IS_PIN_SERVO(p) (IS_PIN_DIGITAL(p) && ((p) - 2) < MAX_SERVOS) #define IS_PIN_I2C(p) ((p) == 16 || (p) == 17) #define PIN_TO_DIGITAL(p) (p) #define PIN_TO_ANALOG(p) ((p) - 24) #define PIN_TO_PWM(p) PIN_TO_DIGITAL(p) #define PIN_TO_SERVO(p) ((p) - 2) |
#elif defined(__AVR_ATmega1284P_UNO1284P__) // Uno1284P // Two Wire (aka I2C) ports uint8_t const SDA_PIN = 17; uint8_t const SCL_PIN = 16; // SPI port uint8_t const SS_PIN = 10; uint8_t const MOSI_PIN = 11; uint8_t const MISO_PIN = 12; uint8_t const SCK_PIN = 13; static const pin_map_t digitalPinMap[] = { {&DDRD, &PIND, &PORTD, 0}, // D0 0 {&DDRD, &PIND, &PORTD, 1}, // D1 1 {&DDRD, &PIND, &PORTD, 2}, // D2 2 {&DDRD, &PIND, &PORTD, 3}, // D3 3 {&DDRD, &PIND, &PORTD, 7}, // D7 4 {&DDRB, &PINB, &PORTB, 4}, // B4 5 {&DDRB, &PINB, &PORTB, 3}, // B3 6 {&DDRB, &PINB, &PORTB, 2}, // B2 7 {&DDRD, &PIND, &PORTD, 6}, // D6 8 {&DDRD, &PIND, &PORTD, 5}, // D5 9 {&DDRD, &PIND, &PORTD, 4}, // D4 10 {&DDRB, &PINB, &PORTB, 5}, // B5 11 {&DDRB, &PINB, &PORTB, 6}, // B6 12 {&DDRB, &PINB, &PORTB, 7}, // B7 13 {&DDRB, &PINB, &PORTB, 0}, // B0 14 {&DDRB, &PINB, &PORTB, 1}, // B1 15 {&DDRC, &PINC, &PORTC, 0}, // C0 16 {&DDRC, &PINC, &PORTC, 1}, // C1 17 {&DDRC, &PINC, &PORTC, 2}, // C2 18 {&DDRC, &PINC, &PORTC, 3}, // C3 19 {&DDRC, &PINC, &PORTC, 4}, // C4 20 {&DDRC, &PINC, &PORTC, 5}, // C5 21 {&DDRC, &PINC, &PORTC, 6}, // C6 22 {&DDRC, &PINC, &PORTC, 7}, // C7 23 {&DDRA, &PINA, &PORTA, 0}, // A0 24 {&DDRA, &PINA, &PORTA, 1}, // A1 25 {&DDRA, &PINA, &PORTA, 2}, // A2 26 {&DDRA, &PINA, &PORTA, 3}, // A3 27 {&DDRA, &PINA, &PORTA, 6}, // A6 28 {&DDRA, &PINA, &PORTA, 7}, // A7 29 {&DDRA, &PINA, &PORTA, 4}, // A4 30 {&DDRA, &PINA, &PORTA, 5}, // A5 31 }; //------------------------------------------------------------------------------ |
#elif defined(__AVR_ATmega1284P_UNO1284P__) inline static void initSS() { DDRD |= _BV(4); }; inline static void setSS() { PORTD &= ~_BV(4); }; inline static void resetSS() { PORTD |= _BV(4); }; |
||defined(__AVR_ATmega328P__) || defined(__AVR_ATmega1284P_UNO1284P__) |
defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__) || defined(__AVR_ATmega1284P_UNO1284P__) |
ピン名称 | Arduino UNO R3 | ATmega328P | Arduino Leonardo (参考) | ATmega32U4 | Uno1284P | ATmega1284P | Uno1284P のコメント | |||
pin0 | RX | PD0 | RX1/INT2 | PD2 | RX0/T3 | PD0 | ||||
pin1 | TX | PD1 | TX1/INT3 | PD3 | TX0 | PD1 | ||||
pin2 | INT0 | PD2 | INT1/SDA | PD1 | INT0/RX1 | PD2 | ||||
pin3 | PWM (OC2B)/INT1 | PD3 | PWM (OC0B)/INT0/SCL | PD0 | INT1/TX1 | PD3 | SW2で pin4(PWM) とswap可能 | |||
pin4 | T0/XCK | PD4 | ADC8/ICP1 | PD4 | PWM (OC2A) | PD7 | SW2で pin3(INT1) とswap可能 | |||
pin5 | PWM (OC0B)/T1 | PD5 | PWM (0C3A) | PC6 | PWM (OC0B)/~SS | PB4 | SPI 使用時は出力モードのみ (2013/7/10追記) | |||
pin6 | PWM (OC0A)/AIN0 | PD6 | PWM (0C4D)/ADC10/T0 | PD7 | PWM (OC0A)/AIN1 | PB3 | ||||
pin7 | AIN1 | PD7 | AIN0/INT6 | PE6 | AIN0/INT2 | PB2 | ||||
pin8 | ICP1/CLKO | PB0 | ADC11 | PB4 | PWM (OC2B)/ICP1 | PD6 | SW1で pin11(MOSI) とswap可能 ※SPI 使用不能になる | |||
pin9 | PWM (OC1A) | PB1 | PWM (0C1A)/ADC12 | PB5 | PWM (OC1A) | PD5 | ||||
pin10 | PWM (OC1B)/~SS | PB2 | PWM (0C1B)/ADC13 | PB6 | PWM (OC1B)/XCK1 | PD4 | ||||
pin11 | PWM (OC2A)/MOSI | PB3 | PWM (0C0A/1C)/~RTS | PB7 | MOSI/ICP3 | PB5 | SW1で pin8(PWM) とswap可能 ※SPI 使用不能になる | |||
pin12 | MISO | PB4 | ADC9/T1 | PD6 | PWM (OC3A)/MISO | PB6 | ||||
pin13 | SCK | PB5 | PWM (OC4A)/ICP3/CLKO | PC7 | PWM (OC3B)/SCK | PB7 | ||||
pin14 | = pin A0 | PC0 | MISO/PDO | PB3 | T0/XCK0 | PB0 | 拡張コネクタEXT1 | |||
pin15 | = pin A1 | PC1 | SCK/PDI | PB1 | T1/CLKO | PB1 | 拡張コネクタEXT1 | |||
pin16 | = pin A2 | PC2 | MOSI | PB2 | SCL | PC0 | 拡張コネクタEXT3:SW3で pin A5(ADC7) と切替え可能 | |||
pin17 | = pin A3 | PC3 | SS/RXLED | PB0 | SDA | PC1 | 拡張コネクタEXT3:SW3で pin A4(ADC6) と切替え可能 | |||
pin18 | = pin A4 | PC4 | = pin A0 | PF7 | TCK | PC2 | 拡張コネクタEXT3 | |||
pin19 | = pin A5 | PC5 | = pin A1 | PF6 | TMS | PC3 | 拡張コネクタEXT3 | |||
pin20 | = pin A2 | PF5 | TDO | PC4 | 拡張コネクタEXT2 | |||||
pin21 | = pin A3 | PF4 | TDI | PC5 | 拡張コネクタEXT2 | |||||
pin22 | = pin A4 | PF1 | TOSC1 | PC6 | 拡張コネクタEXT2 | |||||
pin23 | = pin A5 | PF0 | TOSC2 | PC7 | 拡張コネクタEXT2 | |||||
pin A0 | ADC0 | PC0 | ADC7/TDI | PF7 | ADC0 | PA0 | ||||
pin A1 | ADC1 | PC1 | ADC6/TDO | PF6 | ADC1 | PA1 | ||||
pin A2 | ADC2 | PC2 | ADC5/TMS | PF5 | ADC2 | PA2 | ||||
pin A3 | ADC3 | PC3 | ADC4/TCK | PF4 | ADC3 | PA3 | ||||
pin A4 | ADC4/SDA | PC4 | ADC1 | PF1 | ADC6 | PA6 | 拡張コネクタEXT2:SW3で pin17(SDA) と切替え可能 | |||
pin A5 | ADC5/SCL | PC5 | ADC0 | PF0 | ADC7 | PA7 | 拡張コネクタEXT2:SW3で pin16(SCL) と切替え可能 | |||
pin A6 | ADC8 (= pin4) | PD4 | ADC4 | PA4 | 拡張コネクタEXT1 | |||||
pin A7 | ADC10 (= pin6) | PD7 | ADC5 | PA5 | 拡張コネクタEXT1 | |||||
pin A8 | ADC11 (= pin8) | PB4 | ||||||||
pin A9 | ADC12 (= pin9) | PB5 | ||||||||
pin A10 | ADC13 (= pin10) | PB6 | ||||||||
pin A11 | ADC9 (= pin12) | PD6 | ||||||||
pin SCL | = pin A5 | PC5 | = pin3 | PD0 | = pin16 | PC0 | UNO R3 追加ピンソケット | |||
pin SDA | = pin A4 | PC4 | = pin2 | PD1 | = pin17 | PC1 | UNO R3 追加ピンソケット | |||
pin MOSI | = pin11 | PB3 | = pin16 | PB2 | = pin11 | PB5 | ICSP ピン | |||
pin MISO | = pin12 | PB4 | = pin14 | PB3 | = pin12 | PB6 | ICSP ピン | |||
pin SCK | = pin13 | PB5 | = pin15 | PB1 | = pin13 | PB7 | ICSP ピン |
#include <Arduino.h> #include <PWM_pins.h> void setup() { } void loop() { for (int val = 0 ; val <= 255; val +=5) { analogWrite(PWM13, val); delay(30); } for (int val = 255 ; val >= 0; val -=5) { analogWrite(PWM13, val); delay(30); } } |
Arduino UNO R3 | Arduino Leonardo | Uno1284P | 説明 | |||
PWM2 | × | × | × | |||
PWM3 | ○ | ○ | ○ (実際は PWM4 指定した時と同じ挙動) | SW2 で切替え | ||
PWM4 | × | × | ○ | SW2 で切替え | ||
PWM5 | ○ | ○ | ○ | |||
PWM6 | ○ | ○ | ○ | |||
PWM7 | × | × | × | |||
PWM8 | × | × | ○ | SW1 で切替え | ||
PWM9 | ○ | ○ | ○ | |||
PWM10 | ○ | ○ | ○ | |||
PWM11 | ○ | ○ | ○ (実際は PWM8 指定した時と同じ挙動) | SW1 で切替え | ||
PWM12 | × | × | ○ | |||
PWM13 | × | ○ | ○ | Lチカ可能 |
pinMode(10, OUTPUT); digitalWrite(10, HIGH); |
ワード・アドレス | バイト・アドレス | 使用領域名称 | 説明 | ||
0x0000 〜 | 0x00000 〜 | vector テーブル領域 | 140バイト固定サイズ | ||
0x0046 〜 | 0x0008C 〜 | PROGMEM 領域 | PROGMEM 宣言されたデータが配置される。(.progmem.data セクション) | ||
vvvv 〜 | vvvv × 2 〜 | 関数テーブル領域 | コンストラクタ/デストラクタ関数テーブルが配置される場合がある (.ctors/.dtors セクション) 存在する場合、バイト・アドレス 0x10000 を超えてはならない(超えると 100%暴走します。後述) | ||
wwww 〜 | wwww × 2 〜 | プログラム・コード領域 | プログラム・コード開始アドレス (.init0 セクション) | ||
0x8000 | 0x10000 | ※ HIGH_PROGMEM を使用する場合は、プログラム・コードがバイト・アドレス 0x10000 を跨いでいる必要がある。 | |||
(xxxx - 1) 〜 | (xxxx - 1) × 2 〜 | プログラム・コード終了アドレス (.fini1 セクション) | |||
xxxx 〜 | xxxx × 2 〜 | HIGH_PROGMEM 領域 | HIGH_PROGMEM 宣言されたデータが配置される。(.fini0 セクション) バイト・アドレス 0x10000 以上に配置されている必要がある。 | ||
yyyy 〜 | yyyy × 2 〜 | DATA 領域の初期値 | startup ルーチンで SRAM にコピーされる。コピー後は SRAM の方を Read/Write するので、ここのはアクセスされない。 | ||
zzzz 〜 | zzzz × 2 〜 | 空き領域 | |||
0xFE00 〜 | 0x1FC00 〜 | BootLoader 領域 | 1kB 固定。Arduino IDE からは読み書きできません(読み書きするには AVRISP mkII 等が必要) | ||
0xFFFF | 0x1FFFE | Memory 末尾 |
バイト・アドレス | 使用領域名称 | 説明 | ||
0x0000 〜 | SFR 領域 | 256バイト固定サイズ | ||
0x0100 〜 | 内蔵 SRAM 開始 | Stack 領域含めて最大 16384 バイト | ||
ssss 〜 | Stack 領域 | |||
0x40FF | 内蔵 SRAM 末尾 | |||
0x4100 〜 | SRAM 未実装 | ATmega1284P は拡張 SRAM 機能が無いので、アクセス不可 | ||
0xFFFF | Memory 末尾 |
HIGH_PROGMEM const char | abc [10000]; | ||||||
HIGH_PROGMEM const uint16_t | xyz [10000]; |
データの位置 | ポインタのサイズ | Uno1284P で指定できるアドレスの範囲 | lpm/elpm ラッパー関数名 | 使用可能な関数名の書式 | 説明 | |
SRAM 上 | 2バイト長 | 0x0000〜0x40FF | 無し | xxx | 読み書き可 | |
フラッシュメモリ上 | PROGMEM 宣言 | 2バイト長 | 0x000000〜0x00FFFF | pgm_read_xxx 関数群 | xxx_P | 読み出しのみ |
4バイト長 | 0x000000〜0x01FBFF | pgm_read_xxx_far 関数群 | xxx_PF (最新の avr-gcc のみ。Arduino IDE 1.0.5 では不可) | |||
HIGH_PROGMEM 宣言 | 2バイト長 | 0x010000〜0x01FBFF | pgm_read_xxx_hi 関数群 | |||
4バイト長 | 0x000000〜0x01FBFF | pgm_read_xxx_far 関数群 | xxx_PF (最新の avr-gcc のみ。Arduino IDE 1.0.5 では不可) |
戻り値 | 関数名 | 引数 | 説明 | |
void | UseHighProgMem | (void) | 以下の関数を使用する前に1回だけ呼び出す。(RAMPZ を1に設定するだけ) | |
uint8_t | pgm_read_byte_hi | (uint8_t *addr) | addr で指定された HIGH_PROGMEM 領域のバイトデータを1つ読み出す。 | |
uint16_t | pgm_read_word_hi | (uint16_t *addr) | addr で指定された HIGH_PROGMEM 領域のワードデータを1つ読み出す。 | |
uint32_t | pgm_read_dword_hi | (uint32_t *addr) | addr で指定された HIGH_PROGMEM 領域のダブルワードデータを1つ読み出す。 | |
float | pgm_read_float_hi | (float *addr) | addr で指定された HIGH_PROGMEM 領域の単精度浮動小数点データを1つ読み出す。 | |
void * | memcpy_PH | (void * dest, const void * src, size_t len) | src で指定された HIGH_PROGMEM 領域のデータを、SRAM 上の dest に len バイト分、コピーする。戻り値は dest そのもの。 |
PROGMEM const char str1 [32500] = "abcdefg1"; // フラッシュメモリ前半 64kB 内に配置 PROGMEM const char str2 [32500] = "abcdefg2"; // 同上 HIGH_PROGMEM const char str3 [32500] = "abcdefg3"; // フラッシュメモリ後半 64kB 内に配置 char buff [10000]; // SRAM 上に 10000バイト確保 void setup() { char ch; memcpy_P ( &ch, str1, 1 ); // コンパイル時の最適化で str1 が消えてしまわない為の対策 memcpy_P ( &ch, str2, 1 ); // コンパイル時の最適化で str2 が消えてしまわない為の対策 UseHighProgMem(); // HIGH_PROGMEM 使用時は必須 ch = pgm_read_byte_hi ( &str3[3] ); // HIGH_PROGMEM 領域から1バイト読み出す。この場合は 'd' の文字。 memcpy_PH ( buff, str3, sizeof(buff) ); // HIGH_PROGMEM 領域から、SRAM 上の buff に 10000 バイト分、コピー } void loop() { } |
00000000 <__vectors>: ※ vector テーブル領域開始アドレス 0: 0c 94 3a 7f jmp 0xfe74 ; 0xfe74 <__ctors_end> (中略) 88: 0c 94 5a 7f jmp 0xfeb4 ; 0xfeb4 <__bad_interrupt> 0000008c <_ZL4str1>: ※ PROGMEM 領域開始アドレス。頭の _ZL4 は「const char 配列」の意味だと思われる。 8c: 61 62 63 64 65 66 67 31 00 00 00 00 00 00 00 00 abcdefg1........ ... 00007f80 <_ZL4str2>: 7f80: 61 62 63 64 65 66 67 32 00 00 00 00 00 00 00 00 abcdefg2........ ... 0000fe74 <__ctors_end>: ※ プログラム・コード領域開始アドレス。__ctors_end となっているが、本来は __init であるべき。ここが 0x00010000 以下になっていれば OK fe74: 11 24 eor r1, r1 (中略) fffe: 85 bd out 0x25, r24 ; 37 ※ ここで 0x00010000 の境界を跨いでいる 10000: ee e6 ldi r30, 0x6E ; 110 (中略) 10074: 08 95 ret 00010076 <stop_program_in_fini1_sec>: ※ ここのアドレスが 0x0000FFFC 以上になっていれば OK 10076: f8 94 cli 10078: ff cf rjmp .-2 ; 0x10078 <stop_program_in_fini1_sec+0x2> 0001007a <_ZL4str3>: ※ HIGH_PROGMEM 領域開始アドレス。無事 0x00010000 以上に配置されている。 1007a: 61 62 63 64 65 66 67 33 00 00 00 00 00 00 00 00 abcdefg3........ ... 17f6e: f8 94 cli 00017f70 <__stop_program>: 17f70: ff cf rjmp .-2 ; 0x17f70 <__stop_program> |