前回アセンブラでLチカを実行しましたが、今回SDCCによるC言語で実行したいと思います。
回路図は、アセンブラでLチカを実行ものと同じです。
SDCCをインストールします。(下記ではすでにインストール済となっています。)
$ sudo apt-get install sdcc
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
sdcc はすでに最新バージョン (4.0.0+dfsg-2) です。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 23 個。
開発環境は、Raspberry Pi3 上のRaspbianで、SDCCのバージョンは下記のとおりです。
$ sdcc -v
SDCC : mcs51/z80/z180/r2k/r3ka/gbz80/tlcs90/ez80_z80/ds390/TININative/ds400/hc08/s08/stm8/pdk13/pdk14/pdk15 4.0.0 #11528 (Linux)
published under GNU General Public License (GPL)
下記のプログラムは、for文で時間稼ぎして、P3.3端子とP5.4端子のLEDを交互に点滅するプログラムです。
P3M0,P3M1,P5M0,P5M1は素の8052には存在しないので、新たにレジスターを定義します。
//BYTE 指定可能なレジスター
__sfr __at 0xb2 P3M0 ;
__sfr __at 0xb1 P3M1 ;
__sfr __at 0xca P5M0 ;
__sfr __at 0xc9 P5M1 ;
P5ポートも素の8052には存在しないので、新たにビットごとのポートを定義します。
//BIT 指定可能なレジスター
__sbit __at 0xc8 P5_0 ;
__sbit __at 0xc9 P5_1 ;
__sbit __at 0xca P5_2 ;
__sbit __at 0xcb P5_3 ;
__sbit __at 0xcc P5_4 ;
__sbit __at 0xcd P5_5 ;
P3、P5ポートを準双方向ポートに設定します。
P3M0 = 0x00; //P3ポートを準双方向モードに
P3M1 = 0x00;
P5M0 = 0x00; //P5ポートを準双方向モードに
P5M1 = 0x00;
全体のプログラムは下記のとおりです。
// STC8G1K08A LED 点滅 (P3.3 - P5.4)
//
// STC8G1K08A MPU
// Flash ROM 8Kbyte
// RAM 1Kbyte
//
// SDCC 4.0.0
//
// file name STC8G1K08A_led_blink.c
// $ sdcc -mmcs51 --model-small --xram-size 0x400 --xram-loc 0x0000 --code-size 0x2000 STC8G1K08A_led_blink.c
// $ packihx STC8G1K08A_led_blink.ihx > STC8G1K08A_led_blink.hex
// $ stcgal -P stc8g -t 22118.4 -p /dev/ttyUSB0 STC8G1K08A_led_blink.hex
//
#include <8052.h>
//BYTE 指定可能なレジスター
__sfr __at 0xb2 P3M0 ;
__sfr __at 0xb1 P3M1 ;
__sfr __at 0xca P5M0 ;
__sfr __at 0xc9 P5M1 ;
//BIT 指定可能なレジスター
__sbit __at 0xc8 P5_0 ;
__sbit __at 0xc9 P5_1 ;
__sbit __at 0xca P5_2 ;
__sbit __at 0xcb P5_3 ;
__sbit __at 0xcc P5_4 ;
__sbit __at 0xcd P5_5 ;
void wait_time(void); //時間待ち関数宣言
void main(void) //main関数
{
P3M0 = 0x00; //P3ポートを準双方向モードに
P3M1 = 0x00;
P5M0 = 0x00; //P5ポートを準双方向モードに
P5M1 = 0x00;
while(1) //無限ループ
{
P3_3 = 1; //ポートP3_3をハイレベルにする
P5_4 = 0; //ポートP5_4をローレベルにする
wait_time(); //時間待ち
P3_3 = 0; //ポートP3_3をローレベルにする
P5_4 = 1; //ポートP5_4をハイレベルにする
wait_time(); //時間待ち
}
}
void wait_time(void) //時間待ち関数
{
int i,j,k; //forループによる時間待ち
for(i=0;i < 18 ;i++)
for(j=0;j < 255;j++)
for(k=0;k < 255;k++);
}
コンパイルします
$ sdcc -mmcs51 --model-small --xram-size 0x400 --xram-loc 0x0000 --code-size 0x2000 STC8G1K08A_led_blink.c
SDCCは吐き出すヘキサコード(ihx)をインテルヘキサコード(hex)に変換します。
$ packihx STC8G1K08A_led_blink.ihx > STC8G1K08A_led_blink.hex
packihx: read 14 lines, wrote 19: OK.
STC8G1K08Aへ書き込みします。
$ stcgal -P stc8g -t 22118.4 -p /dev/ttyUSB0 STC8G1K08A_led_blink.hex
Waiting for MCU, please cycle power: done
Target model:
Name: STC8G1K08A-8PIN
Magic: F794
Code flash: 8.0 KB
EEPROM flash: 4.0 KB
Target frequency: 22.116 MHz
Target BSL version: 7.3.13U
Target wakeup frequency: 36.125 KHz
Target ref. voltage: 1191 mV
Target mfg. date: 2024-07-01
Target options:
reset_pin_enabled=False
clock_gain=high
watchdog_por_enabled=False
watchdog_stop_idle=True
watchdog_prescale=64
low_voltage_reset=False
low_voltage_threshold=2
eeprom_erase_enabled=True
bsl_pindetect_enabled=False
por_reset_delay=long
rstout_por_state=high
uart1_remap=False
uart2_passthrough=True
uart2_pin_mode=push-pull
epwm_open_drain=True
program_eeprom_split=8192
Loading flash: 191 bytes (Intel HEX)
Target frequency: Target 22.118 MHz
Adjusted frequency: 22.123 MHz(0.022%)
Switching to 115200 baud: done
Erasing flash: done
Writing flash: 576 Bytes [00:00, 8291.61 Bytes/s]
Finishing write: done
Setting options: done
Target UID: F794C4840AEBF6
Disconnected!
P3.3,P5.4端子に接続したLEDが相互に点滅します。