2021年6月9日水曜日

Tiny Avr 0 シリーズタイマの例

 こんにちは   やましょうです。

AVR0 シリーズ本日はタイマです。

なんか昔のAVRと違う。。ということでタイマのsampleです。

TCAの構成はこんな感じですね。

 typedef struct TCA_SINGLE_struct
{
    register8_t CTRLA;  /* Control A */
    register8_t CTRLB;  /* Control B */
    register8_t CTRLC;  /* Control C */
    register8_t CTRLD;  /* Control D */
    register8_t CTRLECLR;  /* Control E Clear */
    register8_t CTRLESET;  /* Control E Set */
    register8_t CTRLFCLR;  /* Control F Clear */
    register8_t CTRLFSET;  /* Control F Set */
    register8_t reserved_0x08;
    register8_t EVCTRL;  /* Event Control */
    register8_t INTCTRL;  /* Interrupt Control */
    register8_t INTFLAGS;  /* Interrupt Flags */
    register8_t reserved_0x0C;
    register8_t reserved_0x0D;
    register8_t DBGCTRL;  /* Degbug Control */
    register8_t TEMP;  /* Temporary data for 16-bit Access */
    register8_t reserved_0x10;
    register8_t reserved_0x11;
    register8_t reserved_0x12;
    register8_t reserved_0x13;
    register8_t reserved_0x14;
    register8_t reserved_0x15;
    register8_t reserved_0x16;
    register8_t reserved_0x17;
    register8_t reserved_0x18;
    register8_t reserved_0x19;
    register8_t reserved_0x1A;
    register8_t reserved_0x1B;
    register8_t reserved_0x1C;
    register8_t reserved_0x1D;
    register8_t reserved_0x1E;
    register8_t reserved_0x1F;
    _WORDREGISTER(CNT);  /* Count */
    register8_t reserved_0x22;
    register8_t reserved_0x23;
    register8_t reserved_0x24;
    register8_t reserved_0x25;
    _WORDREGISTER(PER);  /* Period */
    _WORDREGISTER(CMP0);  /* Compare 0 */
    _WORDREGISTER(CMP1);  /* Compare 1 */
    _WORDREGISTER(CMP2);  /* Compare 2 */
    register8_t reserved_0x2E;
    register8_t reserved_0x2F;
    register8_t reserved_0x30;
    register8_t reserved_0x31;
    register8_t reserved_0x32;
    register8_t reserved_0x33;
    register8_t reserved_0x34;
    register8_t reserved_0x35;
    _WORDREGISTER(PERBUF);  /* Period Buffer */
    _WORDREGISTER(CMP0BUF);  /* Compare 0 Buffer */
    _WORDREGISTER(CMP1BUF);  /* Compare 1 Buffer */
    _WORDREGISTER(CMP2BUF);  /* Compare 2 Buffer */
    register8_t reserved_0x3E;
    register8_t reserved_0x3F;
} TCA_SINGLE_t;


①CTRLBのWGMODE2~01に01(FRQ)を設定

#define TCA_SINGLE_OVF_bm  0x01  /* Overflow Interrupt bit mask. */

となっているのでこれを設定

 

②PERにタイマ値設定

 

カウント数(設定値+1) = 欲しい規定時間 * 3.3Mhz(20Mhz発振時 1/6分周後)となるので。

1[mS]が欲しい規定時間の場合 3000となります。

TCBですと1/2の分周器が入るので設定値は半分の

1500になると思います。

実際タイマの回路はアンダーフローで割込みに入るでしょうから

カウント数-1を設定するべきかと思います。


③CTRLAに分周数設定し開始

TCA0.SINGLE.CTRLB = TCA_SINGLE_WGMODE_NORMAL_gc;
TCA0.SINGLE.PER = 3000;
TCA0.SINGLE.CTRLA  = TCA_SINGLE_CLKSEL_DIV1_gc;     /* 1/1分周        */  TCA0.SINGLE.CTRLA |= TCA_SINGLE_ENABLE_bm;                /* タイマ計測開始 */

また割込みを使用する場合は、

④INTCTRLのOVFを設定して、タイマのOVERフロー割込みを許可にしておきます。

(その後MASTER割込みも許可してくださいね)


⑤割込み処理の記述、もしくはメインでOVFのチェックをします。

    

5-1.割込み時

タイマ割込み設定にして、

 TCA0.SINGLE.INTCTRL = TCA_SINGLE_OVF_bm;を設定部に追加し


ISR(TCA0_OVF_vect)
{
    任意処理 

  TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm;
}

