前回の記事で書き込んだPIC10F322には実はNCOと言うパルス生成装置??がついています。
Youtubeの動画によると周波数ステップがPWMに比べて細かいみたいです…??
NCOは20bitのメモリに1クロックに指定された数だけ加算していき、桁あふれになったら出力が指定された数だけ出ることでパルスを生成しているようです。
つまり、99まで数えられるカウンターに1ずつ足していって100(=0)になったらボタンを押すみたいなことになります。
それで…MPLABでのコードはこんな感じになります。
int i;
#define _XTAL_FREQ 1000000
int main(int argc, char** argv) {
OSCCON = 0b00110000; // 0 011=1MHz 0000
ANSELA = 0b00000000;
TRISA = 0b00000000;
PORTA = 0b00000000;
NCO1CON = 0b01100001; // 0=NCO disable, 1=NCO pin enable, 1=NCO high when enable, 0=Active Low 000 1=Pulse mode
NCO1CLK = 0b00100001; // 001=2 pulse width, 000 01=use system clock
NCO1INCH = 0b00100000; // High increment bits
while(1){
CLRWDT();
N1EN = 1; // NCO1 = RA2
for (i = 0; i < 100; i++){
__delay_ms(10);
}
N1EN = 0;
for (i = 0; i < 100; i++){
__delay_ms(10);
}
}
}
コンパイルしたのはこっち
:020000040000FA
:02000000FC29D9
:10036000303090008801860185016130AD00213078
:10037000AE002030AB006400AD17C601C7010430E9
:10038000C5003D30C400C40BC329C50BC329C8290F
:100390000130C6070318C70A0030C7074708803A6C
:1003A000FF0080307F02031DD72964304602031C02
:1003B000DA29DB29BF29AD13C601C7010430C50006
:1003C0003D30C400C40BE229C50BE229E729013006
:1003D000C6070318C70A0030C7074708803AFF005E
:1003E00080307F02031DF62964304602031CF92980
:1003F000FA29DE29BB290028C801C9018301B029D7
:02400E00FE3F73
:00000001FF
NCO1CONでNCOが有効かどうか、NCOのピンが有効かどうか、桁あふれしたときにHighにするかどうか、Active Highかどうか(?)、パルスで出力するか固定デューティー(?)で出力するかが決められます。
よく分からないのがいくつかあるけど動いたからこれでいいや。
NCO1CLKでは出力は何クロック保持するか、何をクロック元にするかを決めます。
保持するクロックを大きくするとそれだけHighの時間が多くなります。(=LEDが明るくなる)クロック元はLED駆動程度だったらシステムクロックを使えばいいと思う。
NCOINCHは1クロックで加算する量を決めます。これを増やすとLEDが明るくなる。ここの数値を1ビットずつ変えると周波数を細かく変えられるんだと思います。精度が足りなかったらNCOINCL(下位ビット)も使えます。
10F322ではRA2にNCO出力があるのでRA2にLEDをつないでN1EN(NCO1CONの最初のビット)を1にするとLEDが抵抗なしでまあまあ明るくつきます。LEDは高速で点滅させると抵抗をつないだときより明るく見えるらしいです。測ってみたら0.2mAでしっかり確認できるぐらいの明るさになりました。
定期的にCLRWDT();を実行するのを忘れてると犬に噛み付かれるので気をつけましょう。
結局
何に使うの?
周波数スイープでゆらゆら点滅させるのはめんどうくさいのでやらなかった