Ÿç„¡ç·šé€šä¿¡
| é …ç›® | 内容 |
|---|---|
| 機能 | 1行目:年月日を表示ã—ã¾ã™ã€‚ 2行目:時分秒を 表示ã—ã¾ã™ã€‚ 3行目:温度1を表示ã—ã¾ã™ã€‚ï¼ˆè¡¨ç¤ºå™¨ä¸Šã®æ¸©åº¦ã‚’表示ã—ã¾ã™ã€‚以å‰è£½ä½œã—ãŸæ¸©åº¦è¨ˆã¨åŒæ§˜ã§ã™ã€‚) 4行目:温度2を表示ã—ã¾ã™ã€‚(温度センサã‹ã‚‰ã®æ¸©åº¦ã‚’表示ã—ã¾ã™ã€‚) 温度1ã¯ä»¥å‰è£½ä½œã—ãŸæ¸©åº¦è¨ˆã¨åŒæ§˜ï¼‘ç§’æ¯Žã«æ›´æ–°ã—ã¾ã™ã€‚ æ¸©åº¦ï¼’ã¯æ¸©åº¦ã‚»ãƒ³ã‚µã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ãŒããŸã¨ãã«æ›´æ–°ã—ã¾ã™ã€‚ 年月日時分秒ã®èª¿æ•´ãŒã§ãã¾ã™ã€‚(以å‰è£½ä½œã—ãŸæ¸©åº¦è¨ˆã¨åŒæ§˜ã§ã™ã€‚) è¡¨ç¤ºå™¨ã¨æ¸©åº¦ã‚»ãƒ³ã‚µã¯ï¼¸ï¼¢ï½…ï½…ã§é€šä¿¡ã—ã¾ã™ã€‚(温度センサã‹ã‚‰è¡¨ç¤ºå™¨ã¸ä¸€æ–¹å‘ã®é€šä¿¡ã§ã™ã€‚) 表示器ã¯ã‚³ãƒ¼ãƒ‡ã‚£ãƒãƒ¼ã‚¿ãƒ¼ã«è¨å®šã—ã¾ã™ã€‚ 温度センサã¯ã‚¨ãƒ³ãƒ‰ãƒ‡ãƒã‚¤ã‚¹ã«è¨å®šã—ã¾ã™ã€‚ |
| é›»æº | 3.3Vã§å‹•作ã•ã›ã¾ã™ã€‚今回ã¯DC3.3Vã®ACアダプタを使用ã—ã¾ã™ã€‚ |
| LCD | å½¢å:SC2004CS è¡¨ç¤ºï¼šï¼’ï¼æ–‡å—X4行 データ:4ビットモードã§ä½¿ç”¨ã—ã¾ã™ã€‚ 3.3V動作用 |
| マイコン | ATmega328 |
| 温度センサ | 温度センサã¯LM61CIZを使用ã—ã¾ã™ã€‚ ADコンãƒãƒ¼ã‚¿ã®åŸºæº–é›»æºã¯ã‚·ãƒ£ãƒ³ãƒˆãƒ¬ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿TL451を使用ã—ã¾ã™ã€‚ |
| LCD制御 | CHANã•ã‚“ã®EZ-LCDを使用ã—ã¾ã™ã€‚ |
| XBee | XB24-Z7CIT-004 |
| é …ç›® | 内容 |
|---|---|
| 機能 | 10ç§’æ¯Žã«æ¸©åº¦è¨ˆæ¸¬ãƒ‡ãƒ¼ã‚¿ã‚’ç„¡ç·šã§é€ä¿¡ã—ã¾ã™ã€‚ é€ä¿¡ã®ã¿ã¨ã—ã¾ã™ã€‚ |
| é›»æº | é›»æ± 2本(3V)ã§å‹•作ã•ã›ã¾ã™ã€‚ |
| 温度センサ | 温度センサã¯LM61CIZを使用ã—ã¾ã™ã€‚ |
| XBee | XB24-Z7CIT-004 |
| åç§° | å½¢å | メーカ | 購入先 | æ•°é‡ |
|---|---|---|---|---|
| LCD | SC2004CS(3.3V用) | 秋月電å | 1 | |
| マイコン | ATmega328 | アトメル | 秋月電å | 1 |
| 抵抗 | 10kΩ 1/4W | 秋月電å | 4 | |
| åŠå›ºå®šæŠµæŠ— | 10kΩ | 秋月電å | 1 | |
| 押ã—ボタンスイッム| 赤色タクトスイッム| 秋月電å | 1 | |
| 押ã—ボタンスイッム| 黄色タクトスイッム| 秋月電å | 1 | |
| 押ã—ボタンスイッム| 緑色タクトスイッム| 秋月電å | 1 | |
| 温度センサ | LM61CIZ | ナショセミ | 秋月電å | 1 |
| シャントレギュレータ | TL431ACZ | 秋月電å | 1 | |
| XBee | XB24-Z7CIT-004 | スイッãƒã‚µã‚¤ã‚¨ãƒ³ã‚¹ | 1 |
| åç§° | å½¢å | メーカ | 購入先 | æ•°é‡ |
|---|---|---|---|---|
| 温度センサ | LM61CIZ | ナショセミ | 秋月電å | 1 |
| XBee | XB24-Z7CIT-004 | スイッãƒã‚µã‚¤ã‚¨ãƒ³ã‚¹ | 1 |
| è¨å®šé …ç›® | è¨å®šå€¤ (16進) |
内容 | |
|---|---|---|---|
| FUNCTION SET | ZIGBEE COORDINATOR API | ||
| Networking | PAN ID | 10 | 温度センサã®PAN IDã¨ä¸€è‡´ã—ã¦ã„れã°ä»»æ„ã§å¯ã€‚ ãŸã ã—'0'以外ã¨ã—ã¾ã™ã€‚ |
| è¨å®šé …ç›® | è¨å®šå€¤ (16進) |
内容 | |
|---|---|---|---|
| FUNCTION SET | ZIGBEE END DEVICE AT | ||
| Networking | PAN ID | 10 | 表示器ã®PAN IDã¨ä¸€è‡´ã—ã¦ã„れã°ä»»æ„ã§å¯ã€‚ ãŸã ã—'0'以外ã¨ã—ã¾ã™ã€‚ |
| Sleep Mode | SM-Sleep Mode | サイクリック スリープ | |
| ST-Time before Sleep | 7D0 | 2ç§’é–“èµ·ãã¦ã„ã¾ã™ã€‚(動作ä¸ï¼‰ | |
| SP-Cyclic Sleep Period | 20 | 320ms毎ã«å—信確èªã‚’ã™ã‚‹ã€‚ | |
| SN-Number of Cyclic to power don IO | 19 | 320ms毎ã«25回å—信確èªã—ã¾ã™ã€‚ 従ã£ã¦ã‚¹ãƒªãƒ¼ãƒ—時間ã¯25回 X 320ms = 8ç§’ã§ã™ã€‚ ãã®å¾Œã€2ç§’é–“èµ·ãã¦ã„ã¾ã™ã€‚ |
|
| I/O Settings | D1-AD1/DIO1 Configuration | 2 | 2:ADCã€DI01端åã‚’ADC入力ã«ã™ã‚‹ã€‚ |
| PR-Pull-up Resistor Enable | 1FF7 | AD1ã®ãƒ—ãƒ«ã‚¢ãƒƒãƒ—ã‚’ç¦æ¢ã—ã¾ã™ã€‚ | |
| I/O Sampling | IR-IO Sampling Rate | 7D1 | 2001msã«è¨å®šã€1回ADサンプリングを行ã„ã¾ã™ã€‚ ( ST / IR + 1 )回サンプリングを行ã„ã¾ã™ã€‚ |
| フレーム・フィールド | コード(16進) | ãƒã‚¤ãƒˆæ•° | 備考 |
|---|---|---|---|
| 開始コード | 7E | 1 | |
| データ長 | 0014 | 2 | コマンドIDã‹ã‚‰ãƒã‚§ãƒƒã‚¯ã‚µãƒ ç›´å‰ã¾ã§ã®ãƒã‚¤ãƒˆæ•° |
| コマンドID | 92 | 1 | データãŒå—ä¿¡ |
| 64ビットアドレス | 0013A200407798BB | 8 | é€ä¿¡å…ƒã®ã‚¢ãƒ‰ãƒ¬ã‚¹ |
| 16ビットアドレス | 3FFE | 2 | é€ä¿¡å…ƒã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã€‚é€ä¿¡å…ƒãŒã‚³ãƒ¼ãƒ‡ã‚£ãƒãƒ¼ã‚¿ã®ã¨ãã¯ã‚ªãƒ¼ãƒ«'0'。 |
| å—信オプション | 41 | 1 | |
| サンプル数 | 01 | 1 | |
| デジタルãƒãƒ£ãƒ³ãƒãƒ« | 0001 | 2 | デジタルãƒãƒ£ãƒ³ãƒãƒ«ã®ä½¿ç”¨ãƒ“ット。ビット0を使用ã—ã¦ã„ã‚‹(DIO0)。 |
| アナãƒã‚°ãƒãƒ£ãƒ³ãƒãƒ« | 02 | 1 | アナãƒã‚°ãƒãƒ£ãƒ³ãƒãƒ«ä½¿ç”¨ãƒ“ット。ビット1を使用ã—ã¦ã„ã‚‹(AD1)。 |
| デジタルãƒãƒ£ãƒ³ãƒãƒ«ãƒ‡ãƒ¼ã‚¿ | 0001 | 2 | デジタルãƒãƒ£ãƒ³ãƒãƒ«ã®ãƒ‡ãƒ¼ã‚¿ã€‚ビット0ãŒ1 |
| アナãƒã‚°ãƒãƒ£ãƒ³ãƒãƒ«ãƒ‡ãƒ¼ã‚¿ | 02E8 | 2 | アナãƒã‚°ãƒãƒ£ãƒ³ãƒãƒ«ã®ãƒ‡ãƒ¼ã‚¿ã€‚ãƒãƒ£ãƒ³ãƒãƒ«æ•°ã«å¿œã˜ã¦ãƒ‡ãƒ¼ã‚¿ãŒç¶šã。 AD1ã®ãƒ‡ãƒ¼ã‚¿ãŒ02E8。 |
| ãƒã‚§ãƒƒã‚¯ã‚µãƒ | 41 | 1 |
/*
* Temp.c
*
* Created: 2012/07/16
* Author: YoshioNakamura
* æ¸©åº¦è¨ˆæ¸¬çµæžœã‚’ç„¡ç·šã§é€ã‚Šè¡¨ç¤ºã™ã‚‹ã€‚
* LCDã®åˆ¶å¾¡ã¯ChaNã•ã‚“ã® "EZ-LCD - Generic control module for HD44780" LCDCを使用
* XBeeã¯ã€ŒCQå‡ºç‰ˆè¶…ãŠæ‰‹è»½ç„¡ç·šãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«XBeeã€ã‹ã‚‰å¼•用
*/
# define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include "hd44780.h"
#include <util/delay.h>
// 時計
#define RED 0x20 // 赤スイッãƒ
#define YELLOW 0x10 // 黄スイッãƒ
#define GREEN 0x08 // 緑スイッãƒ
#define MODE (RED | YELLOW) // 時計変更モード
#define SWON (RED | YELLOW | GREEN) // å…¨ã¦ã®ã‚¹ã‚¤ãƒƒãƒãŒON
// 温度計
#define LM61_ON PORTC |= 1 << PORTC2 // LM61é›»æºON
#define LM61_OFF PORTC &= ~(1 << PORTC2) // LM61é›»æºOFF
#define ADC_ON ADCSRA |= (1 << ADEN) // adc許å¯
#define ADC_OFF ADCSRA &= ~(1 << ADEN) // adcåœæ¢
#define ADC_START ADCSRA |= 1 << ADSC // adcスタート
#define V_REF 2480 // レファレンス電圧
// 通信
#define RXBUF_SIZE 30 // å—信データ数
#define XBEE_REF 1200 // XBeeã®æ¸©åº¦ãƒ‡ãƒ¼ã‚¿ã®ãƒ¬ãƒ•ァレンス電圧
void InitHard(void); // ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢åˆæœŸåŒ–
void InitTime(void); // æ™‚é–“åˆæœŸåŒ–
void CalcDate(uint8_t, uint8_t); // 時計演算 0:åŠ ç®—ã€1:減算
void BlinkDisp(uint8_t, uint8_t); // 指定ä½ç½®ãƒ–リンクã™ã‚‹ã€‚ã€0:通常ã€1:剿¡ã®æ–‡å—を表示
void DateDisp(uint8_t, uint8_t, uint8_t); // æŒ‡å®šå ´æ‰€ã®æ–‡å—ã‚’æ›´æ–°ã™ã‚‹ã€‚
void UpdateTime(void); // 時計更新
void DoADC(void); // ADCを動作ã•ã›è¡¨ç¤ºã•ã›ã‚‹ã€‚  1秒毎
uint16_t ReadADCCel(void); // ADCã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’èªã¿å‡ºã™ã€‚デジタルフィルタ付
void AdcDisp( uint16_t); // ADC値を変æ›ã—表示
void XBeeTempDisp(void); // XBeeã®æ¸©åº¦ãƒ‡ãƒ¼ã‚¿ã‚’変æ›ã—ã¦è¡¨ç¤ºã™ã‚‹ã€‚
uint8_t g_u8BlinkFlg = 0; // 0:点ç¯ã€1:消ç¯
volatile uint8_t g_u8IntTimeFlg; // 時計割り込ã¿ãƒ•ラグ
uint8_t g_u8CalenderBuf[6]; // 時計データä¿å˜ã€ãƒ‡ãƒ¼ã‚¿ã¯BCDã§ä¿å˜ã€‚上ä½4bit:10ã®ä½ã€ä¸‹ä½4bit:1ã®ä½
union switch_states // スイッãƒçŠ¶æ…‹ãƒ•ãƒ©ã‚°
{
uint8_t BYTE;
struct
{
uint8_t mode :1; // 時計変更モード
uint8_t mode_keep :1; // 時計変更モード確定
uint8_t red :1; // 赤スイッãƒON
uint8_t red_keep :1; // 赤スイッãƒON->OFF
uint8_t yellow :1; // 黄スイッãƒON
uint8_t yellow_keep :1; // 黄スイッãƒON->OFF
uint8_t green :1; // 緑スイッãƒON
uint8_t green_keep :1; // 緑スイッãƒON->OFF
}BIT;
};
union switch_states g_uSwitchState;
uint8_t g_u8CalenderArray[2][12] = {{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, // カレンダ通常年
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}}; // カレンダé–å¹´
uint8_t g_u8LcdStr[] = {0xb5, 0xdd, 0xc4, 0xde, '1', ':', '-', '-', '-', '-', '.', '-', 0xdf, 'C'}; // LCDè¡¨ç¤ºãƒ‡ãƒ¼ã‚¿æ ¼ç´ãƒãƒƒãƒ•ã‚¡
// 通信
uint8_t g_u8Count; // å—信データ数
uint8_t g_u8RxBuff[RXBUF_SIZE]; // å—信データä¿å˜ãƒãƒƒãƒ•ã‚¡
union int_flg
{
uint8_t BYTE;
struct
{
uint8_t :6; // 余り
uint8_t time :1; // 時計割込
uint8_t rx7E :1; // å—信割込0x7eå—ä¿¡ã§ON
}BIT;
};
union int_flg g_uIntFlg;
int main(void)
{
uint8_t u8PortcState;
uint8_t u8LcdLocate; // 変更ä½ç½®è¨˜æ†¶ 0:yy, 1:mm, 2:dd, 3:hhh, 4:mmm, 5:sss
uint8_t u8LocateChange = 0; // 表示ä½ç½®å¤‰æ›´ãƒ•ラグ 0:変更ä½ç½®ç§»å‹•ãªã—ã€1:移動ã‚り
InitHard(); // ãƒãƒ¼ãƒˆã€LCDåˆæœŸåŒ–
g_u8IntTimeFlg = 0; // 250ms毎ã«ã‚«ã‚¦ãƒ³ãƒˆ
InitTime(); // æ™‚è¨ˆåˆæœŸåŒ–ãŠã‚ˆã³åˆæœŸå€¤è¡¨ç¤º
sei(); // 割り込ã¿è¨±å¯
while(1)
{
sleep_enable(); //sleep許å¯
sleep_cpu(); //sleepä¸
sleep_disable(); // sleepç¦æ¢
// 通信
if ( (g_uIntFlg.BIT.rx7E == 1) && (g_u8Count > 23))
{
if ( g_u8Count == 24) // å—信完了データå–å¾—
{
g_uIntFlg.BIT.rx7E = 0;
XBeeTempDisp();
}
else // データエラー
{
g_uIntFlg.BIT.rx7E = 0;
g_u8Count = 0;
}
}
// 時計更新
if ( g_uIntFlg.BIT.time == 1)
{
g_uIntFlg.BIT.time = 0;
g_u8IntTimeFlg++;
if (g_u8IntTimeFlg > 3) // 一秒経éŽ
{
UpdateTime(); // 時計更新
g_u8IntTimeFlg = 0;
DoADC(); // 1秒毎ã«ADCを動作ã•ã›æ¸©åº¦ã‚’LCDã«è¡¨ç¤ºã™ã‚‹ã€‚
}
// 時計調整
u8PortcState = ~PINC & SWON;
if (g_uSwitchState.BIT.mode_keep == 0) // 時計変更モード確èª
{
if ( (u8PortcState == MODE)) // 赤ã¨é»„色ã®ã‚¹ã‚¤ãƒƒãƒã‚’åŒæ™‚on。
{
g_uSwitchState.BIT.mode = 1;
}
else if ( (u8PortcState == 0) && (g_uSwitchState.BIT.mode == 1))
// 赤ã¨é»„スイッãƒãŒoff->on->offã§æ™‚計変更モードã«ç§»è¡Œ
{
g_uSwitchState.BIT.mode_keep = 1;
u8LcdLocate = 0;
BlinkDisp(u8LcdLocate, 0); // å¹´ã®ä½ç½®ãƒ–リンク表示
}
}
else if (g_uSwitchState.BIT.mode_keep) // 時計変更モードã€ã‚¹ã‚¤ãƒƒãƒã¯èµ¤->黄->ç·‘ã®é †ã§å„ªå…ˆé †ä½ãŒä½Žããªã‚‹ã€‚
{ // 赤ã¨ç·‘ãŒæŠ¼ã•れã å ´åˆã¯èµ¤ãŒå„ªå…ˆã•れる。
u8LocateChange = 0; //表示ä½ç½®å¤‰æ›´ãƒ•ラグクリア
if (u8PortcState == RED) // 赤ãŒon
{
g_uSwitchState.BYTE = 0;
g_uSwitchState.BIT.mode_keep = 1;
g_uSwitchState.BIT.red = 1;
}
else if (u8PortcState == YELLOW) // 黄ãŒon
{
g_uSwitchState.BYTE = 0;
g_uSwitchState.BIT.mode_keep = 1;
g_uSwitchState.BIT.yellow = 1;
}
else if (u8PortcState == GREEN) // ç·‘ãŒon
{
g_uSwitchState.BYTE = 0;
g_uSwitchState.BIT.mode_keep = 1;
g_uSwitchState.BIT.green = 1;
}
else if ( u8PortcState == 0) // スイッãƒãŒå…¨éƒ¨offã€ã‚¹ã‚¤ãƒƒãƒãŒoff->on->offã§å„動作をã™ã‚‹ã€‚
{
if (g_uSwitchState.BIT.red == 1) // 赤ãŒonã ã£ãŸ
{
g_uSwitchState.BIT.red = 0;
u8LcdLocate++;
u8LocateChange = 1;
}
if (g_uSwitchState.BIT.yellow == 1) // 黄ãŒonã ã£ãŸ
{
g_uSwitchState.BIT.yellow = 0;
CalcDate( u8LcdLocate, 0);
}
if (g_uSwitchState.BIT.green == 1) // ç·‘ãŒonã ã£ãŸ
{
g_uSwitchState.BIT.green = 0;
CalcDate(u8LcdLocate, 1);
}
}
BlinkDisp(u8LcdLocate, u8LocateChange); // ブリンクã€ã‚«ãƒ¬ãƒ³ãƒ€æ›´æ–°
}
}
} // while loop
}
void InitHard(void)
{
uint8_t i;
// portåˆæœŸåŒ–
DDRB = 0xff; // portb7:0=出力
PORTB = 0;
DDRC = 0x06; // portc2:1=出力
PORTC = 0;
DDRD = 0xfe; // portd7:1=出力
PORTD = 0;
// LCDåˆæœŸåŒ–
lcd_init();
// æ¸©åº¦ï¼‘åˆæœŸå€¤
lcd_locate( 2, 0);
g_u8LcdStr[4] = '1';
for ( i = 0; i < 14; i++)
{
lcd_putc(g_u8LcdStr[i]);
}
// æ¸©åº¦ï¼’åˆæœŸå€¤
lcd_locate( 3, 0);
g_u8LcdStr[4] = '2';
for ( i = 0; i < 14; i++)
{
lcd_putc(g_u8LcdStr[i]);
}
// 16bitタイマè¨å®š
// CTC動作ã€1/8分周 周期ã¯ï¼’5ï¼ï½ï½“
OCR1A = 31686; // 31249 è¨å®šå€¤
TCCR1A = (1 << COM1A0);
TCCR1B = 0x0a; // スタート
TIMSK1 = 1 << OCIE1A; // ctc割り込ã¿è¨±å¯
// ADC
ADMUX = 0; // Vref = 外部レファレンス
ADCSRA = (1 << ADPS1) | (1 << ADPS0); // adcクãƒãƒƒã‚¯ = 125kHz
DIDR0 = (1 << ADC0D); // adc0デジタル入力ãƒãƒƒãƒ•ã‚¡ç¦æ¢
//UART è¨å®š
// baurate 9600
// data 8
// parity non
// stop bit 1
UCSR0A = 1 << U2X0;
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
UBRR0L = 12;
UCSR0B = (1 << RXCIE0) | (1 << RXEN0);
// スリープモードã¯ã‚¢ã‚¤ãƒ‰ãƒ«ã«è¨å®š
set_sleep_mode(SLEEP_MODE_IDLE);
}
void InitTime(void)
{
g_u8CalenderBuf[0] = 0x12;
g_u8CalenderBuf[1] = 6;
g_u8CalenderBuf[2] = 1;
g_u8CalenderBuf[3] = 0;
g_u8CalenderBuf[4] = 0;
g_u8CalenderBuf[5] = 0;
lcd_locate( 0, 0); // 1行目:年月日表示
lcd_putc((g_u8CalenderBuf[0] >> 4) + 0x30); // å¹´
lcd_putc((g_u8CalenderBuf[0] & 0x0f) + 0x30);
lcd_putc('/');
lcd_putc((g_u8CalenderBuf[1] >> 4) + 0x30); // 月
lcd_putc((g_u8CalenderBuf[1] & 0x0f) + 0x30);
lcd_putc('/');
lcd_putc((g_u8CalenderBuf[2] >> 4) + 0x30); // 分
lcd_putc((g_u8CalenderBuf[2] & 0x0f) + 0x30);
lcd_locate( 1, 0); // 2行目:時分秒表示
lcd_putc((g_u8CalenderBuf[3] >> 4) + 0x30); // 時
lcd_putc((g_u8CalenderBuf[3] & 0x0f) + 0x30);
lcd_putc(':');
lcd_putc((g_u8CalenderBuf[4] >> 4) + 0x30); // 分
lcd_putc((g_u8CalenderBuf[4] & 0x0f) + 0x30);
lcd_putc(':');
lcd_putc((g_u8CalenderBuf[5] >> 4) + 0x30); // ç§’
lcd_putc((g_u8CalenderBuf[5] & 0x0f) + 0x30);
}
void DoADC(void) // ADCを動作ã•ã›è¡¨ç¤ºã•ã›ã‚‹ã€‚1秒毎
{
uint16_t result;
LM61_ON; // 温度センサ電æºON
ADC_ON; // ADCイãƒãƒ¼ãƒ–ル
DELAY_US(6000); // wait 60ms レファレンス電圧ã€LM61ã€ADC安定待ã¡
ADC_START; // ADC動作開始
result = ReadADCCel(); // ADCã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’èªã¿å‡ºã™ã€‚デジタルフィルタ付
ADC_OFF; // ADCç¦æ¢
LM61_OFF; // 温度センサ電æºOFF
AdcDisp(result); // LCDã«ãƒ‡ãƒ¼ã‚¿ã‚’表示
}
uint16_t ReadADCCel(void) // 指定ã•れãŸãƒãƒ£ãƒ³ãƒãƒ«ã®ADCã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’èªã¿å‡ºã™ã€‚
{
static uint16_t adc_data1, adc_data2, adc_data3;
while((ADCSRA & (1 << ADSC)));
adc_data3 = adc_data2;
adc_data2 = adc_data1;
adc_data1 = ADCW;
return ((adc_data3 + adc_data2 + adc_data2 + adc_data1) / 4);
}
void AdcDisp( uint16_t result) // ADC値を変æ›ã—表示
{
int16_t i;
long sum;
sum = ((long)result * V_REF/ 1024) - 600;
// sumã®æ£å¸¸ç¯„囲ãƒã‚§ãƒƒã‚¯
g_u8LcdStr[4] = '1';
if ( (sum > 1800) || ( sum < -400))
{
for ( i = 6; i < 10; i++)
{
g_u8LcdStr[i] = '-';
}
g_u8LcdStr[11] = '-';
}
else
{
if ( sum < 0)
{
sum *= -1;
g_u8LcdStr[6] = '-';
}
else
{
g_u8LcdStr[6] = 0x20;
}
g_u8LcdStr[7] = 0x20;
g_u8LcdStr[8] = 0x20;
g_u8LcdStr[9] = 0x30;
g_u8LcdStr[11] = 0x30;
// binary -> BCDã‚ャラクタ変æ›
for ( i = 11; i > 5; i--)
{
g_u8LcdStr[i] = (sum % 10) + 0x30;
sum /= 10;
if ( i == 11)
{
i--;
}
if ( sum <= 0)
{
break;
}
}
}
// LCDã«è¡¨ç¤º
lcd_locate( 2, 0);
for ( i = 0; i < 14; i++)
{
lcd_putc(g_u8LcdStr[i]);
}
}
void XBeeTempDisp(void) // XBeeã®æ¸©åº¦ãƒ‡ãƒ¼ã‚¿ã‚’変æ›ã—ã¦è¡¨ç¤ºã™ã‚‹ã€‚
{
uint8_t cnt;
int16_t i;
long sum;
g_u8LcdStr[4] = '2';
sum =(g_u8RxBuff[22] << 8) | g_u8RxBuff[23];
sum = (sum * XBEE_REF/ 1024) - 600;
if ( (sum > 1800) || ( sum < -400))
{
for ( i = 6; i < 10; i++)
{
g_u8LcdStr[i] = '-';
}
g_u8LcdStr[11] = '-';
}
else
{
if ( sum < 0)
{
sum *= -1;
g_u8LcdStr[6] = '-';
}
else
{
g_u8LcdStr[6] = 0x20;
}
g_u8LcdStr[7] = 0x20;
g_u8LcdStr[8] = 0x20;
g_u8LcdStr[9] = 0x30;
g_u8LcdStr[11] = 0x30;
// binary -> BCDã‚ャラクタ変æ›
for ( i = 11; i > 5; i--)
{
g_u8LcdStr[i] = (sum % 10) + 0x30;
sum /= 10;
if ( i == 11)
{
i--;
}
if ( sum <= 0)
{
break;
}
}
}
// LCDã«è¡¨ç¤º
lcd_locate( 3, 0);
for ( i = 0; i < 14; i++)
{
lcd_putc(g_u8LcdStr[i]);
}
}
void BlinkDisp(uint8_t dat, uint8_t flg) //指定ä½ç½®ã‹ã‚‰ï¼’æ–‡å—分ブリンクã™ã‚‹ã€‚
{
uint8_t raw, col;
switch( dat)
{
case 0: // å¹´
lcd_locate(0, 0);
break;
case 1: // 月
lcd_locate(0, 3);
raw = 0;
col = 0;
break;
case 2: // æ—¥
lcd_locate(0, 6);
raw = 0;
col = 3;
break;
case 3: // 時
lcd_locate(1, 0);
raw = 0;
col = 6;
break;
case 4: // 分
lcd_locate(1, 3);
raw = 1;
col = 0;
break;
case 5: // ç§’
lcd_locate(1, 6);
raw = 1;
col = 3;
break;
default: // 時計修æ£ãƒ¢ãƒ¼ãƒ‰çµ‚了
g_uSwitchState.BYTE = 0;
lcd_locate(1, 6);
lcd_putc((g_u8CalenderBuf[5] >> 4) + 0x30);
lcd_putc((g_u8CalenderBuf[5] & 0x0f) + 0x30);
return;
break;
}
if ( g_u8BlinkFlg == 0)
{
// 消ç¯
g_u8BlinkFlg = 1;
lcd_putc(' ');
lcd_putc(' ');
}
else
{
// 点ç¯
g_u8BlinkFlg = 0;
lcd_putc((g_u8CalenderBuf[dat] >> 4) + 0x30);
lcd_putc((g_u8CalenderBuf[dat] & 0x0f) + 0x30);
}
if (flg == 1)
{
lcd_locate(raw, col);
lcd_putc((g_u8CalenderBuf[dat - 1] >> 4) + 0x30);
lcd_putc((g_u8CalenderBuf[dat - 1] & 0x0f) + 0x30);
}
}
void CalcDate(uint8_t dat, uint8_t flg)
{
int sum, day;
switch ( dat)
{
case 0: // å¹´
sum = (g_u8CalenderBuf[dat] >> 4) * 10 + (g_u8CalenderBuf[dat] & 0x0f);
switch(flg)
{
case 0: // åŠ ç®—
if ( ++sum > 99)
{
sum = 0;
}
break;
default: // 減算
if ( --sum < 0 )
{
sum = 99;
}
break;
}
g_u8CalenderBuf[dat] =((sum / 10) << 4) | (sum % 10);
break;
case 1: // 月
sum = (g_u8CalenderBuf[dat] >> 4) * 10 + (g_u8CalenderBuf[dat] & 0x0f);
switch(flg)
{
case 0: // åŠ ç®—
if ( ++sum > 12)
{
sum = 1;
}
break;
default: // 減算
if ( --sum < 1 )
{
sum = 12;
}
break;
}
g_u8CalenderBuf[dat] =((sum / 10) << 4) | (sum % 10);
break;
case 2: // æ—¥
sum = (g_u8CalenderBuf[1] >> 4) * 10 + (g_u8CalenderBuf[1] & 0x0f); // 月を抽出
if ((((g_u8CalenderBuf[0] >> 4) * 10 + (g_u8CalenderBuf[0] & 0x0f)) % 4) == 0) // ã†ã‚‹ã†å¹´ãªã‚‰
{
day = g_u8CalenderArray[1][sum - 1];
}
else
{
day = g_u8CalenderArray[0][sum -1];
}
sum = (g_u8CalenderBuf[dat] >> 4) * 10 + (g_u8CalenderBuf[dat] & 0x0f);
switch(flg)
{
case 0: // åŠ ç®—
if ( ++sum > day)
{
sum = 1;
}
break;
default: // 減算
if ( --sum < 1 )
{
sum = day;
}
break;
}
g_u8CalenderBuf[dat] =((sum / 10) << 4) | (sum % 10);
break;
case 3: // 時
sum = (g_u8CalenderBuf[dat] >> 4) * 10 + (g_u8CalenderBuf[dat] & 0x0f);
switch(flg)
{
case 0: // åŠ ç®—
if ( ++sum > 23)
{
sum = 1;
}
break;
default: // 減算
if ( --sum < 1 )
{
sum = 23;
}
break;
}
g_u8CalenderBuf[dat] =((sum / 10) << 4) | (sum % 10);
break;
default: // 分ã€ç§’
sum = (g_u8CalenderBuf[dat] >> 4) * 10 + (g_u8CalenderBuf[dat] & 0x0f);
switch(flg)
{
case 0: // åŠ ç®—
if ( ++sum >59)
{
sum = 0;
}
break;
default: // 減算
if ( --sum < 1 )
{
sum = 59;
}
break;
}
g_u8CalenderBuf[dat] =((sum / 10) << 4) | (sum % 10);
break;
}
}
void UpdateTime(void) // 時計
{
uint8_t sum, day, flg = 0;
// ç§’
sum = (g_u8CalenderBuf[5] >> 4) * 10 + (g_u8CalenderBuf[5] & 0x0f);
if ( ++sum > 59)
{
g_u8CalenderBuf[5] = 0;
flg = 1;
DateDisp(1, 6, g_u8CalenderBuf[5]);
}
else
{
g_u8CalenderBuf[5] =((sum / 10) << 4) | (sum % 10);
DateDisp(1, 6, g_u8CalenderBuf[5]);
return;
}
// 分
if ( flg == 1)
{
flg = 0;
sum = (g_u8CalenderBuf[4] >> 4) * 10 + (g_u8CalenderBuf[4] & 0x0f);
if( ++sum > 59)
{
g_u8CalenderBuf[4] = 0;
flg = 1;
DateDisp(1, 3, g_u8CalenderBuf[4]);
}
else
{
g_u8CalenderBuf[4] =((sum / 10) << 4) | (sum % 10);
DateDisp(1, 3, g_u8CalenderBuf[4]);
}
}
// 時
if ( flg == 1)
{
flg = 0;
sum = (g_u8CalenderBuf[3] >> 4) * 10 + (g_u8CalenderBuf[3] & 0x0f);
if( ++sum > 23)
{
g_u8CalenderBuf[3] = 0;
flg = 1;
DateDisp(1, 0, g_u8CalenderBuf[3]);
}
else
{
g_u8CalenderBuf[3] =((sum / 10) << 4) | (sum % 10);
DateDisp(1, 0, g_u8CalenderBuf[3]);
}
}
// æ—¥
if ( flg == 1)
{
flg = 0;
sum = (g_u8CalenderBuf[1] >> 4) * 10 + (g_u8CalenderBuf[1] & 0x0f); // 月を抽出
if ((((g_u8CalenderBuf[0] >> 4) * 10 + (g_u8CalenderBuf[0] & 0x0f)) % 4) == 0) // ã†ã‚‹ã†å¹´ãªã‚‰
{
day = g_u8CalenderArray[1][sum - 1];
}
else
{
day = g_u8CalenderArray[0][sum -1];
}
sum = (g_u8CalenderBuf[2] >> 4) * 10 + (g_u8CalenderBuf[2] & 0x0f);
if( ++sum > day)
{
g_u8CalenderBuf[2] = 1;
DateDisp(0, 6, g_u8CalenderBuf[2]);
flg = 1;
}
else
{
g_u8CalenderBuf[2] =((sum / 10) << 4) | (sum % 10);
DateDisp(0, 6, g_u8CalenderBuf[2]);
}
}
// 月
if ( flg == 1)
{
flg = 0;
sum = (g_u8CalenderBuf[1] >> 4) * 10 + (g_u8CalenderBuf[1] & 0x0f);
if( ++sum > 12)
{
g_u8CalenderBuf[1] = 1;
DateDisp(0, 3, g_u8CalenderBuf[1]);
flg = 1;
}
else
{
g_u8CalenderBuf[1] =((sum / 10) << 4) | (sum % 10);
DateDisp(0, 3, g_u8CalenderBuf[1]);
}
}
// å¹´
if ( flg == 1)
{
flg = 0;
sum = (g_u8CalenderBuf[0] >> 4) * 10 + (g_u8CalenderBuf[0] & 0x0f);
if( ++sum > 99)
{
g_u8CalenderBuf[0] = 0;
DateDisp(0, 0, g_u8CalenderBuf[0]);
flg = 1;
}
else
{
g_u8CalenderBuf[0] =((sum / 10) << 4) | (sum % 10);
DateDisp(0, 0, g_u8CalenderBuf[0]);
}
}
}
void DateDisp(uint8_t raw, uint8_t col, uint8_t dat) // æŒ‡å®šå ´æ‰€ã®æ–‡å—ã‚’æ›´æ–°ã™ã‚‹ã€‚
{
lcd_locate(raw, col);
lcd_putc((dat >> 4) + 0x30);
lcd_putc((dat & 0x0f) + 0x30);
}
SIGNAL(TIMER1_COMPA_vect) // 0.25ç§’ã”ã¨ã«å‰²è¾¼ç™ºç”Ÿ
{
g_uIntFlg.BIT.time = 1;
}
SIGNAL(USART_RX_vect) // å—信割込ã€ãƒ‡ãƒ¼ã‚¿å—信完了ã¯ãƒ¡ã‚¤ãƒ³ãƒ«ãƒ¼ãƒ—ã§g_u8Count= 24ã§åˆ¤æ–ã™ã‚‹ã€‚
{
if ( UDR0 == 0x7e) // 0x7eã§å—ä¿¡é–‹å§‹
{
g_uIntFlg.BIT.rx7E = 1;
g_u8Count = 0;
}
if ( g_uIntFlg.BIT.rx7E == 1) // UDR0ã‹ã‚‰å—ä¿¡ãƒãƒƒãƒ•ã‚¡ã«ã‚³ãƒ”ー
{
g_u8RxBuff[g_u8Count++] = UDR0;
}
}