読者です 読者をやめる 読者になる 読者になる
一人もくもく会 α verでサービス開始しました。

PIC12F675でPWM

PWMに挑戦しようと思って以前見かけたサイトを見てみたら、
どうも12F675じゃない。
おかしいと思いデータシートを見てみたら、
どうもそこに書かれていたレジスタ(CCPR3Lとか)が無い。
12Fは自前で実装しないといけないのか…。

しかたがないので自前で試しにやってみた。
うまく調整しないと普通に点滅して見えちゃう。
for文でディレイしているサイトも見かけたが
恐らくあまり実用的ではないと思うので一応タイマーでやってみている。

詳しいことは分からないが、別で見かけたサイトを参考にして
割り込み関数内では変数の切り替えだけにするようにして
なるべくmainの方でLEDの操作の方は行うようにしている。
もちろん詳しいことはわからないので無意味かもしれない。

環境は次の通り。
・MPLAB X IDE v2.0
コンパイラはXC8
・pickit3使用

#include <xc.h>

#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = ON, MCLRE = OFF

static unsigned char count;
static unsigned char flag;
static bit uping;
static unsigned char maxcount;
static unsigned char wait;

static void interrupt inter() {
    T0IF = 0;

    count++;
    if (count == 4) {
        flag = 1;
    } else if (count == maxcount) {
        flag = 0;
        count = 0;
        if (++wait == 10) {
            if (uping) {
                maxcount++;
                if (maxcount == 32) {
                    uping = 0;
                }
            } else {
                maxcount--;
                if (maxcount == 7) {
                    uping = 1;
                }
            }
            wait = 0;
        }
    }
}

main()	{
    GPIO = 0;
    CMCON = 0x07;		// コンパレータ未使用
    ANSEL = 0x00;		// AN未使用
    TRISIO = 0x3B;		// GP2:out
    OPTION_REG = 0x80;          //プリスケーラ2
    TMR0 = 0x00;                //カウント0
    T0IE = 1;                   //タイマー0使う
    GIE = 1;                    //タイマー使う

    count = 0;
    flag = 0;
    uping = 1;
    maxcount = 8;
    wait = 0;

    while(1) {
        if (flag == 1 && GPIO2) {
            GPIO2 = 0;
        } else if (flag == 0 && !GPIO2) {
            GPIO2 = 1;
        }
    }
}

しかし予習ではPIC+白LEDは3Vじゃ動かないはずだったんだけど
pickit外して1.5Vの電池2本で動いた。
まだまだ良くわからないことだらけだ。

はんだの練習もしたいので一応12F675でちょっとしたものは作るつもりだが、
それでなんだかんだできたらPIC18F14K50も試してみようと思っている。
秋月にUSB付きのがあるので一回それで色々やってみる。
やっぱシリアル通信できないと幅が広がらない。
arduinoで毎回2000円以上かけてUSB使うとか金が飛んでしょうがないだろうし。
うまくいったら回路図を元に自分で量産できるようにしてみたい。