2015/02/28

16F84A XC8開発例 - 低消費電力水晶発振子を使用する(LP Mode)

概要

PIC16F84AとMPLAB XC8 C Compilerを使用した開発例として,32.768kHzの水晶発振子を使用する際のプログラム例を紹介します. 開発環境は下記のとおりです.

PIC PIC16F84A
MPLAB X IDE MPLAB X IDE v2.26
MPLAB XC8 MPLAB XC8 C Compiler v1.32
PICkit 2 Application Version 2.61.00 / Device File Version 1.61.00
回路
回路図

電源はPICkit 2から5.0Vを供給し,32.768kHzの水晶発振子でPIC16F84Aを動作させています. 7セグメントLEDの電流制限抵抗には200Ωを使用していますが,330~1kΩ程度の方が良いかもしれません.


回路図
回路部品

下表は使用部品表です. 参考単価をクリックすると,秋月電子通商のページに飛びます. 「互換品」と記載されているリンクについては,互換性があると考えられる部品のページに飛びます. ただし,私が互換性および動作を確認したわけではありませんので,ご注意ください.

番号 部品名 型番 数量 参考単価
U1 PICマイコン Microchip PIC16F84A 1
X1 水晶発振子 32.768kHz 1
C1, C2 セラミック
コンデンサ
22pF 2
LED1 7セグメントLED PARA LIGHT C-421E
(カソードコモン)
1
R1 炭素皮膜抵抗 各社 1/4W 10kΩ 1 1円
(互換品)
R2 - R8 炭素皮膜抵抗 各社 1/4W 200Ω 7 1円
(互換品)
その他 リード線など 適量
プログラム
main.c

下記はソースファイル「main.c」です.参考になれば幸いです.

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
#include <xc.h>
 
// 16F84A
// CONFIG
#pragma config FOSC = LP    // Oscillator Selection bits (LP oscillator)
#pragma config WDTE = OFF   // Watchdog Timer (WDT disabled)
#pragma config PWRTE = ON   // Power-up Timer Enable bit (Power-up Timer is enabled)
#pragma config CP = OFF     // Code Protection bit (Code protection disabled)
 
// プロトタイプ宣言
void display7seg(unsigned char font_id);
 
void main(void)
{
    unsigned char count = 0;
 
    PORTA = 0x00;           // PORTAを初期化
    PORTB = 0x00;           // PORTBを初期化
    TRISA = 0x00;           // PORTAの入出力設定
    TRISB = 0x00;           // PORTBの入出力設定
 
    while(1){               // 無限ループ
        display7seg(count);
        _delay(8192);       // 1秒の待ち時間: Fosc / 4
        count++;
        if(count > 9){
            count = 0;
        }
    }
}
 
/*
 * 7セグメントLED表示関数
 *
 * 引数:
 * unsigned char    font_id 表示するフォントのID
 *
 * 復帰値:
 * なし
 */
void display7seg(unsigned char font_id)
{
    const unsigned char font[11] = {
        // gfedcba  7セグメントLED 点灯パターン
        0b00111111, // 0
        0b00000110, // 1
        0b01011011, // 2
        0b01001111, // 3
        0b01100110, // 4
        0b01101101, // 5
        0b01111101, // 6
        0b00100111, // 7
        0b01111111, // 8
        0b01101111, // 9
        0b00000000  // 表示なし
    };
 
    PORTB = font[font_id];
}
2015/02/24

16F88 XC8開発例 - 複数の押しボタンスイッチからの入力

概要

PIC16F88とMPLAB XC8 C Compilerを使用した開発例として,2個の押しボタンスイッチ(タクトスイッチ)を使用する際のプログラム例を紹介します. 開発環境は下記のとおりです.

PIC PIC16F88-I/P
MPLAB X IDE MPLAB X IDE v2.26
MPLAB XC8 MPLAB XC8 C Compiler v1.32
PICkit 2 MPLAB X IDEを使用して書込み
回路
回路図

電源はPICkit 2から5.0Vを供給し,内蔵クロック 8MHzで動作させています. 各タクトスイッチは,10kΩ抵抗でプルアップされた負論理入力回路となっています. 私がSW1として使用したタクトスイッチはLED内蔵ですが,このLEDは使用していません. 7セグメントLEDの電流制限抵抗には200Ωを使用していますが,330~1kΩ程度の方が良いかもしれません.


回路図
回路部品