5-2.メインでタイマチェック

     if(TCA0.SINGLE.INTFLAGS & TCA_SINGLE_OVF_bm)
    {    /*1MS単位 */
           TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm; 

           任意処理  

 }


以上

やましょうでした。






2021年6月8日火曜日

TINY AVR0 シリーズのポートの構成

 こんにちは、

 

やましょうです。

 

 AVR TINY 0 シリーズ(AVR  TINY   202,402,204,404,804,1604,1606,806,406,807,1607)

実際にはATtiny202を使ってみようと思ったのですが、いろいろ検索をしてみたのですが、

何もみつからなったので、記載しておきたいと思います。


1.ポートのレジスタ構成がPICポイ。W

iotn202.hを見てみます。
typedef struct PORT_struct
{
    register8_t DIR;  /* Data Direction */
    register8_t DIRSET;  /* Data Direction Set */
    register8_t DIRCLR;  /* Data Direction Clear */
    register8_t DIRTGL;  /* Data Direction Toggle */
    register8_t OUT;  /* Output Value */
    register8_t OUTSET;  /* Output Value Set */
    register8_t OUTCLR;  /* Output Value Clear */
    register8_t OUTTGL;  /* Output Value Toggle */
    register8_t IN;  /* Input Value */
    register8_t INTFLAGS;  /* Interrupt Flags */
    register8_t reserved_0x0A;
    register8_t reserved_0x0B;
    register8_t reserved_0x0C;
    register8_t reserved_0x0D;
    register8_t reserved_0x0E;
    register8_t reserved_0x0F;
    register8_t PIN0CTRL;  /* Pin 0 Control */
    register8_t PIN1CTRL;  /* Pin 1 Control */
    register8_t PIN2CTRL;  /* Pin 2 Control */
    register8_t PIN3CTRL;  /* Pin 3 Control */
    register8_t PIN4CTRL;  /* Pin 4 Control */
    register8_t PIN5CTRL;  /* Pin 5 Control */
    register8_t PIN6CTRL;  /* Pin 6 Control */
    register8_t PIN7CTRL;  /* Pin 7 Control */
    register8_t reserved_0x18;
    register8_t reserved_0x19;
    register8_t reserved_0x1A;
    register8_t reserved_0x1B;
    register8_t reserved_0x1C;
    register8_t reserved_0x1D;
    register8_t reserved_0x1E;
    register8_t reserved_0x1F;
} PORT_t;

うんーーー最近のpic32に似ています。
まず、dirは入出力設定だと思います。
そのあとSET(bitを立てる用)のレジスタ
そのあとCLR(bitを下げる用)のレジスタ
 そのあとTGL(bitを反転用)のレジスタですね。
その後は、出力ラッチと入力ラッチ 別になっていますね。
あと各PINの機能も1BYTE毎に設定(PINxCTRL)内容としてはPULLUP&反転、割込み設定。
ですね。

次回はタイマを書きたいなぁ。

以上
やましょうでした。

2017年12月25日月曜日

MicrobitでBle

こんにちは、やましょうです。

MicroBit:Advent カレンダー25日目です。
皆様のご協力で、25日すべて無事に完了いたしました。
ありがとうございます。

今日はマイクロビットでbleをお送りします。
内容はこんな感じです。
シリアル出力はテスト用で、動けば必要はありません。


そして、動かすとこんな感じになりまうす。

とても簡単に通信できますね。

それでは、みなさん本当にありがとうございました。


2017年12月9日土曜日

microbit 3vでgrove 5v液晶を動かす。

こんばんは、やましょうデス。

本日は、MICRO BITから5V液晶をつかう方法です。

まず、液晶ですがこれ!!

http://akizukidenshi.com/catalog/g/gP-09283/


これ5Vだから面倒って人は、有機EL液晶を使えば3.3Vのまま使えます。
それはこれ、http://akizukidenshi.com/catalog/g/gP-12031/とか
http://akizukidenshi.com/catalog/g/gP-08276/ならそのまま使えます。

あーーー本題とづれている。。。。ということで動かす方法を考えます。

I2Cのレベル変換ICを使います。
これ
I2Cバス用双方向電圧レベル変換モジュール(PCA9306)




VREF (3.3V)  MICROBITからとる (GROVEの赤)
SCL1 MICROBITのSCL(GROVEの黄色)
SDA1 MICROBITのSCA(GROVEの黄色)
GND MICROBITのGND(GROVEの黒)と液晶のGND(GROVEの黒色)と液晶電源のGND
VREF (5V)  液晶の電源5V(GROVEの赤色)ここは電源の5Vも付ける。
SCL2  液晶のSCL(GROVEの黄色)
SDA2  液晶のSDA(GROVEの赤色)

