組込みとともに -17ページ目

無償ツールで構築するWindows Mobile 開発環境

1.背景

 Windows Mobile(以下WM)の開発環境はVS2005ならStandard以上、VS2008ならProfessional以上のグレードが必要となります。これらのツールは高額なツールであるためホビーでWMアプリを開発しようと思ってもなかなか手が出せません。ブログを眺めた限りでは評価版で短期集中で開発して製作しているのが現状のようです。


2.目的

 本記事は無償ツールでなんとかWMアプリの開発を行いたいと願う人に送ります。

 無償ツールを使うためVSを使いような華かやな機能は期待しないでくださいあせる


3.前提条件及び私の環境

 確認済み環境

 Windows XP Home SP3

 Windows Mobile 6 Pro(S11HT)

 ちなみに関係ないと思いますが本環境のインストール前にVisual C#2005 Expressがインストール済みでした。


4.準備

 下記のファイルをダウンロードしてインストールしておきます。

 ・Windows Mobile 6 Professional Images (JPN).msi  217MB

 ・.NET Framework 2.0 SDK Targeting .NET CF 2.0 (x86)  354MB ←もしかして入れなくてもよいかも(どなたかお試しください汗

 ・NETCFSetupv2.msi  (但し↑をインストールすると『C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\CompactFramework』にあります。 約25MB

 DLもインストールもそれなりの時間がかかります。


5.環境変数Pathへ追加

 『C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727』をPathに追加します。


6.サンプルプログラム

 下記のソースを『HelloWorldForm.cs』と名をつけて保存してください。

// http://www.codeproject.com/KB/mobile/WiMoSansVS.aspx より

using System;
using System.Drawing;
using System.Windows.Forms;

namespace MyNamespace
{
class HelloWorldForm : System.Windows.Forms.Form
{
Label lblHello;
Button btnClose;

public HelloWorldForm()
{
this.Text="Hello World Sample";
btnClose = new Button();
lblHello = new Label();
btnClose.Click += new EventHandler(btnClose_Click);
btnClose.Text="Close";
btnClose.Location = new Point(10,100);
btnClose.Size = new Size(200,50);
lblHello.Text = "Hello World!";
lblHello.Location = new Point(10, 10);
lblHello.Size = new Size(200,50);
SuspendLayout();
this.Controls.Add(lblHello);
this.Controls.Add(btnClose);
ResumeLayout(false);
}

void btnClose_Click(object sender, EventArgs args)
{
this.Close();
}

[MTAThread]
static void Main()
{
HelloWorldForm mainForm = new HelloWorldForm();
Application.Run( mainForm );
}
}
}

7.バッチファイル

 下記のスクリプトを『make.bat』という名前で保存してください。

SET FrameworkAssemblyPath="C:\Program Files\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE"
REM the following should be on one line but is broken into several lines for readability.
csc.exe /nologo /nostdlib /noconfig /out:HelloWorld.exe /r:""%FrameworkAssemblyPath%\mscorlib.dll"" /r:""%FrameworkAssemblyPath%\System.dll"" /r:""%FrameworkAssemblyPath%\System.Windows.Forms.dll"" /r:""%FrameworkAssemblyPath%\System.Drawing.dll"" HelloWorldForm.cs

8.ビルド

コマンドプロンプトを開きソースを保存した場所へ移動します。make.batを実行すると完成です。↓

組込みとともに-ビルド


9.エミュレータ

起動後の待ち受け画面↓


組込みとともに-起動後待ち受け画面


設定変更(フォルダ共有設定)をします。

File→Configure→Generalタブ→Share folder

にファイルをやり取りしたいフォルダを指定します↓


組込みとともに-コンフィグ

ファイルエクスプローラーを起動してStrage Cardを開きます↓


組込みとともに-ファイルエクスプローラ
Helloworldをダブルクリックすると起動します↓


組込みとともに-動作
ここまで問題なければ実記でも同じように動きます。


参考にしたサイト

http://www.codeproject.com/KB/mobile/WiMoSansVS.aspx

Visual Studio 2008(.NET3.5)で構築したい方は上記サイトが参考になります。

AVR JTAG ICE MKIIを使ってみた

JATG ICE MKIIを FunkOS自作評価ボードで使ってみた。

↓動作中


↓JATGICE MKIIのLEDがちかちかして動作しているのがわかる


↓AVR Studio 4(デバッグ中)
組込みとともに-AVR Studio デバッグ中


使ってみた感想

・接続はAVR JTAGICE MKIIのマニュアルどおりの配線をしていたので問題なく接続できた

・シミュレータと違って実測であるところがよい

・ROM ICEと違って配線が楽

・ROM ICEでは完全にCPUを停止できないとか割り込みの問題とかアドレスマップの問題とかあっただけど、JTAGではそれがない(多分)


ちょっとひっかかったところ

・AVR StudioがWindowsを再起動しないとJTAGICE MKIIと接続できなくなる症状があった

 きっかけはよくわからないけど、JTAGICE MKIIでROM焼きしようとしたときにAVRの電源OFFでエラーが出た後からそうなった。ちなみにこの状態でAVRISP MKIIを接続してもどうように接続できなかった。


JTAG ICEがこんなに面白いとなるとARM用のUSBProgも早く使えるようにしなきゃ!

FunkOS kernelハード依存部

一月ぶりのFunkOSの続きです。


過去に日記↓

http://ameblo.jp/elementor/entry-10303902339.html

http://ameblo.jp/elementor/entry-10301111081.html



今回はハードウェア依存部分になります。

ハードは下記の評価基板を自作して使用します。

前回紹介した回路(http://ameblo.jp/elementor/entry-10301111081.html )少し変更してます↓↓


組込みとともに
○回路図の修正内容

 ・リセットの遅延用コンデンサを外した(AVRISP MKIIでリセット遅延があると回路以上と判断される)

 ・他凡ミス

マイコンはATMEGA644Pを使用するのでFunkOSプロジェクトファイル無いの

\port\AVR_GCC\atmega644ディレクトリ無いが対象となります。

標準のコードはINT0割り込みを使用しますが、今回はPCINT28を使用できるように変更しています。


もとのコードはhttp://sourceforge.net/projects/funkos/files からダウンロードしてご確認ください。

変更後のソースを下記に記載します。


1.kernelswi.c

//---------------------------------------------------------------------------
// FunkOS - Copyright (c) 2009, Funkenstein Software, See license.txt for details
//---------------------------------------------------------------------------
#include "types.h"
#include "kernelcfg.h"
#include "task.h"

#include <avr\io.h >
#include <avr\interrupt.h >

/* ソフトウェア割り込みはPORTD-4 PCINT28 */
//---------------------------------------------------------------------------
void KernelSWI_Config(void)
{
    PORTD &= ~_BV(PD4); // Clear PCINT28
    DDRD |= _BV(PD4);	// Set PortD, bit 4 (PCINT28) As Output
}

//---------------------------------------------------------------------------
void KernelSWI_Start(void)
{
    PCMSK3 &= ~_BV(PCINT28); // PCINT28を割込み禁止
    PCIFR |= _BV(PCIF3);	// Clear any pending interrupts on PCINT28
    PCMSK3 |= _BV(PCINT28); // PCINT28を割込み許可

}

//---------------------------------------------------------------------------
void KernelSWI_Stop(void)
{
    PCMSK3 &= ~_BV(PCINT28); // PCINT28を割込み禁止
    PCIFR |= _BV(PCIF3);	// Clear any pending interrupts on PCINT28
}

//---------------------------------------------------------------------------
void KernelSWI_Clear(void)
{
    PCIFR |= _BV(PCIF3);	// Clear any pending interrupts on PCINT28
}

/* XOR : ^

 A B | Y
 ----+--
 0 0 | 0
 0 1 | 1 <- ビット反転
 1 0 | 1
 1 1 | 0 <- ビット反転
*/
//---------------------------------------------------------------------------
void KernelSWI_Trigger(void)
{
    if (Task_IsSchedulerEnabled())
    {
        PORTD ^= _BV(PD4);
    }
}
続いてkerneltimerです。標準では1Tick=100msecですがこれを1msecへ変更します。
2.kerneltimer.c
//---------------------------------------------------------------------------
// FunkOS - Copyright (c) 2009, Funkenstein Software, See license.txt for details
//---------------------------------------------------------------------------
#include "mcu.h"
#include "types.h"
#include "kernelcfg.h"

#include <avr\io.h >
#include <avr\interrupt.h >

#define TICK_TIME (1000UL) /* 1/1msec */

/* Timer Settings
CTC動作 WGM13:0 WGM12:1 WGM11:0 WGM10:0
*/
//---------------------------------------------------------------------------
void KernelTimer_Config(void)
{
    // CTC Mode Bit
    TCCR1A &= ~_BV(WGM10) & ~_BV(WGM11) & ~_BV(WGM13);
    TCCR1B |= _BV(WGM12);
    // OCR1A = システムクロック / 分周比(シフト量 8=2^3 64=2^6 256=^8 1024=2^10) / 周期(1msec=1000) -1
    TCCR1B &= ~_BV(CS12);
    TCCR1B |= _BV(CS11) | _BV(CS10); // 64分周
    OCR1A = (USHORT)((CPU_CLOCK / TICK_TIME / 64) - 1);	// Set the trigger time / 64 prescaler
}

//---------------------------------------------------------------------------
void KernelTimer_Start(void)
{
    TIFR1 &= ~_BV(OCF1A);  // Clear pending interrupts
    TIMSK1 |= _BV(OCIE1A);	// Enable interrupt
}

//---------------------------------------------------------------------------
 void KernelTimer_Stop(void)
{
    TIFR1 &= ~_BV(OCF1A);  // Clear interrupt flags
    TIMSK1 &= ~_BV(OCIE1A);	// Disable interrupt
}

//---------------------------------------------------------------------------
void KernelTimer_DI(void)
{
    TIFR1 &= ~_BV(OCF1A);  // Clear interrupt flags
    TIMSK1 &= ~_BV(OCIE1A);	// Disable interrupt
}

//---------------------------------------------------------------------------
void KernelTimer_EI(void)
{
    TIFR1 &= ~_BV(OCF1A);  // Clear pending interrupts
    TIMSK1 |= _BV(OCIE1A);	// Enable interrupt
}


3.taskport.c

もともとはINT0で割り込みが掛かっていたためこれをPCINT28へ変更します。

変更部分だけ記載します。

○変更前


ISR(INT0_vect) __attribute__ ( ( signal, naked ) );
ISR(INT0_vect)

○変更後

ISR(PCINT3_vect) __attribute__ ( ( signal, naked ) );
ISR(PCINT3_vect)

尚、本変更はPCINT3系でタスクディスパッチャが発生するため、他のPCINT3系を同時利用する場合はtaskport.cで他のピンチェンジ割り込みと切り分ける処理を行う必要があります


また独自にMCUの初期化関数を追加します。

4.mcu.c

/*!
 @file mcu.c
 @brief MCUの初期化などMCU固有の操作を行います
 @author Yamazaki
 @date 21-Jul-09, new
*/

#include <avr >
#include "types.h"
#include "mcu.h"

/* ■■■ MCUポートセッティング ■■■
回路図より(2009.7.21現在)
No. Name    Pin-No. Net     name    IO  Description
1   PA0     40      D0      OUT     OUT固定 LCDデータバスに接続(デフォルト値L)
2   PA1     39      D1      OUT     OUT固定 LCDデータバスに接続(デフォルト値L)
3   PA2     38      D2      OUT     OUT固定 LCDデータバスに接続(デフォルト値L)
4   PA3     37      D3      OUT     OUT固定 LCDデータバスに接続(デフォルト値L)
5   PA4     36      D4      OUT     OUT固定 LCDデータバスに接続(デフォルト値L)
6   PA5     35      D5      OUT     OUT固定 LCDデータバスに接続(デフォルト値L)
7   PA6     34      D6      OUT     OUT固定 LCDデータバスに接続(デフォルト値L)
8   PA7     33      D7      OUT/IN  BUSY読み込み時IN LCDデータバスに接続(デフォルト値L出力)
9   PB0     1       RS      OUT     OUT固定 LCDインストラクション制御(デフォルトL)
10  PB1     2       R/W     OUT     OUT固定 LCD書出し/読込み制御(デフォルトL)
11  PB2     3       E       OUT     OUT固定 LCDイネーブル制御(デフォルトL)
12  PB3     4       LED1    OUT     OUT固定 L:点灯 H:消灯(デフォルトH)
13  PB4     5       No-Net  OUT     OUT固定 L
14  PB5     6       MOSI    OUT     OUT固定 L(ISP)
15  PB6     7       MISO    OUT     OUT固定 L(ISP)
16  PB7     8       SCK     OUT     OUT固定 L(ISP)
17  PC0     22      No-NET  OUT     OUT固定 L
18  PC1     23      No-NET  OUT     OUT固定 L
19  PC2     24      TCK     OUT     OUT固定 L(JTAG)
20  PC3     25      TMS     OUT     OUT固定 L(JTAG)
21  PC4     26      TDO     OUT     OUT固定 L(JTAG)
22  PC5     27      TDI     OUT     OUT固定 L(JATG)
23  PC6     28      ---     ---     32.768kHz水晶接続(OUT/INどちらでも可)
24  PC7     29      ---     ---     32.768kHz水晶接続(OUT/INどちらでも可)
25  PD0     14      RXD     ---     UART
26  PD1     15      TXD     ---     UART
27  PD2     16      SW1     IN      キー1(チャタリングSWフィルタ必要)
28  PD3     17      SW2     IN      キー2(チャタリングSWフィルタ必要)
29  PD4     18      ---     OUT     ソフトウェア割り込みに使用する(PCINT)
30  PD5     19      ---     OUT     OUT固定 L(未使用)
31  PD6     20      DTR     IN      FT232RL
32  PD7     21      LED2    OUT     OUT固定 L:点灯 H:消灯(デフォルトH)

Regster | 7 6 5 4 | 3 2 1 0 | Hex
--------+---------+---------+-------
 DDRA   | 1 1 1 1 | 1 1 1 1 | 0xff
 PORTA  | 0 0 0 0 | 0 0 0 0 | 0x00
 
 DDRB   | 1 1 1 1 | 1 1 1 1 | 0xff
 PORTB  | 0 0 0 0 | 1 0 0 0 | 0x08
 
 DDRC   | 0 0 1 1 | 1 1 1 1 | 0x3f
 PORTC  | 0 0 0 0 | 0 0 0 0 | 0x00
 
 DDRD   | 1 0 1 1 | 0 0 0 0 | 0xb0
 PORTD  | 1 0 0 0 | 0 0 0 0 | 0x80

*/

/*!
 @brief MCU初期化関数
 @return MCU_RESET_STSTUS
*/
UCHAR Mcu_Init(void)
{	
    UCHAR Reset = MCUSR & 0x1f; /* WDRF:WDT BORF:BOR EXTRF:External PORF:PowerOnReset */
    MCUSR = 0; /* 電源ON後直ちにクリア */
    
    PORTA = 0x00;
    DDRA  = 0xff;
    
    PORTB = 0x08;
    DDRB  = 0xff;
    
    PORTC = 0x00;
    DDRC  = 0x3f;
    
    PORTD = 0x80;
    DDRD  = 0xb0;
    
    PCICR |= _BV(PCIE3); // PCINT24~31のPC割込み禁止(ソフトウェア割込みPCIN28)

    return Reset;
}

5.mcu.h

#ifndef __MCU_H__
#define __MCU_H__

#include "types.h"

#define CPU_CLOCK (16000000UL) /* 16MHz */

#define POW_RESET 1  /*!< 電源ONリセット */
#define EXT_RESET 2  /*!< 外部リセット */
#define BOR_RESET 4  /*!< 電圧低下検知リセット */
#define WDT_RESET 8  /*!< ウォッチドッグタイマリセット */
#define JTG_RESET 16 /*!< JTAGリセット */

UCHAR Mcu_Init(void);


#endif /* __MCU_H__ */

最近気付いたのですがリポジトリは少しずつ更新されてたみたいで、最新版をチェックアウトして使った方が良いかと思います。
最近はHD44780のドライバとかジョイスティックのドライバとかも含まれています。

またARM_CM3やMSP430にも対応しているようです

http://sourceforge.net/scm/?type=svn&group_id=263037



つづく