下表は使用部品表です. 参考単価をクリックすると,秋月電子通商のページに飛びます. 「互換品」と記載されているリンクについては,互換性があると考えられる部品のページに飛びます. ただし,私が互換性および動作を確認したわけではありませんので,ご注意ください.

番号 部品名 型番 数量 参考単価
U1 PICマイコン Microchip PIC16F88-I/P 1 250円
SW1 LED付き
タクトスイッチ
Switronic ST-12-303FC-G
(緑,正方形)
1 150円
SW2 タクトスイッチ 各社 1 10円
(互換品)
LED1 7セグメントLED PARA LIGHT C-421E
(カソードコモン)
1
R1 - R3 炭素皮膜抵抗 各社 1/4W 10kΩ 3 1円
(互換品)
R4 - R10 炭素皮膜抵抗 各社 1/4W 200Ω 7 1円
(互換品)
その他 リード線など 適量
プログラム
タクトスイッチのチャタリングによる誤動作防止対策

タクトスイッチを使用する際は,チャタリング対策が必要です. 下記のプログラムでは,スイッチの状態を10ミリ秒の間隔を置いて2回確認するようにしています. 1回目と2回目のスイッチの状態が一致し,なおかつ現在のスイッチの状態(sw_state)が前回のスイッチの状態(sw_state_prev)と異なる場合は,スイッチの状態についての判定(switch文)に移行します. これは,スイッチの状態が変化した直後のみ,スイッチの状態に対応する処理を実行するためです.

main.c

下記はソースファイル「main.c」です.参考になれば幸いです.

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
#include <xc.h>
 
#define _XTAL_FREQ 8000000  // 8MHz
 
// 16F88
// CONFIG1
#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = ON
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CCPMX = RB3
#pragma config CP = OFF
 
// CONFIG2
#pragma config FCMEN = OFF
#pragma config IESO = OFF
 
void main(void)
{
    unsigned char sw_state;
    unsigned char sw_state_prev = 0x00;
 
    OSCCON = 0b01110000;    // 内蔵クロックの周波数を8MHzに設定
 
    PORTA = 0x00;           // PORTAを初期化
    PORTB = 0x00;           // PORTBを初期化
 
    TRISA = 0x06;           // PORTAの入出力設定
    TRISB = 0x00;           // PORTBの入出力設定
 
    ANSEL = 0x00;           // A/D変換を無効化
    ADCON0 = 0x00;
    ADCON1 = 0x00;
 
    while(1){               // 無限ループ
        sw_state = (PORTA ^ 0xff) & 0x06;   // SW1,SW2の状態を反転して格納
        __delay_ms(10);                     // 10ミリ秒の待ち時間
        if((sw_state == ((PORTA ^ 0xff) & 0x06))    // SW1,SW2の状態を再確認および,
                && (sw_state != sw_state_prev)){    // 前回の状態からの変化有無の確認
            switch(sw_state){
                case 0x02:  // SW1押下
                    PORTB = 0b00000110;     // 7セグメントLED表示 "1"
                    break;
                case 0x04:  // SW2押下
                    PORTB = 0b01011011;     // 7セグメントLED表示 "2"
                    break;
                case 0x06:  // SW1およびSW2押下
                    PORTB = 0b01001111;     // 7セグメントLED表示 "3"
                    break;
                default:
                    break;
            }
        }
        sw_state_prev = sw_state;
    }
}
完成

タクトスイッチと7セグメントLEDの使用例
2015/02/22

Arduino - 押しボタンスイッチと7セグメントLEDを使用したカウンタ回路

概要

モーメンタリ動作の押しボタンスイッチ(タクトスイッチ)と7セグメントLEDを使用したカウンタ回路の製作例を紹介します. 開発環境は下記のとおりです.

Arduino IDE Arduino 1.0.5-r2
回路
回路図

私はArduinoを持っていませんので,Arduino Duemilanove互換回路をブレッドボード上に作成しました. 私がSW1として使用したタクトスイッチはLED内蔵ですが,このLEDは使用していません. SW1は負論理(押下されている時にLOW,押下されていない時にHIGH)になっています.


回路図
回路部品

下表は,回路図中のSW1と「7セグメントLED表示回路」部分の使用部品表です. 参考単価をクリックすると,秋月電子通商のページに飛びます. 「互換品」と記載されているリンクについては,互換性があると考えられる部品のページに飛びます. ただし,私が互換性および動作を確認したわけではありませんので,ご注意ください.

