2016年2月29日月曜日

PIC32MX120F032BでLEDチカチカさせてみた

PIC32MXを勉強すべく、まずはLEDをチカチカさせるプログラムから。
以前の記事、「【PIC入門】MPLABとXC8をインストール、PICKIT3を接続など簡単な回路を動かすまでのまとめ」の環境(MPLAB、PICKIT3)が揃ってる状態からスタート。

手順1. 32bit向けにコンパイルするXC32のインストール

今まで使ってたPICが8bitだったのでXC8を使っていたが、PIC32MXは32bitなのでコンパイラが違う。xc32は無料版も出てるようなのでそれをインストールした。

手順2. プログラム用意

XC32をインストールすると「C:\Program Files (x86)\Microchip\xc32\v1.40\examples\xc32_examples」にサンプルプログラムが見つかる。
led_message というのが今回やりたいことに近そうなのでこれのコンフィグを参考にした。
それで作ったプログラムがつぎのようなもの。

#include <xc.h>

#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_8

#define SHORT_DELAY (50*8)
#define LONG_DELAY (400*8)

void wait(void){
    TMR1 =  0;
    while ( TMR1 < SHORT_DELAY){}
}

int main(void)
{
    // disable JTAG port
    DDPCONbits.JTAGEN = 0;

    // 3.1 variable declarations
    int i;           // i will serve as the index

    // 3.2 initialization
    TRISA = 0;      // all PORTA as output
    T1CON = 0x8030; // TMR1 on, prescale 1:256 PB

    // 3.3 the main loop
    while(1)
    {
        // 3.3.2 long pause, hand moving back to the left
        PORTA = 0;      // turn LEDs off
        wait();
        PORTA = 1;      // turn LEDs on
        wait();
    } // main loop

}


手順3. PICKIT3でICSPする回路用意

コメを噛めっていうサイトの「PIC32MX220F032B でLEDチカチカ」がものすごく参考になる。
なにより、PICKIT3の接続が分かりやすくてよかった。(次の図が引用です)

この通りブレッドボードで配置すればOK!


手順4. 実行



このPICを使いこなせるように頑張ろう。

2016年2月28日日曜日

PIC32MX120F032Bを使うことにしたら前作った汎用基板使えなくなった


http://www.microchip.com/stellent/images/mchpsiteimages/en537986.jpg

PICって色々種類あってどれ選んだらいいかよく分からんなーと思ってた。ただ、古いPICより新しいPICの方が性能もコストパフォーマンスも良くなってるだろって思って、新しいの使ったほうがいいなとは思った。あと、ハードウェアごとにデータシート変わるし、色々なデータシート見るのも面倒だから、1つのPICを長く使ったほうが学習コストも少なくなると思った。

それに加えて、今回やりたかった事がPIC使ってwebsocketやりたかったのである程度のRAMが必要そうだったんですよ。
例えば、このページ「Embedded Websockets」だと、最初PIC16F886を使ったがRAMが少なくて、4KB以上のRAMを持つPIC18F4620に変更したといってる。

そうかそうか、4KB以上のRAMの方がよいのか。

ということで、要件に合いそうなPICを秋月で選んだら「PIC32MX120F032B」になりました。
32bit CPUを使ってるハイスペックモデルのPIC32MXの一覧ページ見ると6種類あった。


よく違いがわからないのでmicrochipのHPで、「Microchip's 32-bit Microcontrollers」というページで比較表を見た。


RAMは4K以上がよいのは全て大丈夫みたい。32MX1系と32MX2系の違いはUSBホスト機能(?)の有無で変わるらしいけど、今のところUSB使う予定無いので1系でいいなってなった。秋月で売ってるの、pic32mx110f016bとpic32mx120f032bが10円の差しかなくて、RAMが倍になるなら120f032b買っとけばいいっしょ、ってなった。


はい、届きましたー。(4つ買ってみた)



これで、どんな重い処理も一瞬でやってくれるぜ!!