これをつけて動かすと動くよ


ってことで無事に動きました。
それではごきげんよう






2017年12月3日日曜日

microbit 開発方法まとめ


こんにちは、
やましょうです。
Microbit アドベントカレンダー3日目です。

開発方法を本日はまとめてみました。

1.本家で開発?
https://www.microbit.co.uk
日本語が変です。




2.新本家で開発

https://makecode.microbit.org/


3.chibi:bitで開発。
https://www.switch-science.com/catalog/2900/
micro:bitの技適問題で国内販売できなかった時に、
switch-scienceさんから発売されていた互換ボードです。
http://chibibit.io/ide/
 
開発環境もmicrobitでもよいはずなのですが、揉めたのか?独自のideを作っており、swさんの本気度(採算度外視?)を感じさせてくれるページです。
現在は2の新本家のjava scriptと同じに。。。?(リダイレクトさているのか?)




4.Arduino
Arduino については、ht_dekoさんがとても詳しくまとめられていますので、
そのページを参照ください。
https://ht-deko.com/arduino/microbit.html


5.mbedで開発
https://os.mbed.com/platforms/Microbit/
に行ってあとはコンパイルして、落ちてきたバイナリをmicrobitに転送すれば完了です。


開発環境がいろいろ選択できるのがうれしいところですね。
それでは、
今日のところはこの辺で。。





2016年12月21日水曜日

青色(lpc1768) 黄色(lpc11u24)でspi使用時の注意点

こんばんは、

mbed アドベントカレンダー2016 21日目ですね。

明日はやましょうは渋谷で飲んだくれている予定です。
お近くの方はお呼びください。
今年も、皆様、お世話になりました。mbed関連でもかなりのお仕事ができた年でした。
これも一重に皆様のご協力のおかげと思っております。m(_ _)m


さて私も大好きな青mbedというか黄色mbedと言うか
元nxpのマイコンのspiはちょっと独自でなので注意が必要です。

通常Spiで自分がMasterモードであれば、MOSI側が出力ポートのままである筈と思いますよね。
(STも旧フリスケも出力のままですしね。)
どうもnxp(旧NXP)のマイコンは違うらしく、MOSIはOPENになるっぽいのです。
(ブロック図欲しい。)
でもこれ英語版のwikiペディアではこで良い様な波形が紹介されているのです。
なのでバグってことではなく意図的にこの様になっている模様です。

















上からCS / CLOCK /DATA 出力/DATA 入力の順で
手でピン触りながら波形を計測するとこんな波形がとれます。
なので、ハード的にPULL-UPするか?PULL-DOWNするか?
しておかないとぷらぷらになっちゃうんです。
これ相手のマイコンも入力なので、かなり深刻になるかも?
と言うことで注意しましょうね。

ちなみにフリスケFRDM-K64ではこんな波形になります。


















今回チェック用に作成したコードはこんな感じ
#include    "mbed.h"

Serial      PC(USBTX,   USBRX);                 /* PC UART         */
SPI spi(p5, p6, p7); // mosi, miso, sclk
DigitalOut cs(p8);
/* //////////////////////////////////////////////////////////////////////// */
/* // メイン処理 ////////////////////////////////////////////////////////// */
/* //////////////////////////////////////////////////////////////////////// */
int main(void)
{
    //// PC 通信設定  ////////////
    PC.baud(115200);                             /* PC間フォーマット設定 ボ-レート */
    PC.printf("Progam Start!\n");
    spi.frequency(10000);
    while( true ) {
        if ( PC.readable() )
        {
             uint8_t OutData = PC.getc();
             PC.printf("Data:%2x\n",OutData);
             cs = 0;
             spi.write( OutData );
             cs = 1;
        }
    }
}


ということで注意しよう、SPI時、MOSI OPEN NXP(旧フリスケを除く)

以上
やましょうでした。

2016年4月26日火曜日

ラズパイ3 windows 10 iotを試す。


みなさん

お久しぶりです。やましょうです。


ラズパイ3を入手、

windows 10  iot インストール。


blinkky.cppを動かしてみました。。。

        interval.Duration = 500 * 1000 * 10;

っで500ms毎ってことだと思うのですが、

実測すると(計測器自体の誤差も考えられますが。。)



5回なので2.5秒が正解だと思うのですが。

1回あたり、500ms以上掛かっているんですが。。。。。

私の計測機がわるいのか??
デバッグモードなのがわるいのか?
MSさん確認お願いします。