番号 部品名 型番 数量 参考単価
SW1 LED付き
押しボタンスイッチ
Switronic ST-12-303FC-G
(緑,正方形)
1 150円
LED1 7セグメントLED PARA LIGHT C-421E
(カソードコモン)
1
R1 - R7 炭素皮膜抵抗 各社 1/4W 200Ω 7 1円
(互換品)
その他 リード線など 適量
スケッチ
SW1のチャタリングによる誤動作防止対策

タクトスイッチSW1を押下される度に,7セグメントLEDの表示数値をインクリメントするスケッチを作成しました. この動作を実現するためには,SW1のチャタリング対策が必要です.

下記のスケッチ例では,スイッチの状態を10ミリ秒の間隔を置いて2回確認するようにしています. スイッチが押下された状態の場合は,変数sw1_state_prevの値から前回のスイッチの状態を確認します. これはスイッチが押下された状態でインクリメントを複数回繰り返さないための判定処理です. sw1_state_prevがHIGHであればスイッチは押下直後ということになります.

スケッチ例

GitHubにて公開します.

完成

Webカメラで撮影したためピントが合っていません.ご了承ください.


7セグメントLEDカウンタ
製品紹介
2015/02/21

16F88 XC8開発例 - LED点滅回路

概要

PIC16F88とMPLAB XC8 C Compilerを使用した開発例として,LED点滅回路のプログラムを紹介します. 開発環境は下記のとおりです.

PIC PIC16F88-I/P
MPLAB X IDE MPLAB X IDE v2.26
MPLAB XC8 MPLAB XC8 C Compiler v1.32
PICkit 2 MPLAB X IDEを使用して書込み
回路
回路図

回路構成はシンプルです. 電源はPICkit 2から5.0Vを供給しています. 内蔵クロック 8MHzで動作させています. RB5には,電流制限用抵抗 330Ωを経由してLEDが接続されています.


回路図
回路部品

下表は使用部品表です. 参考単価をクリックすると,秋月電子通商のページに飛びます. 「互換品」と記載されているリンクについては,互換性があると考えられる部品のページに飛びます. ただし,私が互換性および動作を確認したわけではありませんので,ご注意ください.

番号 部品名 型番 数量 参考単価
U1 PICマイコン Microchip PIC16F88-I/P 1 250円
LED1 LED 各社 各色 1 10円
R1 炭素皮膜抵抗 各社 1/4W 10kΩ 1 1円
(互換品)
R2 炭素皮膜抵抗 各社 1/4W 330Ω 1 1円
(互換品)
その他 リード線など 適量
プログラム
main.c

下記はソースファイル「main.c」です.参考になれば幸いです.

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
#include <xc.h>
 
#define _XTAL_FREQ 8000000  // 8MHz
 
// 16F88
// CONFIG1
#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = ON
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CCPMX = RB3
#pragma config CP = OFF
 
// CONFIG2
#pragma config FCMEN = OFF
#pragma config IESO = OFF
 
void main(void)
{
    OSCCON = 0b01110000;    // 内蔵クロックの周波数を8MHzに設定
 
    PORTA = 0x00;           // PORTAを初期化
    PORTB = 0x00;           // PORTBを初期化
    TRISA = 0x00;           // PORTAの入出力設定
    TRISB = 0x00;           // PORTBの入出力設定
 
    while(1){               // 無限ループ
        PORTB ^= 0b00100000;    // RB5をビット反転
        __delay_ms(500);        // 500ミリ秒の待ち時間
    }
}
完成

LED点滅回路
2015/02/16

TOPPERS/EV3RTの開発環境構築 on Ubuntu 14.04 32bit

はじめに

Ubuntu上に,ETロボコン2015の公式ソフトウェアプラットフォームの1つである,TOPPERS/EV3RT (Real-Time platform for EV3)の開発環境を構築しました. 下記の公式ウェブサイトの掲載内容をそのまま実行しただけですが,作業ログとして書いておきます.

私も初心者ですので,内容に誤りが含まれている場合があります. また,本記事投稿現在,実機での動作確認ができていません…. つきましては,何かお気づきの際は,コメントなどでご指摘いただければ幸いです.

開発環境

VMware Player上にインストールした,Ubuntu 14.04 LTS 32bit上に構築しました.

OS Ubuntu 14.04 LTS 32bit

