2012年4月30日月曜日

ARMで時間待ち関数

PICで時間待ちをしたい場合
delay_ms(n);やdelay_us(n);といった関数で(ほぼ)正確な時間待ちができますが
ARMにはそう言った関数が用意されていません
(たぶん)

正確な1秒であればRTCでも作れるので
1日に1回 というレベルの時間待ちならそれで十分ですが
マイクロ秒単位での時間待ちだと使えません
と言うことで
タイマ2を使用して(ほぼ)正確なウエイト処理を書いてみました
検証環境はSTBeeに例のごとくストリナの開発環境です


2012年4月26日木曜日

STBeeとか TIM2初期設定

STBeeでTIM2を動かすための設定メモ


コンセント

何回目だっていうネタですが
やっぱり気になるので コンセントの使用数のカウントです


  1. デスクトップ(Win7マシン)
  2. デスクトップ(WinXPテストマシン)
  3. MacBook Pro
  4. プリンタ
  5. 無線LANAP
  6. LANハブ
  7. 画面(24)
  8. 画面(19)
  9. ケトル
  10. ライト
  11. 5V電源(電子回路用)
  12. 15V電源(or12V電源)
  13. 卓上ドリル
  14. オシロスコープ
  15. スピーカー
  16. PocketWi-Fi
  17. USB電源(布団でiPhoneとか充電用)
  18. ハンダゴテ

ざっと思いつくくらいでもこれくらい使ってる
こえーよ(´;ω;`)

とりあえず
自分で部屋を設計するとしたら
上記×2位くらいの容量に耐えられる配線が欲しいなぁ

しっかし この部屋の全体の電気代とかどれくらいになるんでしょ(´・ω・`)

2012年4月22日日曜日

秒から年月日時分秒に

C語で秒から年月日時分秒に変換するコードです
標準関数?
それが無いんだなぁ
(探し方が悪いんだろうけど 自分で作ったほうが早かった というか printfですら無いんだからtimeとか探す気にも(ry)


2012年4月20日金曜日

STBeeMiniでタイマ割り込み+Lチカ

とりあえず
汚いですが ソースコードです
全体で100行超えちゃうのでもっと読むからどうぞ


STBeeMiniでタイマ割り込み

STBeeMiniでタイマ割り込みを実装してみました
とりあえず動いたので報告だけ
ソースは綺麗にしてからうpします

1mS毎に割り込みをかけてLEDをチカチカさせます
まぁ500Hzだと点滅なんぞわかりませんが

正確に500Hzじゃないのは
 水晶の精度か定数の設定か
計算上クロック1個分少ないと500.006945Hzになるので
多分定数のミスです
とりあえず ミリ秒単位で割り込みが出来れば1000カウントとunsigned longで起動時間管理が楽になるので いろいろ面白いことができると思う

タイマ割り込みと USART実装して あとADCが出来れば
データロガーとして使えるので 面白くなりそう

あとはprintfが使えれば文句ないんだけどなぁ…w

2012年4月8日日曜日

STBeeでUSART

やっと!STBeeで1バイト送信ができるようになった
なんで動かなかったかというと
USART_Cmd(USART1, ENABLE);を忘れていた
というか知らなかった という…
ってことで GPIOを初期設定後にASCII'A'を送信しつつLチカするコード↓
開発環境はストリナに書いてある方法です
アレ楽でいいね!!

#include "stm32f10x_conf.h"
#include <stdio.h>

#define GPDON(PIN) { GPIOD -> BSRR = _BV(PIN); }
#define GPDOF(PIN) { GPIOD -> BRR  = _BV(PIN); }
#define GPDSET(PIN, bit) { if(bit){ GPDON(PIN); }else{ GPDOF(PIN); } }


void Delay(volatile unsigned long delay)
{ while(delay) delay--; }

int main(void) {
    int flag;
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
                  
    // システムを初期化します(外部水晶をONにし72MHz動作に切り替えます)
    SystemInit();
                  
    // GPIO Dポートのクロックを有効にします
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

    // PD.4ポートを出力にします。PD.4=LED Lowで点灯
    GPIO_InitStructure.GPIO_Pin = _BV(4);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure); // 初期化関数を読み出します。

    // PA.9 Output
    GPIO_InitStructure.GPIO_Pin = _BV(9);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
                  
    // PA.0ポートを入力に
    GPIO_InitStructure.GPIO_Pin = _BV(0);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    // USART init
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx; /* | USART_Mode_Rx */ // ←受信機能を有効にするにはコメントアウトを解除

    USART_Init(USART1, &USART_InitStructure);
    USART_Cmd(USART1, ENABLE);
   
    for ( ; ; ) {
        USART_SendData(USART1, 'A');
        flag = !flag;
        GPDSET(4, flag);
        Delay(GPIO_ReadInputDataBit(GPIOA, 1) ? 2000000 : 1000000);
    }
}

なんか
Visual Studio→Word→Bloggerオンラインエディタ
で張り付けると
文字の色が保持されるかわりに タブが恐ろしいことになるんだよね
なんでだろう?
'\t'の扱いがVCでは半角スペース4文字だけどBloggerエディタだと違う とかかな?
追々直しますヾ(゚Д゚ )ォィォィ
↑修正しました 一部アレだけど まぁ 我慢してください

で、なぜprintfが使えないか
個人的に 正解率1割以下の勘を信じると
おそらくstdoutが無いんじゃないかと
だって シリアル出力だけで5系統あるわけじゃないですか(多分
んで それ以外にも ユーザーが作った出力があるかもしれない
となると stdoutを決めておくより
あとで定義したほうが自由度が高い
ってことじゃないかと

まぁエラーメッセージ的にはまったく違う理由っぽいですが

とりあえず そんな感じです

うー めんどくさいなぁ OS使いたいなぁ(((

2012年4月7日土曜日

STBeeでLチカ

今さらながらに
STBeeでLチカやってみました
ポートの入力/出力です


#include "stm32f10x_conf.h"

#define GPDON(PIN) { GPIOD -> BSRR = _BV(PIN); }
#define GPDOF(PIN) { GPIOD -> BRR  = _BV(PIN); }
#define GPDSET(PIN, bit) { if(bit){ GPDON(PIN); }else{ GPDOF(PIN); } }

void Delay(volatile unsigned long delay)
{ while(delay) delay--; }

int main(void) {
    int flag;

    GPIO_InitTypeDef GPIO_InitStructure;
                  
    // システムを初期化します(外部水晶をONにし72MHz動作に切り替えます)
    SystemInit();
                  
    // GPIO A/Dポートのクロックを有効にします
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

    // PD.4ポートを出力にします。PD.4=LED Lowで点灯
    GPIO_InitStructure.GPIO_Pin = _BV(4);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure); // 初期化関数を読み出します。
                  
    // PA.0ポートを入力に
    GPIO_InitStructure.GPIO_Pin = _BV(0);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
                                    
    for ( ; ; ) {
          flag = !flag;
          GPDSET(4, flag);
          Delay(GPIO_ReadInputDataBit(GPIOA, 1) ? 1000000 : 2000000);
    }
}


開発環境はストリナで配布されてるモノ
ユーザースイッチが押されているか押されていないかで点滅周期が変わるプログラム

とりあえず入出力ができるようになったので
あとは割り込みとシリアル通信が出来れば
かなり色々と遊べる
タイマ割り込み/シリアル通信/ADCが出来れば 最低限の缶サットは作れるしなぁ

割り込みはめんどくさそうだし
とりあえずUSARTとADCを目指して
PIC飛ばす前にSTBee飛ぶかも?(缶サット