lbed/08-ARM学習基板で実験
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[lbed]]
#contents
2013/08/11からのアクセス回数 &counter;
** LPC1343学習基板に戻って [#dfe6450c]
cortex-m3の勉強のために買った「ARMマイコンパーフェクト学...
なるかを試してみます。
実験に使用するのは、以下の3つです。
- ARMマイコンパーフェクト学習基板
- LPC-LINK
- Star Orangeボードと3.3Vで動作するLCD
** 汎用入出力GPIOの使い方編 [#i15ae2a5]
lbedにはまだ汎用入力クラスがありませんので、この機会に作...
詳しくは、[[lbed/08a-ARM学習基板用追加クラス]]を参照して...
*** 実験開始 [#be68aa6f]
ジャンパP4の3と4、31と32にジャンパーをセットし、タッチエ...
タッチセンサーPCF8883の出力オープン・ドレインHigth
((ON時にHightレベルが出力され、OFF時にはハイ・インピーダ...
なので、LPC1343の入力ピンは、プルダウンモードにセットする...
((あるいは、プルダウン抵抗を付ける方法もあります))
&ref(TouchSensor.png);
テストプログラムTestSwitch.cppは、以下の様になります。
タッチセンサーに触れるとLEDが点灯し、離すとLEDが消えれば...
#pre{{
#include <cr_section_macros.h>
#include <NXP/crp.h>
// Variable to store CRP value in. Will be placed automat...
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP extern const unsigned int CRP_WORD = CRP_NO_CRP ;
#include "lbed.h"
int main(void) {
wait_init();
DigitalOut myled(LED2);
DigitalIn sw(P2_4);
sw.mode(PullDown);
while(1) {
myled = sw;
}
}
}}
** USB仮想シリアルポートを使う [#p96d779c]
LPC1343では、USBをサポートしており、例題にもCDC(USB仮想...
を使っています。
そこで、SerialクラスのサブクラスとしてSerialCDCを作ってUS...
しました。
((詳しくは、[[lbed/08a-ARM学習基板用追加クラス]]を参照し...
*** USBの実験にはトランジスタが必要 [#f870441a]
当初、ARM学習基板のトランジスタを付けないでUSB CDCのテス...
上手く動作しませんでした。本を調べて見るとUSB D+ラインの...
トランジスタ2SA1015が必要だと分かり、急遽取り付けました。
&ref(Add_TRG.png);
*** テスト用のソース [#od04912d]
テスト用のプログラムとしてTestCDC.cppを以下の様に作成しま...
USB CDCが認識されるまで、少し時間がかかるため、最初にキー...
を待つことにしました。
((コンパイルには、ForSerialCDC_usbhw.cをTestCDC.cppと同じ...
#pre{{
#include <cr_section_macros.h>
#include <NXP/crp.h>
// Variable to store CRP value in. Will be placed automat...
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP extern const unsigned int CRP_WORD = CRP_NO_CRP ;
#include "lbed.h"
int main(void) {
wait_init();
DigitalOut myled( LED2);
SerialCDC pc(USBTX, USBRX);
pc.baud(9600);
// キー入力を待つ
pc.read();
pc.println("Hello");
while (1) {
char c = pc.read();
pc.write(c + 1);
myled = !myled;
}
return 0;
}
}}
Arduinoのシリアルモニターに出力した様子を以下に示します。
&ref(CDC_Screen.png);
** アナログ入力を試す [#z0651bc6]
アナログ入力クラスAnalogInも追加しました。
((詳しくは、[[lbed/08a-ARM学習基板用追加クラス]]を参照し...
*** ジャンパ線の設定 [#c44d4f43]
ARM学習基板は、いろんなチップのてんこ盛りなので、実験をす...
接続しなくてはなりません。
((その分、各チップを別の実験に使うことができるようにCPUと...
本の8章、図1からピンの設定の図を引用します。
&ref(Fig8_1.png);
P3には、U2から取った基準電圧1.25Vと電圧測定用のOPアンプU3...
- P3の3は、AD6(PIO1_10)
- P3の4は、AD7(PIO1_11)
- P3の5は、AD3(PIO1_2)
に接続されています。
次に、P3とLPC1343の接続について、本の8章、図2を引用しま...
OPアンプは、非反転増幅回路となっており、ゲインGは、
\( G_{NI} = \frac{R_1 + R_2}{R_1}\)
となることから、P3のCh6, Ch7に入力された電圧は、AGNDとの...
11倍に増幅された値にAGNDを加算された値がADコンバータの入...
となります。
((トラ技2013/8号のエレキ数式も便利です))
&ref(Fig8_2.png);
*** アナログ回路の動作確認 [#w55a20d9]
P3の3番ピンCh6に安定電源1.8Vを半固定抵抗で1.308Vに減圧し...
$$
V = (1.308 - 1.25)*11 + 1.25 = 1.888
$$
が、Ch6の予想結果です。
&ref(ADC_Test.png);
テストプログラムTestADC.cppは、Printクラスの#if文を有効に...
#pre{{
#include <cr_section_macros.h>
#include <NXP/crp.h>
// Variable to store CRP value in. Will be placed automat...
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP extern const unsigned int CRP_WORD = CRP_NO_CRP ;
#include "lbed.h"
int main(void) {
wait_init();
DigitalOut myled(LED2);
SerialCDC pc(USBTX, USBRX);
pc.baud(9600);
// キー入力を待つ
pc.read();
AnalogIn agnd(P1_2);
AnalogIn dc(P1_10);
while(1) {
int d0 = agnd.read_u16();
int v0 = 1250*1024/d0;
int d1 = dc.read_u16();
int v1 = v0*d1/1024;
pc.printf("Ch3:%04d[VDD=%04dmV] Ch6:%04d[%04dmV...
myled = ! myled;
wait_ms(1000);
}
}
}}
出力結果は、以下の様になっています。1.896mVと予想と近い結...
&ref(ADC_Screen.png);
** 温度センサーIC LM75Bを使ってみる [#teb5224a]
ARM学習基板には、I2Cのテストをするために温度センサーLM75B...
これを使って、温度を取得してみます。
LM75Bのアドレスは、A2, A1, A0の接続によってユーザが変える...
(( '1001 + A2, A1, A0がアドレスになります。))
本の11章の図4は、大きなミスプリがあります。
&ref(Fig11_4.png);&ref(Fig0_2.png);
右がプロローグの図2から引用したものです。この図からLM75B...
*** LM75Bクラス [#a6a6324b]
次にLM75BのクラスをLBED_LPC13xx_USERLIB/src/LM75B.cppに実...
本当に驚くくらい簡単でしょう!
#pre{{
#include "lbed.h"
#include "LM75B.h"
LM75B::LM75B(PinName sda, PinName scl) : i2c(sda, scl)
{
char cmd[2];
// LM73設定
cmd[0] = 0x00; // register 0
cmd[1] = 0x28; // 温度レジスタを選択
i2c.write( LM75_ADDR, cmd, 2);
}
LM75B::~LM75B()
{
}
float LM75B::read()
{
char cmd[2];
i2c.read( LM75_ADDR, cmd, 2); // Send command string
unsigned int int_val = cmd[0] <<3 | cmd[1]>>5;
return float(int_val*125/1000.0);
}
}}
*** LCDとの接続 [#tc6cf18e]
アナログ入力の例では、USB CDCを使ったので、今回はLCDを使...
ARM学習基板のP4とStar OrangeボードのPinとLPC1343ボードピ...
| P4 | StarOrange | PC1343 | 機能 |h
| 1 | p1 | p1 | GND |
| 39 | p40 | p40 | 3.3V |
| 33 | p24 | p26 | rs |
| 31 | p26 | p22 | e |
| 23 | p27 | p14 | d4 |
| 21 | p28 | p6 | d5 |
| 19 | p29 | p5 | d6 |
| 17 | p30 | p25 | d7 |
&ref(LM75B.png);
*** テストプログラムと結果 [#xd0dbefc]
テストプログラムTestLM75B.cppは、以下の様になります。
#pre{{
#include<cr_section_macros.h>
#include<NXP/crp.h>
__CRP extern const unsigned int CRP_WORD = CRP_NO_CRP;
#include"lbed.h"
#include "TextLCD.h"
#include "LM75B.h"
int main(void) {
wait_init();
DigitalOut myled(LED2);
TextLCD lcd(p26, p22, p14, p6, p5, p25); // rs, e...
LM75B lm75b(p28, p27);
lcd.print("Hello World");
while (1) {
float t = lm75b.read();
lcd.locate(0, 1);
lcd.print("Temp:");
lcd.print(t);
myled = !myled;
wait_ms(1000);
}
return 0;
}
}}
時計に付いてきた温度計を結果を比べてみました。時計が27.0...
&ref(Temp.png);
** リアルタイムクロック(SPI接続)を使う [#i3b021db]
リアルタイムクロックのテストには苦労しました。
((ssp.cのSSP_IOConfigでPIO2_11を使うように#if文を変更しな...
ジャンパ線の設定は以下の様になります。
&ref(RTC_setting.png);
*** リアルタイムクロックのクラス [#nb881412]
リアルタイムクロックPCF2123のクラスは、
[[Linux Kernel Doxygen>http://kerneldox.com/kdox-linux-2....
を参考にしました。
#pre{{
#include "lbed.h"
#include "PCF2123.h"
PCF2123::PCF2123(PinName mosi, PinName miso, PinName sclk...
: _spi(mosi, miso, sclk)
, _sel(sel)
{
_sel = 0;
_spi.frequency(SPI_FREQUENCY);
wait_ms( 1 );
}
PCF2123::~PCF2123()
{
}
unsigned char PCF2123::read(unsigned char reg)
{
int val = _spi.write(reg);
return val;
}
void PCF2123::command(unsigned char reg, unsigned char dat)
{
_sel = 1;
_spi.write(reg);
_spi.write(dat);
_sel = 0;
}
void PCF2123::read_rtc()
{
_sel = 1;
read((READ_BIT|SUBADDR|REG_SC));
S = read(READ_NEXT);
M = read(READ_NEXT);
H = read(READ_NEXT);
D = read(READ_NEXT);
W = read(READ_NEXT);
N = read(READ_NEXT);
Y = read(READ_NEXT);
_sel = 0;
}
void PCF2123::reset() {
// initialize RTC
command((WRITE_BIT|SUBADDR|REG_CTRL1),RESET); //...
wait_us(1);
command((WRITE_BIT|SUBADDR|REG_CTRL1), 0x20); //...
wait_us(1);
_sel = 1;
int ret = read((READ_BIT|SUBADDR|REG_CTRL1));
_sel = 0;
command((WRITE_BIT|SUBADDR|REG_CTRL1), 0x00); //...
wait_us(1);
}
void PCF2123::set_time(
unsigned char s,
unsigned char m,
unsigned char h,
unsigned char d,
unsigned char w,
unsigned char n,
unsigned char y)
{
reset();
command((WRITE_BIT|SUBADDR|REG_CTRL1), 0x20); //...
wait_us(1);
_sel = 1;
read((WRITE_BIT|SUBADDR|REG_SC));
read(s);
read(m);
read(h);
read(d);
read(w);
read(n);
read(y);
_sel = 0;
wait_us(1);
command((WRITE_BIT|SUBADDR|REG_CTRL1), 0x00); //...
wait_us(1);
}
void PCF2123::set_alarm(
unsigned char h,
unsigned char m
)
{
command((WRITE_BIT|SUBADDR|REG_CTRL2), 0x02); //...
wait_us(1);
command((WRITE_BIT|SUBADDR|ALARM_DAY), 0x80); //...
wait_us(1);
command((WRITE_BIT|SUBADDR|ALARM_HOUR), h);
wait_us(1);
command((WRITE_BIT|SUBADDR|ALARM_MINITE), m);
wait_us(1);
command((WRITE_BIT|SUBADDR|ALARM_WEEK), 0x80); /...
wait_us(1);
}
}}
*** 動作確認 [#v0b267bc]
シリアルCDCでリアルタイムクロックの値を表示するテストプロ...
#pre{{
#include<cr_section_macros.h>
#include<NXP/crp.h>
__CRP extern const unsigned int CRP_WORD = CRP_NO_CRP;
#include"lbed.h"
#include "PCF2123.h"
int main(void) {
wait_init();
DigitalOut myled(LED2);
SerialCDC pc(USBTX, USBRX);
pc.baud(9600);
// キー入力を待つ
pc.read();
pc.println("Real Time Clock Test.");
PCF2123 rtc(MOSI, MISO, SCKL, P0_2);
rtc.set_time(0x45, 0x59, 0x23, 0x31, 0x06, 0x12, 0x1...
int pS = 0xff;
while (1) {
rtc.read_rtc();
if (pS != rtc.S) {
pc.printf("%d%d/%d%d/%d%d[%d] ", (rtc.Y>>4...
pc.printf("%d%d:%d%d:%d%d\r\n",(rtc.H>>4)&...
myled = !myled;
pS = rtc.S;
}
wait_ms(100);
}
return 0;
}}}
出力結果は、以下の様になります。
&ref(RTC_screen.png);
** ディープ・パワー・ダウンモードを試す
ARM学習基板の本では、いきなりタイマー割り込みで再起動する...
以下のように、p4の1番ピン(GND)、7番ピン(PIO1_4)をタクトス...
&ref(DeepSleepWakeUp.png);
#pre{{
#include <cr_section_macros.h>
#include <NXP/crp.h>
// Variable to store CRP value in. Will be placed automat...
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP extern const unsigned int CRP_WORD = CRP_NO_CRP ;
#include "lbed.h"
void DeepPowerDown(void) {
int d;
LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG;
LPC_SYSCON->PDSLEEPCFG=0xFFFFFFFF; //アナログブ...
SCB->SCR |= 0x04; // システム...
LPC_PMU->PCON |= 0x2; // DEEP Pow...
d = LPC_PMU->PCON;
__WFI(); // 割り込...
}
int main(void) {
wait_init();
DigitalOut myled(LED2);
myled = 1;
int wakeupCounter = 30;
while(1) {
if (--wakeupCounter == 0) {
myled = 0;
DeepPowerDown();
}
wait_ms(1000);
}
}
}}
*** リアルタイムクロックの時刻を受け取る [#e482af9e]
次に、復帰したときにリアルタイムクロックから時刻を取得し...
意外にもコンデンサーに貯めた電気でリアルタイムクロックが...
((225.7日))
動作することが分かりました。
$$
\frac{C (V_0 - V_1)}{I} = 1.5 \times ( 3.3 - 2.0)/100 \ti...
$$
&ref(RTCwithC.png);
起動して、CDCに時刻を10回表示してまた、スリープモードに入...
((main関数のみ表示))
毎回起動後にCDCのターミナルを起動して、1文字入力してなら...
((すぐに起動するようにするとLPC1343が書き込み途中にスリー...
#pre{{
int main(void) {
int wakeupCounter = 10;
wait_init();
DigitalOut myled(LED2);
SerialCDC pc(USBTX, USBRX);
pc.baud(9600);
// キー入力を待つ
pc.read();
PCF2123 rtc(MOSI, MISO, SCKL, P0_2);
// 1回目に時刻をセットした後は、コメントにするとRTCが...
// rtc.set_time(0x45, 0x59, 0x23, 0x31, 0x06, 0x12, 0...
int pS = 0xff;
pc.println("After 10 seconds, I will be into deep sl...
myled = 1;
while(1) {
rtc.read_rtc();
if (pS != rtc.S) {
pc.printf("wake up count = %d\n", wakeupC...
pc.printf("20%02x/%02x/%02x[%d] ", rtc.Y,...
pc.printf("%02x/%02x/%02x\n", rtc.H,...
pS = rtc.S;
}
if (wakeupCounter == 0) {
myled = 0;
DeepPowerDown();
}
wait_ms(100);
}
}
}}
*** アラームをセット [#oe356fde]
最後に、アラームをセットして、再起動をする例題を示して、...
#pre{{
int main(void) {
int wakeupCounter = 10;
wait_init();
DigitalOut myled(LED2);
SerialCDC pc(USBTX, USBRX);
pc.baud(9600);
// キー入力を待つ
pc.read();
PCF2123 rtc(MOSI, MISO, SCKL, P0_2);
// 1回目に時刻をセットした後は、コメントにするとRTCが...
rtc.set_time(0x40, 0x42, 0x10, 0x01, 0x00, 0x09, 0x13);
// 分単位の割り込みを発生するようにセット
rtc.command((PCF2123::WRITE_BIT|PCF2123::SUBADDR|PCF2...
// アラームのセット(時間、分は、16進で指定する)
// rtc.set_alarm(0x10, 0x33);
int pS = 0xff;
pc.println("After 10 seconds, I will be into deep sl...
myled = 1;
while(1) {
rtc.read_rtc();
if (pS != rtc.S) {
pc.printf("wake up count = %d\n", wakeup...
pc.printf("20%02x/%02x/%02x[%d] ", rtc.Y,...
pc.printf("%02x/%02x/%02x\n", rtc.H,...
pS = rtc.S;
}
if (wakeupCounter == 0) {
myled = 0;
DeepPowerDown();
}
wait_ms(100);
}
}
}}
** 最新のソース [#da70038b]
最新のソースは、Githubの以下のURLからダウンロードできます。
- https://github.com/take-pwave/lbed
** コメント [#r9e6c373]
- I2C.readに大きなバグがありました。LM75Bを修正しました。...
#comment_kcaptcha
終了行:
[[lbed]]
#contents
2013/08/11からのアクセス回数 &counter;
** LPC1343学習基板に戻って [#dfe6450c]
cortex-m3の勉強のために買った「ARMマイコンパーフェクト学...
なるかを試してみます。
実験に使用するのは、以下の3つです。
- ARMマイコンパーフェクト学習基板
- LPC-LINK
- Star Orangeボードと3.3Vで動作するLCD
** 汎用入出力GPIOの使い方編 [#i15ae2a5]
lbedにはまだ汎用入力クラスがありませんので、この機会に作...
詳しくは、[[lbed/08a-ARM学習基板用追加クラス]]を参照して...
*** 実験開始 [#be68aa6f]
ジャンパP4の3と4、31と32にジャンパーをセットし、タッチエ...
タッチセンサーPCF8883の出力オープン・ドレインHigth
((ON時にHightレベルが出力され、OFF時にはハイ・インピーダ...
なので、LPC1343の入力ピンは、プルダウンモードにセットする...
((あるいは、プルダウン抵抗を付ける方法もあります))
&ref(TouchSensor.png);
テストプログラムTestSwitch.cppは、以下の様になります。
タッチセンサーに触れるとLEDが点灯し、離すとLEDが消えれば...
#pre{{
#include <cr_section_macros.h>
#include <NXP/crp.h>
// Variable to store CRP value in. Will be placed automat...
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP extern const unsigned int CRP_WORD = CRP_NO_CRP ;
#include "lbed.h"
int main(void) {
wait_init();
DigitalOut myled(LED2);
DigitalIn sw(P2_4);
sw.mode(PullDown);
while(1) {
myled = sw;
}
}
}}
** USB仮想シリアルポートを使う [#p96d779c]
LPC1343では、USBをサポートしており、例題にもCDC(USB仮想...
を使っています。
そこで、SerialクラスのサブクラスとしてSerialCDCを作ってUS...
しました。
((詳しくは、[[lbed/08a-ARM学習基板用追加クラス]]を参照し...
*** USBの実験にはトランジスタが必要 [#f870441a]
当初、ARM学習基板のトランジスタを付けないでUSB CDCのテス...
上手く動作しませんでした。本を調べて見るとUSB D+ラインの...
トランジスタ2SA1015が必要だと分かり、急遽取り付けました。
&ref(Add_TRG.png);
*** テスト用のソース [#od04912d]
テスト用のプログラムとしてTestCDC.cppを以下の様に作成しま...
USB CDCが認識されるまで、少し時間がかかるため、最初にキー...
を待つことにしました。
((コンパイルには、ForSerialCDC_usbhw.cをTestCDC.cppと同じ...
#pre{{
#include <cr_section_macros.h>
#include <NXP/crp.h>
// Variable to store CRP value in. Will be placed automat...
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP extern const unsigned int CRP_WORD = CRP_NO_CRP ;
#include "lbed.h"
int main(void) {
wait_init();
DigitalOut myled( LED2);
SerialCDC pc(USBTX, USBRX);
pc.baud(9600);
// キー入力を待つ
pc.read();
pc.println("Hello");
while (1) {
char c = pc.read();
pc.write(c + 1);
myled = !myled;
}
return 0;
}
}}
Arduinoのシリアルモニターに出力した様子を以下に示します。
&ref(CDC_Screen.png);
** アナログ入力を試す [#z0651bc6]
アナログ入力クラスAnalogInも追加しました。
((詳しくは、[[lbed/08a-ARM学習基板用追加クラス]]を参照し...
*** ジャンパ線の設定 [#c44d4f43]
ARM学習基板は、いろんなチップのてんこ盛りなので、実験をす...
接続しなくてはなりません。
((その分、各チップを別の実験に使うことができるようにCPUと...
本の8章、図1からピンの設定の図を引用します。
&ref(Fig8_1.png);
P3には、U2から取った基準電圧1.25Vと電圧測定用のOPアンプU3...
- P3の3は、AD6(PIO1_10)
- P3の4は、AD7(PIO1_11)
- P3の5は、AD3(PIO1_2)
に接続されています。
次に、P3とLPC1343の接続について、本の8章、図2を引用しま...
OPアンプは、非反転増幅回路となっており、ゲインGは、
\( G_{NI} = \frac{R_1 + R_2}{R_1}\)
となることから、P3のCh6, Ch7に入力された電圧は、AGNDとの...
11倍に増幅された値にAGNDを加算された値がADコンバータの入...
となります。
((トラ技2013/8号のエレキ数式も便利です))
&ref(Fig8_2.png);
*** アナログ回路の動作確認 [#w55a20d9]
P3の3番ピンCh6に安定電源1.8Vを半固定抵抗で1.308Vに減圧し...
$$
V = (1.308 - 1.25)*11 + 1.25 = 1.888
$$
が、Ch6の予想結果です。
&ref(ADC_Test.png);
テストプログラムTestADC.cppは、Printクラスの#if文を有効に...
#pre{{
#include <cr_section_macros.h>
#include <NXP/crp.h>
// Variable to store CRP value in. Will be placed automat...
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP extern const unsigned int CRP_WORD = CRP_NO_CRP ;
#include "lbed.h"
int main(void) {
wait_init();
DigitalOut myled(LED2);
SerialCDC pc(USBTX, USBRX);
pc.baud(9600);
// キー入力を待つ
pc.read();
AnalogIn agnd(P1_2);
AnalogIn dc(P1_10);
while(1) {
int d0 = agnd.read_u16();
int v0 = 1250*1024/d0;
int d1 = dc.read_u16();
int v1 = v0*d1/1024;
pc.printf("Ch3:%04d[VDD=%04dmV] Ch6:%04d[%04dmV...
myled = ! myled;
wait_ms(1000);
}
}
}}
出力結果は、以下の様になっています。1.896mVと予想と近い結...
&ref(ADC_Screen.png);
** 温度センサーIC LM75Bを使ってみる [#teb5224a]
ARM学習基板には、I2Cのテストをするために温度センサーLM75B...
これを使って、温度を取得してみます。
LM75Bのアドレスは、A2, A1, A0の接続によってユーザが変える...
(( '1001 + A2, A1, A0がアドレスになります。))
本の11章の図4は、大きなミスプリがあります。
&ref(Fig11_4.png);&ref(Fig0_2.png);
右がプロローグの図2から引用したものです。この図からLM75B...
*** LM75Bクラス [#a6a6324b]
次にLM75BのクラスをLBED_LPC13xx_USERLIB/src/LM75B.cppに実...
本当に驚くくらい簡単でしょう!
#pre{{
#include "lbed.h"
#include "LM75B.h"
LM75B::LM75B(PinName sda, PinName scl) : i2c(sda, scl)
{
char cmd[2];
// LM73設定
cmd[0] = 0x00; // register 0
cmd[1] = 0x28; // 温度レジスタを選択
i2c.write( LM75_ADDR, cmd, 2);
}
LM75B::~LM75B()
{
}
float LM75B::read()
{
char cmd[2];
i2c.read( LM75_ADDR, cmd, 2); // Send command string
unsigned int int_val = cmd[0] <<3 | cmd[1]>>5;
return float(int_val*125/1000.0);
}
}}
*** LCDとの接続 [#tc6cf18e]
アナログ入力の例では、USB CDCを使ったので、今回はLCDを使...
ARM学習基板のP4とStar OrangeボードのPinとLPC1343ボードピ...
| P4 | StarOrange | PC1343 | 機能 |h
| 1 | p1 | p1 | GND |
| 39 | p40 | p40 | 3.3V |
| 33 | p24 | p26 | rs |
| 31 | p26 | p22 | e |
| 23 | p27 | p14 | d4 |
| 21 | p28 | p6 | d5 |
| 19 | p29 | p5 | d6 |
| 17 | p30 | p25 | d7 |
&ref(LM75B.png);
*** テストプログラムと結果 [#xd0dbefc]
テストプログラムTestLM75B.cppは、以下の様になります。
#pre{{
#include<cr_section_macros.h>
#include<NXP/crp.h>
__CRP extern const unsigned int CRP_WORD = CRP_NO_CRP;
#include"lbed.h"
#include "TextLCD.h"
#include "LM75B.h"
int main(void) {
wait_init();
DigitalOut myled(LED2);
TextLCD lcd(p26, p22, p14, p6, p5, p25); // rs, e...
LM75B lm75b(p28, p27);
lcd.print("Hello World");
while (1) {
float t = lm75b.read();
lcd.locate(0, 1);
lcd.print("Temp:");
lcd.print(t);
myled = !myled;
wait_ms(1000);
}
return 0;
}
}}
時計に付いてきた温度計を結果を比べてみました。時計が27.0...
&ref(Temp.png);
** リアルタイムクロック(SPI接続)を使う [#i3b021db]
リアルタイムクロックのテストには苦労しました。
((ssp.cのSSP_IOConfigでPIO2_11を使うように#if文を変更しな...
ジャンパ線の設定は以下の様になります。
&ref(RTC_setting.png);
*** リアルタイムクロックのクラス [#nb881412]
リアルタイムクロックPCF2123のクラスは、
[[Linux Kernel Doxygen>http://kerneldox.com/kdox-linux-2....
を参考にしました。
#pre{{
#include "lbed.h"
#include "PCF2123.h"
PCF2123::PCF2123(PinName mosi, PinName miso, PinName sclk...
: _spi(mosi, miso, sclk)
, _sel(sel)
{
_sel = 0;
_spi.frequency(SPI_FREQUENCY);
wait_ms( 1 );
}
PCF2123::~PCF2123()
{
}
unsigned char PCF2123::read(unsigned char reg)
{
int val = _spi.write(reg);
return val;
}
void PCF2123::command(unsigned char reg, unsigned char dat)
{
_sel = 1;
_spi.write(reg);
_spi.write(dat);
_sel = 0;
}
void PCF2123::read_rtc()
{
_sel = 1;
read((READ_BIT|SUBADDR|REG_SC));
S = read(READ_NEXT);
M = read(READ_NEXT);
H = read(READ_NEXT);
D = read(READ_NEXT);
W = read(READ_NEXT);
N = read(READ_NEXT);
Y = read(READ_NEXT);
_sel = 0;
}
void PCF2123::reset() {
// initialize RTC
command((WRITE_BIT|SUBADDR|REG_CTRL1),RESET); //...
wait_us(1);
command((WRITE_BIT|SUBADDR|REG_CTRL1), 0x20); //...
wait_us(1);
_sel = 1;
int ret = read((READ_BIT|SUBADDR|REG_CTRL1));
_sel = 0;
command((WRITE_BIT|SUBADDR|REG_CTRL1), 0x00); //...
wait_us(1);
}
void PCF2123::set_time(
unsigned char s,
unsigned char m,
unsigned char h,
unsigned char d,
unsigned char w,
unsigned char n,
unsigned char y)
{
reset();
command((WRITE_BIT|SUBADDR|REG_CTRL1), 0x20); //...
wait_us(1);
_sel = 1;
read((WRITE_BIT|SUBADDR|REG_SC));
read(s);
read(m);
read(h);
read(d);
read(w);
read(n);
read(y);
_sel = 0;
wait_us(1);
command((WRITE_BIT|SUBADDR|REG_CTRL1), 0x00); //...
wait_us(1);
}
void PCF2123::set_alarm(
unsigned char h,
unsigned char m
)
{
command((WRITE_BIT|SUBADDR|REG_CTRL2), 0x02); //...
wait_us(1);
command((WRITE_BIT|SUBADDR|ALARM_DAY), 0x80); //...
wait_us(1);
command((WRITE_BIT|SUBADDR|ALARM_HOUR), h);
wait_us(1);
command((WRITE_BIT|SUBADDR|ALARM_MINITE), m);
wait_us(1);
command((WRITE_BIT|SUBADDR|ALARM_WEEK), 0x80); /...
wait_us(1);
}
}}
*** 動作確認 [#v0b267bc]
シリアルCDCでリアルタイムクロックの値を表示するテストプロ...
#pre{{
#include<cr_section_macros.h>
#include<NXP/crp.h>
__CRP extern const unsigned int CRP_WORD = CRP_NO_CRP;
#include"lbed.h"
#include "PCF2123.h"
int main(void) {
wait_init();
DigitalOut myled(LED2);
SerialCDC pc(USBTX, USBRX);
pc.baud(9600);
// キー入力を待つ
pc.read();
pc.println("Real Time Clock Test.");
PCF2123 rtc(MOSI, MISO, SCKL, P0_2);
rtc.set_time(0x45, 0x59, 0x23, 0x31, 0x06, 0x12, 0x1...
int pS = 0xff;
while (1) {
rtc.read_rtc();
if (pS != rtc.S) {
pc.printf("%d%d/%d%d/%d%d[%d] ", (rtc.Y>>4...
pc.printf("%d%d:%d%d:%d%d\r\n",(rtc.H>>4)&...
myled = !myled;
pS = rtc.S;
}
wait_ms(100);
}
return 0;
}}}
出力結果は、以下の様になります。
&ref(RTC_screen.png);
** ディープ・パワー・ダウンモードを試す
ARM学習基板の本では、いきなりタイマー割り込みで再起動する...
以下のように、p4の1番ピン(GND)、7番ピン(PIO1_4)をタクトス...
&ref(DeepSleepWakeUp.png);
#pre{{
#include <cr_section_macros.h>
#include <NXP/crp.h>
// Variable to store CRP value in. Will be placed automat...
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP extern const unsigned int CRP_WORD = CRP_NO_CRP ;
#include "lbed.h"
void DeepPowerDown(void) {
int d;
LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG;
LPC_SYSCON->PDSLEEPCFG=0xFFFFFFFF; //アナログブ...
SCB->SCR |= 0x04; // システム...
LPC_PMU->PCON |= 0x2; // DEEP Pow...
d = LPC_PMU->PCON;
__WFI(); // 割り込...
}
int main(void) {
wait_init();
DigitalOut myled(LED2);
myled = 1;
int wakeupCounter = 30;
while(1) {
if (--wakeupCounter == 0) {
myled = 0;
DeepPowerDown();
}
wait_ms(1000);
}
}
}}
*** リアルタイムクロックの時刻を受け取る [#e482af9e]
次に、復帰したときにリアルタイムクロックから時刻を取得し...
意外にもコンデンサーに貯めた電気でリアルタイムクロックが...
((225.7日))
動作することが分かりました。
$$
\frac{C (V_0 - V_1)}{I} = 1.5 \times ( 3.3 - 2.0)/100 \ti...
$$
&ref(RTCwithC.png);
起動して、CDCに時刻を10回表示してまた、スリープモードに入...
((main関数のみ表示))
毎回起動後にCDCのターミナルを起動して、1文字入力してなら...
((すぐに起動するようにするとLPC1343が書き込み途中にスリー...
#pre{{
int main(void) {
int wakeupCounter = 10;
wait_init();
DigitalOut myled(LED2);
SerialCDC pc(USBTX, USBRX);
pc.baud(9600);
// キー入力を待つ
pc.read();
PCF2123 rtc(MOSI, MISO, SCKL, P0_2);
// 1回目に時刻をセットした後は、コメントにするとRTCが...
// rtc.set_time(0x45, 0x59, 0x23, 0x31, 0x06, 0x12, 0...
int pS = 0xff;
pc.println("After 10 seconds, I will be into deep sl...
myled = 1;
while(1) {
rtc.read_rtc();
if (pS != rtc.S) {
pc.printf("wake up count = %d\n", wakeupC...
pc.printf("20%02x/%02x/%02x[%d] ", rtc.Y,...
pc.printf("%02x/%02x/%02x\n", rtc.H,...
pS = rtc.S;
}
if (wakeupCounter == 0) {
myled = 0;
DeepPowerDown();
}
wait_ms(100);
}
}
}}
*** アラームをセット [#oe356fde]
最後に、アラームをセットして、再起動をする例題を示して、...
#pre{{
int main(void) {
int wakeupCounter = 10;
wait_init();
DigitalOut myled(LED2);
SerialCDC pc(USBTX, USBRX);
pc.baud(9600);
// キー入力を待つ
pc.read();
PCF2123 rtc(MOSI, MISO, SCKL, P0_2);
// 1回目に時刻をセットした後は、コメントにするとRTCが...
rtc.set_time(0x40, 0x42, 0x10, 0x01, 0x00, 0x09, 0x13);
// 分単位の割り込みを発生するようにセット
rtc.command((PCF2123::WRITE_BIT|PCF2123::SUBADDR|PCF2...
// アラームのセット(時間、分は、16進で指定する)
// rtc.set_alarm(0x10, 0x33);
int pS = 0xff;
pc.println("After 10 seconds, I will be into deep sl...
myled = 1;
while(1) {
rtc.read_rtc();
if (pS != rtc.S) {
pc.printf("wake up count = %d\n", wakeup...
pc.printf("20%02x/%02x/%02x[%d] ", rtc.Y,...
pc.printf("%02x/%02x/%02x\n", rtc.H,...
pS = rtc.S;
}
if (wakeupCounter == 0) {
myled = 0;
DeepPowerDown();
}
wait_ms(100);
}
}
}}
** 最新のソース [#da70038b]
最新のソースは、Githubの以下のURLからダウンロードできます。
- https://github.com/take-pwave/lbed
** コメント [#r9e6c373]
- I2C.readに大きなバグがありました。LM75Bを修正しました。...
#comment_kcaptcha
ページ名:
SmartDoc