ダウンロードしたパッケージは,下記のとおりです.

TOPPERS/EV3RT β3-1: ev3rt-beta3-1-release.zip
作業ログ
  1. パッケージの準備
  2. ダウンロードして展開しました.

    1
    2
    3
    4
    5
    ~$ mkdir EV3RT
    ~$ cd EV3RT/
    EV3RT$ wget http://www.toppers.jp/download.cgi/ev3rt-beta3-1-release.zip
    EV3RT$ unzip ev3rt-beta3-1-release.zip
    EV3RT$ tar xvf ./ev3rt-beta3-1-release/ev3rt-beta3-1.tar.xz
  3. ARM社のGNU Toolchainのリポジトリの導入
  4. マニュアル通りに実行しました.

    1
    2
    3
    EV3RT$ sudo apt-get remove binutils-arm-none-eabi gcc-arm-none-eabi
    EV3RT$ sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded 2>&1 | tee apt-get.log
    EV3RT$ sudo apt-get update
  5. 必要なパッケージのインストール
  6. マニュアル通りに実行しました.

    1
    EV3RT$ sudo apt-get install gcc-arm-none-eabi=4.9.3.2014q4-0trusty12 u-boot-tools libboost1.55-all-dev | tee apt-get-install.log
  7. EV3RTのコンフィギュレータのインストール
  8. 結構時間がかかったように感じますが,気が付いたら完了していたため,所要時間はわかりません.

    1
    2
    EV3RT$ cd hrp2/cfg/
    cfg$ make | tee make-cfg.log
2015/02/12

Zynq Linuxの使用メモリを制限する

はじめに

下記の記事で,device treeのbootargsを編集してLinuxの使用メモリを制限する方法が紹介されていました. 試してみたところKernel panicを起こしてしまいましたので,その対処方法もメモしておきます.

今やってみたいのはZYBOのVGAまたはHDMIからGUIを出力することなのですが,やり方がよくわからず困っています. もっとハードルが低いことからコツコツやった方が早いかも….

DTSのbootargsを編集する

「mem=384M」を加えて,Linuxの使用メモリを384MBに制限してみます. ZYBOはメモリを512MB搭載していますので,アドレス 0x18000000 ~ 0x1fffffff まではLinuxの管理外になるはずです.

1
console=ttyPS0,115200 mem=384M root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1

Kernel panicが発生して起動しませんでした. わからないなりにログを眺めてみると,Kernelの読込み開始直後に落ちているようです.

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
68
69
70
71
72
73
74
0
Device: zynq_sdhci
Manufacturer ID: 74
OEM: 4a45
Name: USD
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 7.5 GiB
Bus Width: 4-bit
reading uEnv.txt
117 bytes read in 8 ms (13.7 KiB/s)
Loaded environment from uEnv.txt
Importing environment from SD ...
Running uenvcmd ...
reading uImage
3827936 bytes read in 342 ms (10.7 MiB/s)
reading devicetree.dtb
10655 bytes read in 16 ms (649.4 KiB/s)
## Booting kernel from Legacy Image at 03000000 ...
   Image Name:   Linux-3.14.0-xilinx-13567-g906a2
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    3827872 Bytes = 3.7 MiB
   Load Address: 00008000
   Entry Point:  00008000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 02a00000
   Booting using the fdt blob at 0x2a00000
   Loading Kernel Image ... OK
   Loading Device Tree to 1fb29000, end 1fb2e99e ... OK
 
Starting kernel ...
 