そして、残念なお知らせが。。
1ヶ月ちょっと前に買いた記事「PIC焼く汎用基板作った」で作ったものが利用できなそう。。
なんだよ、汎用基盤って!32-bitに対応出来てねーじゃねーか!!

アメブロの「PIC32MX220 (200円のMIPS CPU)を使う」にあった次の図見ると、pickitで接続するPINと必要な物が違っとるもん。。


ICSPでやるからもぉいいよーだ。
【ICSP】(In Circuit Serial Programming)
ICSP方式でPICのプログラミングを行えば、いちいちPICをソケットからはずしてプログラマのソケットに差し換える手間も無くなりますし、フラットパッケージのPICのように、基板にはんだ付けしてしまったPICのプログラム書き換えも、そのままの状態で可能になります。
引用元: http://www.picfun.com/pic18/pic18xx14.html


2016年2月21日日曜日

レイ・ダリオ氏が語る「30分で判る 経済の仕組み」とマルサスの「過少消費説」のメモ

ヘッジファンド運用会社ブリッジウォーター・アソシエーツ創業者のレイ・ダリオ氏がYouTubeにアップロードした経済を説明した動画が分かりやすい。アニメーションも楽しい。


動画は30分ほどあるので、自分が覚えておきたいと思ったところだけ箇条書きにしとく。

  • 経済は3つの要素からなる
  • 1. 生産力の成長
  • 2. 債務の短期的な周期
  • 3. 債務の長期的な周期
  • 経済は取引の積み重ね
  • 買い手が「お金とクレジット」、売り手が「物やサービス」を提供
  • クレジット≒信用。貸し手と借り手が同意した時に発生する
  • クレジット(借金)は貸し手に取って資産、借り手にとって債務
  • クレジットは貸し手、借り手を助ける
  • クレジットは最も大きく変動しやすい
  • あなたの支出は誰かの収入
  • 債務には小さい周期の5から8年と大きい周期の75年から100年がある
  • クレジットによる債務とは、未来の自分から借金をすること
  • クレジットが債務の波を起こす
  • お金とクレジットは違う
  • お金はものの精算に使うもの
  • 世の中の金額は殆どはクレジット(アメリカでは50兆ドルのクレジットと3兆ドルのお金が流通している)
  • クレジットの無い経済では生産力を上げないと経済が成長しない
  • クレジットは経済にレバレッジをきかせる
  • クレジットは何も無い所に発生する
  • 中央銀行は、お金とクレジットの総量をコントロールできる(利子制御、通貨発行できる)
  • クレジットが簡単に手に入る場合は経済が拡大し好景気になる
  • インフレになると中央銀行は利子を上げてお金を借りにくくする
  • クレジットが手に入りにくくなる(債務が増える)
  • 経済が悪化してデフレになる
  • 中央銀行が利子を下げてお金を借りやすくする
  • ※これを繰り返す
  • 債務の返済が収入より多くなると支出を押さえだす
  • クレジットが減る、支出減らす、収入が減る、資産が減る、クレジットが減る→悪循環
  • 利子を下げても回復しないので、これは不景気とは違う
  • 債務が大きくなりすぎている場合、利子を引き下げても回復が不可能
  • このようにレバレッジが消滅した場合の解決方法は4つ
  • 1. 人、ビジネス、政府が支出を減らす(緊縮策)
  • 2. 債務不履行にする
  • 3. 富裕層から再分配
  • 4. 新しい紙幣を印刷する
  • それぞれ、メリットデメリットあるので、4つの方法を使ってデフレ要素とインフレ要素を調整すべし
  • お金を印刷してもクレジットの消滅を相殺できるならインフレにならない
  • お金を印刷するのは簡単なことなのでハイパーインフレを起こさないように注意する
  • 債務周期を生産性成長カーブに重ねると将来を予測できる
  • 3つの結論
  • 1. 所得より先に債務を増えさせない(債務負担に耐え切れなくなる)
  • 2. 所得を生産性より先に増えさせない(競争力が弱くなる)
  • 3. 生産性を向上させる努力を惜しまない(長期的に一番重要)

あぁ、これ理解したから金持ちになれるは。

