FunkOS kernelハード依存部 | 組込みとともに

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



つづく