Uncompressing Linux... done, booting the kernel.
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 3.14.0-xilinx-13567-g906a2c9 (省略) (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-23) ) #5 SMP PREEMPT Thu Feb 12 21:03:26 JST 2015
[    0.000000] CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=18c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] Machine model: xlnx,zynq-7000
[    0.000000] bootconsole [earlycon0] enabled
[    0.000000] cma: CMA: reserved 128 MiB at 10000000
[    0.000000] Memory policy: Data cache writealloc
[    0.000000] Unable to handle kernel paging request at virtual address dfb29000
[    0.000000] pgd = c0004000
[    0.000000] [dfb29000] *pgd=00000000
[    0.000000] Internal error: Oops: 5 [#1] PREEMPT SMP ARM
[    0.000000] Modules linked in:
[    0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 3.14.0-xilinx-13567-g906a2c9 #5
[    0.000000] task: c07296f0 ti: c071e000 task.ti: c071e000
[    0.000000] PC is at __unflatten_device_tree+0xc4/0x278
[    0.000000] LR is at unflatten_device_tree+0x1c/0x34
[    0.000000] pc : [<c03e1764>]    lr : [<c0702d7c>]    psr: 600000d3
[    0.000000] sp : c071ff40  ip : c072ad0c  fp : cfffff40
[    0.000000] r10: c07293c0  r9 : c072accc  r8 : c07357b0
[    0.000000] r7 : c06eb7d4  r6 : c076e1c0  r5 : c076ca20  r4 : dfb29000
[    0.000000] r3 : 00000000  r2 : c06eb7d4  r1 : c0c956b8  r0 : dfb29000
[    0.000000] Flags: nZCv  IRQs off  FIQs off  Mode SVC_32  ISA ARM  Segment kernel
[    0.000000] Control: 18c5387d  Table: 0000404a  DAC: 00000015
[    0.000000] Process swapper (pid: 0, stack limit = 0xc071e240)
[    0.000000] Stack: (0xc071ff40 to 0xc0720000)
[    0.000000] ff40: dfb29000 c0c956b8 c06eb7d4 c0c956b8 c06eb7d4 c070c234 c076e1c0 c072accc
[    0.000000] ff60: c07357b0 c0702d7c c07263c8 c06eab28 ffffffff 18c5387d c071e000 c076e080
[    0.000000] ff80: ffffffff 0000406a c07263c0 00000000 00000000 c04d92cc c0614719 00000001
[    0.000000] ffa0: c071e000 c076e080 ffffffff 0000406a c07263c0 00000000 00000000 c06e7818
[    0.000000] ffc0: 00000000 00000000 00000000 00000000 00000000 c070f860 18c5387d c072640c
[    0.000000] ffe0: c070f85c c072adfc 0000406a 413fc090 00000000 00008074 00000000 00000000
[    0.000000] [<c03e1764>] (__unflatten_device_tree) from [<c0702d7c>] (unflatten_device_tree+0x1c/0x34)
[    0.000000] [<c0702d7c>] (unflatten_device_tree) from [<c06eab28>] (setup_arch+0x5b0/0x884)
[    0.000000] [<c06eab28>] (setup_arch) from [<c06e7818>] (start_kernel+0x88/0x380)
[    0.000000] [<c06e7818>] (start_kernel) from [<00008074>] (0x8074)
[    0.000000] Code: e59f0184 e59f1184 e6bf2f32 ebf8d05a (e5942000)
[    0.000000] ---[ end trace 3406ff24bd97382e ]---
[    0.000000] Kernel panic - not syncing: Attempted to kill the idle task!
Kernel panicの対処方法 / uEnv.txtの編集

原因と対処方法を調べてみると,下記Webページが引っかかりました. u-bootがdevice treeをメモリの上限アドレス付近に配置するため,Kernelの使用メモリを制限するとdevice treeが存在するアドレスを参照できない,ということでしょうか. 対処方法は,u-bootがdevice treeを配置する際の上限アドレス(fdt_high)を変更すれば良いようです.

u-bootのソースコード上では, include/configs/zynq-common.h で 0x20000000 に設定されているようです(自信はないです). ソースコードを編集してu-bootをリビルドするのは面倒なので,uEnv.txtでの設定を試してみました. 下記の1行目を追加しました.

1
2
fdt_high=0x18000000
uenvcmd=fatload mmc 0 0x03000000 uImage && fatload mmc 0 0x02A00000 devicetree.dtb && bootm 0x03000000 - 0x02A00000

正常に起動しました. /proc/meminfo を参照すると,使用メモリが384MB程度に制限されていることがわかります.

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
68
69
70
71
72
73
74
75
0
Device: zynq_sdhci
Manufacturer ID: 74
OEM: 4a45
Name: USD
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 7.5 GiB
Bus Width: 4-bit
reading uEnv.txt
137 bytes read in 8 ms (16.6 KiB/s)
Loaded environment from uEnv.txt
Importing environment from SD ...
Running uenvcmd ...
reading uImage
3827936 bytes read in 342 ms (10.7 MiB/s)
reading devicetree.dtb
10655 bytes read in 16 ms (649.4 KiB/s)
## Booting kernel from Legacy Image at 03000000 ...
   Image Name:   Linux-3.14.0-xilinx-13567-g906a2
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    3827872 Bytes = 3.7 MiB
   Load Address: 00008000
   Entry Point:  00008000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 02a00000
   Booting using the fdt blob at 0x2a00000
   Loading Kernel Image ... OK
   Loading Device Tree to 17ffa000, end 17fff99e ... OK
 
Starting kernel ...
 
# 省略
 
root@linaro-ubuntu-desktop:~# cat /proc/meminfo
MemTotal:         376616 kB
MemFree:          154656 kB
MemAvailable:     187500 kB
Buffers:           11000 kB
Cached:            65284 kB
SwapCached:            0 kB
Active:           156280 kB
Inactive:          40620 kB
Active(anon):     121080 kB
Inactive(anon):     5300 kB
Active(file):      35200 kB
Inactive(file):    35320 kB
Unevictable:           0 kB
Mlocked:               0 kB
HighTotal:             0 kB
HighFree:              0 kB
LowTotal:         376616 kB
LowFree:          154656 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:              1024 kB
Writeback:             0 kB
AnonPages:        120824 kB
Mapped:            49328 kB
Shmem:              5608 kB
Slab:              16692 kB
SReclaimable:       7080 kB
SUnreclaim:         9612 kB
KernelStack:        1552 kB
PageTables:         3092 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      188308 kB
Committed_AS:    1102444 kB
VmallocTotal:     630784 kB
VmallocUsed:        5652 kB
VmallocChunk:     376448 kB

Ubuntu起動時の「システムプログラムの問題が見つかりました」表示を消す

はじめに

下記バージョンのUbuntuをVMware Player上で使用しているのですが,起動時に「System program problem detected」ウィンドウと「システムプログラムの問題が見つかりました」ウィンドウが表示されるようになりました. 英語と日本語,少しの時間を空けて2つとも表示されるので,とても鬱陶しいです.

OS Ubuntu 14.04 LTS 32bit

System program problem detected

システムプログラムの問題が見つかりました
対処方法

下記Webページで原因と対処方法が紹介されていました. クラッシュした際のレポートファイルが /var/crash ディレクトリに作成されるようですが,このレポートファイルの存在がUbuntu起動時のメッセージウィンドウの原因になっているようです. つまり,レポートファイルを削除してしまえばUbuntu起動時のメッセージウィンドウは表示されなくなります.

下記コマンドを実行してレポートファイルを削除すると,メッセージウィンドウが表示されなくなりました.

1
2
3
~$ ls -la /var/crash
# レポートファイル一覧が表示される
~$ sudo rm /var/crash/*

上記Webページでは,レポートファイルの生成や送信要求を実行している(…?)ソフトウェア,Apport自体を無効化する方法も紹介されています. 今回,私はレポートファイルの削除のみ実施しました.

2015/02/09

Xilinx SDKでDevice Treeを生成する

はじめに

FPGAの部屋を読んでいると,Xilinx SDKでDeviece Tree Source (DTS)を生成できることがわかりました. 下記の記事が参考になりましたが,開発環境が異なるほか,ファイルの取得方法が変わっていましたので,私の作業メモを残しておきます.

Xilinx Wikiの該当ページは下記のとおりです.
開発環境

DTSの生成に使用するXilinx SDK 2014.4は,Windowsにインストールしています.

OS Microsoft Windows 7 Professional x64 Service Pack 1
SDK Xilinx SDK 2014.4

ファイル取得に使用するgitクライアントやDTSからDevice Tree Blob (DTB)を生成する環境は,VMware Player上のUbuntuにインストールしています. Windowsとのファイル共有には,WinSCPを使用しています.

OS Ubuntu 14.04 LTS 32bit
Device Tree Generatorのセットアップ

Ubuntu環境でDevice Tree Generatorのgitリポジトリを取得しました. その後,ディレクトリごとWindows環境の「C:\work」にコピーしました. これにより,「C:\work\device-tree-xlnx」ができたことになります.

1
~$ git clone git://github.com/Xilinx/device-tree-xlnx.git

Vivadoでプロジェクトを開き,「File」 - 「Launch SDK」からXilinx SDKを起動しました. Xilinx SDKのツールバーから「Xilinx Tools」 - 「Repositories」をクリックし,「Preferences」ウィンドウを開きました. 「Local Repositories」に,「C:\work\device-tree-xlnx」を追加しました.


Preferences
DTSの生成

Xilinx SDKの「File」 - 「New」 - 「Board Support Package」をクリックしました. 「New Board Support Package Project」ウィンドウが開きましたので,「Board Support Package OS」を「device-tree」に変更して「Finish」しました.


Board Support Package

「Board Support Package Settings」ウィンドウが開きましたので,「bootargs」の「Value」に下記を入力しました. これは一例ですので,各自の環境に合わせる必要があります.

1
console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1


Board Support Package Settings

「Board Support Package Settings」ウィンドウを「OK」で閉じると,自動的に「device-tree_bsp_0」プロジェクトのビルドが開始され,DTSが生成されました.


device-tree_bsp_0
DTBの生成

「device-tree_bsp_0」ディレクトリごとUbuntu環境にコピーし,DTBを作成しました. ほとんどGUI操作だけでdevicetree.dtbが生成でき,タイプミス起因のエラーを回避できるのは良さそうですね.

1
2
~$ cd zybo_bsd_linux/device_tree_bsp_0/
~/zybo_bsd_linux/device_tree_bsp_0$ ../Linux-Digilent-Dev/scripts/dtc/dtc -I dts -O dtb -o ./devicetree.dtb ./system.dts
2015/02/01

ZYBO (Zynq PS)にI2Cキャラクタ液晶を接続する

はじめに

Zynq PSのI2Cモジュールを使用して,I2Cキャラクタ液晶を制御してみました.


テストプログラムの実行結果
開発環境
OS Microsoft Windows 7 Professional x64 Service Pack 1
Vivado Vivado 2014.4 WebPACK Edition (Windows)
SDK Xilinx SDK 2014.4
I2Cキャラクタ液晶

AitendoのI2C低電圧キャラクタ液晶モジュール(16x2行) [SPLC792-I2C-M]を使用しました. バックライトユニットも搭載されていて375円です.安いですね…. LCDモジュール単体でも取扱いがあります.

接続方法については,下記の記事が大変参考になりました. 私も,ピンヘッダを変換基板に取り付けて接続しています. 変換基板の短辺側にあるランド(SHL, DIRC)にもピンヘッダを取り付け,ジャンパピンでショートさせることで,液晶モジュールの表示方向を変更できるようにしました. バックライトユニットの電源(BL+)には,330Ωの抵抗を直列接続して3.3Vを印加しました.


ピンヘッダの取り付け
Vivadoでの作業メモ
  1. Zynq Block Designの設定変更
  2. ZYBO Base System Designを流用しました. Block Design上のZYNQ7 Processing SystemをダブルクリックしてRe-customize IPウィンドウを開き,Zynq Block Designで「I2C 1」にチェックを入れました. なお,下図ではTTCにもチェックを入れていますが,I2Cキャラクタ液晶の制御には必要ありません.


    Zynq Block Design
  3. MIO Configurationの設定変更
  4. Re-customize IPウィンドウでMIO Configurationに表示を切り替え,I2C 1のIOを「EMIO」に設定しました. なお,下図ではTTCについても設定していますが,I2Cキャラクタ液晶の制御には必要ありません.


    MIO Configuration
  5. Diagramの変更
  6. Re-customize IPウィンドウを閉じ,Diagram上で右クリックしました. 右クリックメニューのCreate Interface PortをクリックしてI2C 1用のインタフェースポート「IIC_1」を作成し,ZYNQ7 Processing SystemのIIC_1と接続しました.


    Diagram
  7. I/O Portsの変更
  8. 「Run Synthesis」後,「Open Synthesized Design」し,IIC_1関連のI/Oポートをアサインするためにツールバーの「Window」 - 「I/O Ports」を開きました. 私は,ZYBOのPmod JBコネクタのJB1 (T20)にiic_1_scl_ioを,JB2 (U20)にiic_1_sda_ioをアサインしました.


    I/O Ports
プログラム

今更ながらGitHubのアカウントを作成しましたので,GitHubにて公開します.

Xilinx SDKで作成したプロジェクト内には「system.mss」というファイルがあります. このファイル内に,Zynq PSのI2Cモジュール「iicps」のドキュメントとサンプルプロジェクトのリンクがあり,大変参考になりました. このI2Cキャラクタ液晶のテストプログラムは,サンプルプロジェクト「xiicps_polled_master_example」を基に作成したものです.

また,I2Cキャラクタ液晶の制御方法の理解には,下記の記事が大変参考になりました.

製品紹介