あと、これが日本の経済にピッタリあっててびっくりした。
日本の不況は、マルサスの「過少消費説」で説明できる



200年前から言われてるのに対策できないとは。。

2016年2月16日火曜日

マイコン(PIC)のシリアル通信確認するときにArduinoあると簡単だった

PIC16F88でシリアル通信する処理を焼いてみたのだが、実際に出力できているのか確認したかった。
この前、PICの工作キットでRS-232CでPCとシリアル通信するの上手く動かなかったしどうしよう。
っていうときに、Arduino使うと驚くほど簡単にシリアルをPCで確認できたのでメモ。
あぁ、Arduino持ってて良かった。

PIC16F88のコード

#include <xc.h>
#include <stdio.h>
 
#define _XTAL_FREQ 8000000      // 8MHz

//#include "uart.h"

// 16F88
// CONFIG1
#pragma config FOSC = INTOSCIO // 内部発振使用
#pragma config WDTE = OFF   // ウォッチドッグタイマ
#pragma config PWRTE = ON   // パワーアップタイマー
#pragma config MCLRE = OFF  // マスタークリアー機能
#pragma config BOREN = OFF   // ブラウンアウトリセット
#pragma config LVP = OFF    // 低電圧プログラム書き込み
#pragma config CPD = OFF    // データーコードプロテクション
#pragma config WRT = OFF    // フラッシュ書き込み
#pragma config CCPMX = RB3  // CCPのパルス出力ピン
#pragma config CP = OFF     // プログラムコードプロテクションOFF

// CONFIG2
#pragma config FCMEN = OFF  // Fail-Safe Clock Monitor
#pragma config IESO = OFF   // Two-Speed Start-up

// uart
#define BAUDRATE 9600       // 9.6kbps
#define TX9_RX9_BIT 0       // 0: 8bit, 1: 9bit
#define BRGH_BIT 1          // 0: 低速サンプル指定, 1: 高速サンプル指定

void init_pic(void);
void init_uart(void);
void strOutUSART(char *);

void main(void) {
    init_pic();
    init_uart();
    
    char *cmd = "$WP http://request-watcher.herokuapp.com/ testbody=hello\n";
    while(1){
        __delay_ms(5000);
        strOutUSART(cmd);
    }
}

void init_pic(){
 OSCCON = 0x72;  // INTOSC 8MHz
 ANSEL  = 0x00;  // AN未使用
    
 PORTA = 0x0;
 PORTB = 0x0;
    
 TRISA = 0x0;  // RA0-7:out
    
    // SPIシリアル通信する
    // RC2/RX をinput
    // RC5/TX をoutput
 TRISB = 0b00000100;
    
    return;
}

void init_uart(){
    SPBRG = 51;     // 8MHzの時の9600Hz
    RCSTA   = 0b10010000;  // UART送受信を有効
    TXSTA   = 0b00100100;  // 8Bit非同期送受信

    RCIF = 0;    // reset USART interruption flag
    RCIE = 1;    // enable USART interruption
    PEIE = 1;    // enable peripheral interruntion
}

void strOutUSART(char *str){
    while(*str){                 //文字列の終わり(00)まで継続
        while (!TXIF);  //送信終了待ち
        TXREG = *str++;          //文字出力しポインタ+1
    }
}



Arduinoのコード

const unsigned long baudrate = 9600;
void setup() {
  Serial.begin(baudrate);
  Serial.println("Ready.");
}

void loop() {
  if (Serial.available() > 0) {
    char c = Serial.read();
    Serial.print(c); // Echo back
  }
}


なんとこれだけ!

実行

ちゃちゃっとつなげればOK。今回のPICは11番がシリアル送信になる。
そして、Arduinoの0番はそのままシリアル受信できる!



DCジャックついてるけど使ってません。プラスとマイナスはそれぞれ繋いであります。


コード。

シリアルモニタ。

シリアル送信できてる!

PICやったあとだとArduinoの便利さがすごい分かる。
コンフィグとか設定しないでもやりたいことできるもの。

以上、便利だったので記録しました。