/* Name: main.c
*
* CPU AVR2313 8MHz
*
* 妖怪ウオッチ零式 (改) Ver1.0
* PIN 2; PD0 RXD デバッグ用未使用
* PIN 3: PD1 TXD デバッグ用未使用
*
* PIN 12:O PB0 sw s3 制御用 ポート出力
* PIN 13:O PB1 sw s4 制御用 ポート出力
* PIN 14:O PB2 sw s5 制御用 ポート出力
* PIN 15:O PB3 sw s6 制御用 ポート出力
* PIN 16:O PB4 NC
* PIN 17:O PB5 NC
* PIN 18:O PB6 NC
* PIN 19:O PB7 NC
*
* PIN 7 :I PD3 int SW1 族を変更して音声発生 (CHANGE SW)
* PIN 6 :I PD2 int SW0 つぎの音声を発生 (NEXT SW)
*
* FUSES = -U hfuse:w:0x9d:m -U lfuse:w:0xe4:m
* 8分周選択なし,クロック出力許可しない 1.8Vリセット
*
*Copyright (C) 2015, pimona, all right reserved.
*
*仕様
*
* 割り込みINT0を妖怪召還SWとする (NEXT SW)
* 割り込みINT1を種族きりかえSWとする(CHANGE SW)
* 割り込みSWによる、起動をおこない。アイドル処理は処理をおえたらパワーダウン
* モードのスリープに入る。
* 妖怪の呼び出しは種族単位で管理する。
*
*履歴 2015.02.27 Ver. 1.0 リリース
*/
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include <avr/pgmspace.h>
#include <avr/sleep.h>
/* function プロトタイプ宣言 */
void output_medal_sw(int index);// メダルSW 出力関数
void change_zoku();//族を変更
void eject_medal_sw();//メダルSW イジェクト出力関数
//ビット操作マクロ
#define cbi(addr,bit) addr &= ~(1<<bit)
#define sbi(addr,bit) addr |= (1<<bit)
//メダル挿入 状態
#define EJECT 0x01 //イジェクト
#define INSERT 0x02//挿入
//メダルSW 状態
#define CHANGE_SW 0x08 //族切り替えSW オン
#define NEXT_SW 0x04 //NEXT音声SW オン
//妖怪ウオッチ制御変数
unsigned char medal_soket=0;//
volatile unsigned char sw_stat = 0;//割り込みSW押下状態(族切り替えSW,NEXT SW)
unsigned char pat_index=0;//パターンテーブル現在位置
unsigned char pat_attr=0;//現在 族 属性
unsigned char key_index=0;//IRで受信した3桁メダル番号を格納
unsigned char key_code[3]={0,0,0};//IRで受信した数字
unsigned char pat_buff[4]={0,0,0,0b1010};//メダルSW出力メダルパターン格納バッファ
#define MEDAL_PULSE_WIDTH 60 //メダルINS SW値、出力間隔(ms)
#define MEDAL_EJECT_PULSE_WIDTH 60//メダルEJECI SW値、出力間隔(ms)
#define EJECT_VOICE_WAIT 2000 //EJECT 音声終了 待ち時間(ms)
#define ZOK_MAX 11 //種族の種類
#define ZOK1_MAX 15 //イサマシ族の数
#define ZOK2_MAX 19 //フシギ族の数
#define ZOK3_MAX 13 //ゴーケツ族の数
#define ZOK4_MAX 30 //プリチー族の数
#define ZOK5_MAX 18 //ポカポカ族の数
#define ZOK6_MAX 15 //ウスラカゲ族の数
#define ZOK7_MAX 16 //ブキミー族の数
#define ZOK8_MAX 18 //ニョロロン族の数
#define ZOK9_MAX 15 //カイマ族の数
#define ZOK10_MAX 4//レジェンド族の数
#define ZOK11_MAX 10 //その他族の数
#define ZOK1_TOP 0 //イサマシ族先頭
#define ZOK2_TOP (ZOK1_TOP+ZOK1_MAX) //フシギ族の先頭
#define ZOK3_TOP (ZOK2_TOP+ZOK2_MAX) //ゴーケツ族の先頭
#define ZOK4_TOP (ZOK3_TOP+ZOK3_MAX) //プリチー族の先頭
#define ZOK5_TOP (ZOK4_TOP+ZOK4_MAX) //ポカポカ族の先頭
#define ZOK6_TOP (ZOK5_TOP+ZOK5_MAX) //ウスラカゲ族の先頭
#define ZOK7_TOP (ZOK6_TOP+ZOK6_MAX) //ブキミー族の先頭
#define ZOK8_TOP (ZOK7_TOP+ZOK7_MAX) //ニョロロン族の先頭
#define ZOK9_TOP (ZOK8_TOP+ZOK8_MAX) //カイマ族の先頭
#define ZOK10_TOP (ZOK9_TOP+ZOK9_MAX) //レジェンド族の先頭
#define ZOK11_TOP (ZOK10_TOP+ZOK10_MAX) //その他族の先頭
struct CTL_TBL{ //族情報インデックス管理テーブル
unsigned char top_offs;//族情報先頭オフセット
unsigned char end_offs;//族情報最終オフセット
}ctl_tbl[ZOK_MAX]={
{ZOK1_TOP,ZOK1_MAX-1}, //イサマシ族
{ZOK2_TOP,(ZOK2_TOP+ZOK2_MAX)-1},//フシギ族
{ZOK3_TOP,(ZOK3_TOP+ZOK3_MAX)-1},//ゴーケツ族
{ZOK4_TOP,(ZOK4_TOP+ZOK4_MAX)-1},//プリチー族
{ZOK5_TOP,(ZOK5_TOP+ZOK5_MAX)-1},//ポカポカ族
{ZOK6_TOP,(ZOK6_TOP+ZOK6_MAX)-1},//ウスラカゲ族
{ZOK7_TOP,(ZOK7_TOP+ZOK7_MAX)-1},//ブキミー族
{ZOK8_TOP,(ZOK8_TOP+ZOK8_MAX)-1},//ニョロロン族
{ZOK9_TOP,(ZOK9_TOP+ZOK9_MAX)-1},//カイマ族
{ZOK10_TOP,(ZOK10_TOP+ZOK10_MAX)-1},//レジェンド族
{ZOK11_TOP,(ZOK11_TOP+ZOK11_MAX)-1}//その他族
};
PROGMEM const uint8_t pat_array[][3] ={//メダルSW出力パターン登録テーブル(フラッシュメモリに置く)
//1イサマシ族======================================
{0b1100,0b0010,0b0001},//:イサマシ,S,鬼食い
{0b1100,0b0101,0b0110},//:イサマシ,S,いのちとり
{0b1100,0b0001,0b1111},//:イサマシ,A,焼きおに斬り
{0b1100,0b0001,0b1110},//:イサマシ,A,万尾獅子
{0b1100,0b0001,0b1101},//:イサマシ,B,フユニャン
{0b1101,0b1011,0b0001},//:イサマシ,B,フユニャン
{0b1110,0b0101,0b0111},//:イサマシ,C,メラメライオン
{0b0111,0b0101,0b0010},//:イサマシ,C,ブリー隊長
{0b1100,0b0001,0b1000},//:イサマシ,C,泥田坊
{0b1100,0b0001,0b1001},//:イサマシ,C,ブリー隊長
{0b1100,0b0001,0b0111},//:イサマシ,D,あかなめ
{0b1100,0b0001,0b0010},//:イサマシ,E,獅子まる
{0b1100,0b0001,0b0011},//:イサマシ,E,かたづ家来
{0b1100,0b0001,0b1011},//:イサマシ,E,アライ魔将
{0b1100,0b0001,0b0100},//:イサマシ,E,おこ武者
//2フシギ族======================================
{0b1100,0b0011,0b0010},//:フシギ,S,ぬえ
{0b1100,0b0101,0b1000},//:フシギ,S,風魔猿
{0b1110,0b0101,0b0110},//:フシギ,S,キュウビ
{0b0110,0b0101,0b1000},//:フシギ,S,天狗
{0b0011,0b0101,0b1111},//:フシギ,?,ミスタームービン,Zメダル
{0b1100,0b0010,0b1101},//:フシギ,A,えんらえんら
{0b1100,0b0010,0b1111},//:フシギ,A,あやまり倒し
{0b1100,0b0010,0b1110},//:フシギ,A,おでんじん
{0b1100,0b0011,0b0001},//:フシギ,A,うんがい三面鏡
{0b1110,0b0101,0b1111},//:フシギ,B,セバスチャン
{0b1100,0b0010,0b1011},//:フシギ,B,メゾンド・ワスレ
{0b0011,0b0101,0b1100},//:フシギ,C,アペリカン
{0b1100,0b0010,0b1001},//:フシギ,C,USO
{0b1110,0b0101,0b1100},//:フシギ,C,ドクロ婆
{0b1100,0b0010,0b0111},//:フシギ,D,のっぺら坊
{0b1100,0b0010,0b1000},//:フシギ,D,一旦ゴメン
{0b1100,0b0010,0b0100},//:フシギ,D,こえんら
{0b1100,0b0010,0b0110},//:フシギ,E,化け草履
{0b1100,0b0010,0b0011},//:フシギ,E,さかさっ傘
//3ゴーケツ族======================================
{0b1100,0b0101,0b0100},//:ゴーケツ,S,大やもり
{0b1100,0b0100,0b0011},//:ゴーケツ,S,大ガマ
{0b1110,0b0101,0b0001},//:ゴーケツ,A,ロボニャン
{0b1100,0b0011,0b1111},//:ゴーケツ,A,ヒライ神
{0b1100,0b0100,0b0001},//:ゴーケツ,A,ガマンモス
{0b1100,0b0011,0b1101},//:ゴーケツ,B,だっせんしゃ
{0b1100,0b0011,0b1110},//:ゴーケツ,B,プライ丼
{0b1100,0b0011,0b1011},//:ゴーケツ,C,あせっか鬼
{0b1100,0b0011,0b1000},//:ゴーケツ,D,雷蔵
{0b1100,0b0011,0b1001},//:ゴーケツ,D,モノマネキン
{0b1100,0b0011,0b0100},//:ゴーケツ,E,ドキ土器
{0b1100,0b0011,0b0110},//:ゴーケツ,E,うらや飯
{0b1100,0b0011,0b0111},//:ゴーケツ,E,迷い車
//4プリチー族======================================
{0b1100,0b0100,0b1111},//:S,プリチー,マスターニャーダ
{0b1100,0b0101,0b0010},//:S,プリチー,水虎
{0b0111,0b0101,0b1000},//:プリチー,アカマル
{0b0110,0b0101,0b1011},//プリチー,ジバニャン
{0b0110,0b0101,0b1101},//:プリチー,ジバニャン
{0b0001,0b0101,0b0100},//:A,プリチー,スイカニャン
{0b1111,0b0101,0b1110},//:A,プリチー,ロボコマ
{0b1000,0b0101,0b1011},//:A,プリチー,ロボガッパ
{0b1100,0b0100,0b1110},//:A,プリチー,河童
{0b1100,0b0100,0b1101},//:B,プリチー,おバク様
{0b0110,0b0101,0b1111},//:B,プリチー,トゲニャン
{0b0001,0b0101,0b0110},//:B,プリチー,メロンニャン
{0b1111,0b0101,0b0001},//:B,プリチー,ブドウニャン
{0b1111,0b0101,0b0011},//:B,プリチー,ミカンニャン
{0b1100,0b1001,0b1011},//:B,プリチー,ケマモン
{0b0111,0b0101,0b0001},//:C,プリチー,ブチニャン
{0b1100,0b0100,0b1001},//:C,プリチー,雨女
{0b1100,0b0100,0b1011},//:C,プリチー,ばくそく
{0b0110,0b0101,0b0011},//:D,プリチー,コマじろう
{0b0110,0b0101,0b0001},//:D,プリチー,コマさん
{0b0110,0b0101,0b1001},//:D,プリチー,コマさん
{0b0111,0b0101,0b1110},//:D,プリチー,ノガッパ
{0b1100,0b0100,0b0110},//:D,プリチー,一つ目小僧
{0b1100,0b0100,0b0111},//:E,プリチー,びきゃく
{0b1100,0b0100,0b1000},//:D,プリチー,つらがわり
{0b1101,0b1001,0b1110},//:プリチー,ジバニャン??
{0b1101,0b1001,0b1111},//:プリチー,ジバニャン??
{0b1100,0b0101,0b1101},//:D,プリチー,コマじろう
{0b1100,0b0101,0b1110},//:D,プリチー,コマさん
{0b1110,0b0101,0b1101},//:D,プリチー,コマさん
//5ポカポカ族======================================
{0b0011,0b0101,0b1110},//:S,ポカポカ,イッカク
{0b1100,0b0111,0b0011},//:S,ポカポカ,大くだん
{0b1100,0b0111,0b0100},//:S,ポカポカ,麒麟
{0b1100,0b0110,0b1111},//:A,ポカポカ,から傘魔神
{0b1100,0b0111,0b0001},//:A,ポカポカ,ざしきわら神
{0b1100,0b0111,0b0010},//:A,ポカポカ,お金ナイダー
{0b1111,0b0101,0b1001},//:A,ポカポカ,ロボG
{0b1100,0b0110,0b1101},//:B,ポカポカ,キズナース
{0b1100,0b0110,0b1110},//:B,ポカポカ,大山砂夫
{0b1100,0b0110,0b0100},//:C,ポカポカ,くだん
{0b1100,0b0110,0b1001},//:C,ポカポカ,晴れ男
{0b1100,0b0110,0b1011},//:C,ポカポカ,ワカメ☆スター
{0b1110,0b0101,0b0100},//:C,ポカポカ,ホノボーノ
{0b1100,0b0110,0b0111},//:D,ポカポカ,ざしきわらし
{0b1100,0b0110,0b0001},//:E,ポカポカ,キズナメコ
{0b1100,0b0110,0b0010},//:E,ポカポカ,から傘お化け
{0b1100,0b0110,0b0011},//:E,ポカポカ,砂夫
{0b1110,0b0101,0b1001},//:E,ポカポカ,ひも爺
//6ウスラカゲ族======================================
{0b1100,0b0101,0b0001},//:S,ウスラカゲ,きらめ鬼
{0b1100,0b0100,0b0010},//:A,ウスラカゲ,百々目鬼
{0b1100,0b0111,0b0110},//:E,ウスラカゲ,TETSUYA
{0b1100,0b0111,0b1000},//:D,スラカゲ,かりパックン
{0b1100,0b0111,0b1001},//:B,ウスラカゲ,草くいおとこ
{0b1100,0b0111,0b1111},//:B,ウスラカゲ,ミツマタノヅチ
{0b1100,0b1000,0b0001},//:B,ウスラカゲ,リー夫人
{0b1100,0b1000,0b0010},//:B,ウスラカゲ,ガブニャン
{0b1100,0b1000,0b0011},//:B,ウスラカゲ,KANTETSU
{0b1100,0b1000,0b0100},//:B,ウスラカゲ,肉くいおとこ
{0b1100,0b1000,0b0111},//:B,ウスラカゲ,どんどろ
{0b1100,0b0111,0b1011},//:C,ウスラカゲ,まてんし
{0b1100,0b0111,0b1101},//:C,ウスラカゲ,ひとまか仙人
{0b1100,0b0111,0b1110},//:C,ウスラカゲ,りもこんかくし
{0b0110,0b0101,0b1110},//:D,ウスラカゲ,ヒキコウモリ
//7ブキミー族======================================
{0b1100,0b1001,0b1000},//:S,ブキミー,土蜘蛛
{0b0011,0b0101,0b1101},//:S,ブキミー,女郎蜘蛛
{0b0110,0b0101,0b1100},//:A,ブキミー,ダークニャン
{0b1100,0b1001,0b0110},//:A,ブキミー,ふさふさん
{0b1100,0b1001,0b0111},//:A,ブキミー,呪野花子
{0b1000,0b0101,0b1101},//:B,ブキミー,ロボメン犬
{0b1100,0b1001,0b0010},//:B,ブキミー,ぶんぶん鳥
{0b1100,0b1001,0b0011},//:B,ブキミー,のぼせトンマン
{0b1100,0b1001,0b0100},//:B,ブキミー,爆音ならし
{0b1100,0b1000,0b1110},//:C,ブキミー,じがじぃさん
{0b1100,0b1000,0b1111},//:C,ブキミー,花子さん
{0b1100,0b1001,0b0001},//:C,ブキミー,のらりくらり
{0b1100,0b1000,0b1101},//:D,ブキミー,認MEN
{0b1110,0b0101,0b0010},//:D,ブキミー,ドンヨリーヌ
{0b1100,0b1000,0b1001},//:E,ブキミー,けうけげん
{0b1100,0b1000,0b1011},//:E,ブキミー,おともらし
//8ニョロロン族======================================
{0b1110,0b0101,0b1000},//:S,ニョロロン,オロチ
{0b0011,0b0101,0b1011},//:S,ニョロロン,イザナミ
{0b1100,0b1011,0b1101},//:S,ニョロロン,八百比丘尼
{0b0011,0b0101,0b1001},//:?,ニョロロン,スティーブ・ジョーズ,Zメダル
{0b1100,0b1011,0b0111},//:A,ニョロロン,激ドラゴン
{0b1100,0b1011,0b1000},//:A,ニョロロン,おもいだ神
{0b1100,0b1011,0b1001},//:A,ニョロロン,こんがらギャル
{0b0001,0b0101,0b0011},//:B,ニョロロン,ロボりゅーくん
{0b1000,0b0101,0b1110},//:B,ニョロロン,ロボノコ
{0b1100,0b1011,0b0110},//:B,ニョロロン,ホリュウ
{0b1100,0b1011,0b0001},//:B,ニョロロン,つられたろう丸
{0b1100,0b1011,0b0100},//:C,ニョロロン,ろくろ首
{0b1100,0b1001,0b1111},//:D,ニョロロン,おもいだスッポン
{0b1100,0b1011,0b0010},//:D,ニョロロン,ムカムカデ
{0b1100,0b1011,0b0011},//:D,ニョロロン,にんぎょ
{0b1100,0b1001,0b1101},//:E,ニョロロン,ねちがえる
{0b1100,0b1001,0b1110},//:E,ニョロロン,からみぞん
{0b1110,0b0101,0b0011},//:E,ニョロロン,ツチノコ
//9カイマ族======================================
{0b0111,0b0101,0b1111},//:カイマ,ヤッカイ
{0b0111,0b0101,0b1100},//:カイマ,フカイ
{0b0111,0b0101,0b0011},//:カイマ,ナンカイ
{0b0111,0b0101,0b1001},//:カイマ,ゴウカイ
{0b0111,0b0101,0b0110},//:カイマ,ハカイ
{0b0111,0b0101,0b1011},//:カイマ,ドロタボウ・怪
{0b1111,0b0101,0b1101},//:カイマ,えんらえんら・怪
{0b1111,0b0101,0b1011},//:カイマ,河童・怪
{0b1111,0b0101,0b0111},//:カイマ,から傘お化け・怪
{0b1111,0b0101,0b1100},//:カイマ,ざしきわらし・怪
{0b0111,0b0101,0b1101},//:カイマ,アカナメ・怪
{0b1111,0b0101,0b0110},//:カイマ,くだん・怪
{0b1111,0b0101,0b1000},//:カイマ,けうけげん・怪
{0b1111,0b0101,0b0100},//:カイマ,にんぎょ・怪
{0b1111,0b0101,0b0010},//:カイマ,ろくろ首・怪
//10レジェンド族=================================
{0b0001,0b0101,0b0111},//:レジェンド,フシギ,S,しゅらコマ
{0b1100,0b1011,0b1110},//:レジェンド,ネタバレリーナ
{0b1100,0b1011,0b1111},//:レジェンド,ウンチクマ
{0b1100,0b1101,0b0001},//:レジェンド,やまタン
//その他======================================
{0b1101,0b1011,0b0010},//:その他,オメデトウゴザイマス
{0b1101,0b1011,0b0011},//:その他,スゴイデスネヤルモンデスネ
{0b1101,0b1011,0b0100},//:その他,コロコロコミック
{0b1101,0b1011,0b0111},//:フシギ,召還であります
{0b1101,0b1011,0b1000},//:ゴウケツ,召還であります
{0b1101,0b1011,0b1001},//:プリチー,召還であります
{0b1101,0b1011,0b1100},//:ポカポカ,召還であります
{0b1101,0b1011,0b1110},//:ウスラカゲ,召還でありま
{0b0111,0b0101,0b0100},//:カイマ,召還であります
{0b1101,0b1100,0b0010},//:レジェンド,召還であります
};
ISR (INT0_vect,ISR_BLOCK) // NEXT SW 割り込み
{
_delay_ms(100);
sw_stat = NEXT_SW;//押下状態 SET
}
ISR (INT1_vect,ISR_BLOCK) // CHANGE SW 割り込み
{
_delay_ms(100);
sw_stat = CHANGE_SW;//押下状態 SET
}
int main (void)
{
// データレジスタの指定
//例;Port_D x0111 1111 xHHH HUHH
// H:出力(1) L:出力(0) U:内蔵プルアップ(1) D:プルアップなし(0)
// 方向設定レジスタ(DRR×) を入力設定にして
// データレジスタ(PORT×)で1にすると 内部プルアップ設定になる。
// PORTB の設定
DDRB = 0xff; //方向設定レジスタの指定 x1111 1111
// PORTD の設定
DDRD = 0xb3; //方向設定レジスタの指定 x1011 0011
PORTD = 0xff; // データレジスタの指定
sbi(GIMSK,INT0);// INT0を許可する
sbi(GIMSK,INT1);// INT1を許可する
cbi(MCUCR,ISC01);//INTピンのLレベルで割り込み
cbi(MCUCR,ISC00);// ;
if(!(PIND & (NEXT_SW)) ||
!(PIND &(CHANGE_SW)) ){//NEXT swが押されていれば。(low)
set_sleep_mode(SLEEP_MODE_IDLE);// アイドルモードを設定 2.30mA
}else{
set_sleep_mode(SLEEP_MODE_PWR_DOWN);// パワーダウンモードを設定 0.02mA
}
sei(); // 割り込みの許可
//main loop アイドル処理
while (1);
{
if(sw_stat & NEXT_SW){//NEXT SW 押されたか?
//sbi(PORTB,3); //LED on
if (medal_soket==INSERT) {//メダル状態は装着。
eject_medal_sw();
_delay_ms(EJECT_VOICE_WAIT);
medal_soket = EJECT;//メダル状態をイジェクトに。
}
output_medal_sw(pat_index);//音声を発生
medal_soket = INSERT;//メダル状態を装着に。//つぎの音声の取り出し準備
pat_index++;//現在 族 テーブルのメダルパターンインデックス更新
if(pat_index > ctl_tbl[pat_attr].end_offs){
pat_index = ctl_tbl[pat_attr].top_offs;
}
}else if(sw_stat & CHANGE_SW){//CHANGE SW 押されたか?
if (medal_soket==INSERT) {//メダル状態は装着。
eject_medal_sw();
medal_soket = EJECT;//メダル状態をイジェクトに。
_delay_ms(EJECT_VOICE_WAIT);
}
change_zoku();//族を変更
output_medal_sw(pat_index);//音声を発生
medal_soket = INSERT;//メダル状態を装着に。
}
sw_stat=0;
sleep_mode(); //スリープ開始。
}
return 0;
}
//
//族を変更
//
void change_zoku()
{
//族を変更
pat_attr++;
if (pat_attr == (ZOK_MAX)) {
pat_attr = 0;
}
//その族の先頭へ移動
pat_index = ctl_tbl[pat_attr].top_offs;
}
//
// メダルSW 出力
//
void output_medal_sw(int index)
{
int i;
for(i=0;i<3;i++){//音声発生指令パターン取り出し
pat_buff[i]=pgm_read_byte_near(&(pat_array[index][i]));
}
for(i=0;i<4;i++){//メダル挿入指令
PORTB=pat_buff[i];
_delay_ms(MEDAL_PULSE_WIDTH);
PORTB = 0;// sw all off
_delay_ms(MEDAL_PULSE_WIDTH);
}
return ;
}
//
//eject
//
void eject_medal_sw()
{
int i;
for(i=3;i >= 0;i--){//メダル取り出し指令
PORTB=pat_buff[i];
_delay_ms(MEDAL_EJECT_PULSE_WIDTH);
PORTB = 0;//必要か? ここでいいか?
_delay_ms(MEDAL_EJECT_PULSE_WIDTH);
}
}
//end program
戻る |
0 件のコメント:
コメントを投稿