ATMELのAT-Tiny26,ATmega,R8Cなどのワンチップマイコン,C言語,JAVAなどのプログラミング言語の入門のためのページです.サンプルプログラムを中心に紹介します.他にもLinixや数学ソフトなどの紹介も行います.

このブログを検索

あなたは 番目のお客様です.

2009年10月27日火曜日

PDFからテキストを抽出する

PDFファイルで,テキストの抽出ができないものがあります.
xdoc2txtを使うと,テキストの抽出ができない設定のPDFファイルからも,テキストの抽出が可能となります.
http://www31.ocn.ne.jp/~h_ishida/xdoc2txt.html
フリーソフトのxdoc2txtをダウンロードして解凍します.また同サイトよりcryptlib.dllもダウンロードして解凍します.
展開したフォルダにPDFファイルを置きます.
コマンドプロンプトを開き,展開したフォルダに移動します.
xdoc2txt -n xxx.pdf > xxx.txt
のようにコマンド実行すれば,抽出されたテキストが,xxx.txtに格納されます.
当然ながら,暗号化されたPDFファイルは,テキストの抽出ができません.

2009年9月8日火曜日

ATmega88でRTC-8564のテスト









ATmega88で秋月のリアルタイムクロックモジュールRTC-8564をテストしてみました.
RTC-8564はI2C対応のクロックモジュールです.
RTC-8564にはジャンパーJP1,JP2があるので半田接続すれば,
I2Cの抵抗プルアップ2.2kが省略できます.
ATmega88は内部発振8MHzを使っています.
PC6はデフォルトではリセット端子なので注意しましょう.
秒データ0X02に読み込みの前に書き込みを行うと,VLの関係で
トラブルが生じる可能性があります.
RTC-8564のVCC-GNDには忘れず0.1μF程度のパスコンを入れましょう.
プログラムには時間待ちのためdelay()やwait()などの関数を定義して使っています.
待ち時間はいい加減です.なくてもよいかも.

以下はサンプルプログラム
(1)秒データを読み込みPBに出力しLEDで表示する
接続PC5とSCL,PC4とSDA,PB0-6にLED

#include <avr/io.h>
//マイクロ秒単位の待ち(t<256)
void delay(uint8_t t){
TCCR0B=0B00000010; //タイマカウンタ0の分周をセットCK/8
TCNT0=0;
while(TCNT0<t){}
}

int main( void )
{
DDRB=0B11111111; // PBを出力に設定する
//SCL=8MHz/(16+2*17*1)=200kHz;
TWBR=17;
TWSR=0X00;
while(1){
//s開始条件送出
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//SLA_W,アドレス送信
TWDR=0B10100010;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//DATA,データ送信(RTC-8564のアドレス)
TWDR=0X02;//seconds
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));

//s開始条件送出
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//SLA_R,読み出しでアドレス送信
TWDR=0B10100011;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//データ読み込み
TWCR = (1<<TWINT)|(1<<TWEA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//p停止条件送出
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
PORTB=TWDR;//データをPORTBにコピー
delay(100);//100μ秒の待ち
}//while(1)
}//main()


(2)書き込みテストのためminutesの初期値を13に設定し,minutesの値を表示する.
#include <avr/io.h>

//マイクロ秒単位の待ち(t<256)
void delay(uint8_t t){
TCCR0B=0B00000010; //タイマカウンタ0の分周をセットCK/8
TCNT0=0;
while(TCNT0<t){}
}

int main( void )
{
DDRB=0B11111111; // PDを出力に設定する
//SCL=8MHz/(16+2*17*1)=200kHz;
TWBR=17;
TWSR=0X00;

//テストのためminutesの初期値を13に設定
//s開始条件送出
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//SLA_W,アドレス送信
TWDR=0B10100010;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//DATA,データ送信(RTC-8564のアドレス)
TWDR=0X03;//minutes
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));

//データ書き込み
TWDR=0B00010011;//13
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//p停止条件送出
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
delay(100);//100μ秒の待ち(念のためちょっと待つ)

while(1){
//s開始条件送出
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//SLA_W,アドレス送信
TWDR=0B10100010;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//DATA,データ送信(RTC-8564のアドレス)
TWDR=0X03;//minutes
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));

//s開始条件送出
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//SLA_R,読み出しでアドレス送信
TWDR=0B10100011;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//データ読み込み
TWCR = (1<<TWINT)|(1<<TWEA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//p停止条件送出
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
PORTB=TWDR;//データをPORTBにコピー
delay(100);//100μ秒の待ち
}//while(1)
}//main()

(3)時,分の表示をPORTDのLEDで行う
PD0はMinutes Secondsの値を0にリセットする
PD1,PD2でMinutes Secondsの値をインクリメントして設定が可能
PD0-2は1-10kでGND,SWでVCCに接続する

#include <avr/io.h>

//ミリ秒単位の待ち(t<256)
void wait(uint8_t t){
uint8_t i;
TCCR0B=0B00000011; //タイマカウンタ0の分周をセットCK/64(8Us)
for(i=0;i*2<t;i++){
TCNT0=0;
while(TCNT0<250){}
}
}

void write(uint8_t a,uint8_t d){
//s開始条件送出
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//SLA_W,アドレス送信
TWDR=0B10100010;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//DATA,データ送信(RTC-8564のアドレス)
TWDR=a;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//データ書き込み
TWDR=d;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//p停止条件送出
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}

uint8_t read(uint8_t a){
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//SLA_W,アドレス送信
TWDR=0B10100010;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//DATA,データ送信(RTC-8564のアドレス)
TWDR=a;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//s開始条件送出
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//SLA_R,読み出しでアドレス送信
TWDR=0B10100011;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//データ読み込み
TWCR = (1<<TWINT)|(1<<TWEA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//p停止条件送出
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
return TWDR;
}

void inc(uint8_t a){
uint8_t x;
x=read(a);
//インクリメントして,下位が10なら下位をクリアして,上位をインクリメント
x++;
if((x&0B00001111)==10)x=(x&0B11110000)+0B00010000;
write(a,x);
}

int main( void )
{
uint8_t x;
DDRB=0B11111111; // PBを出力に設定する
DDRD=0B00000000; // PDを入力に設定する

TWBR=17;//SCL=8MHz/(16+2*17*1)=200kHz;
TWSR=0X00;

while(1){
if(PIND & 0B00000001){
write(0X03,0X00);
write(0X04,0X00);}//PD0HighでMHリセット
if(PIND & 0B00000010)inc(0X03);//PD1HighでMinutes++
if(PIND & 0B00000100)inc(0X04);//PD2HighでHours++
x=read(0X04);//Hours
PORTB=x;//データをPORTBにコピー
wait(200);//msの待ち
wait(200);//msの待ち
wait(200);//msの待ち
wait(200);//msの待ち
PORTB=0X00;//LEDクリア
wait(200);//msの待ち

x=read(0X03);//Minutes
PORTB=x;//データをPORTBにコピー
wait(200);//msの待ち
PORTB=0X00;//LEDクリア
wait(200);//msの待ち


}//while(1)
}//main()


2009年7月28日火曜日

ATmegaを使う

ATtiny26は,生産中止になったのでしょうか?現在は秋月でも扱っていません.tiny26なき今,AD変換をする場合どのAVRマイコンを選べば良いのでしょうか.
AD変換を行わないのであれば,ATtiny2313で問題ないと思います.パソコンとシリアル通信も可能です.
問題は,AD変換を行いたい場合です.ATtiny261,ATtiny461,ATtiny861がATtiny26の上位互換チップのようです.ただし2009年7月現在秋月電気でのこれらのチップの取り扱いはありません.調べると,これらのチップを扱っている店はいくつかあるようです.
この際ATmegaシリーズに移行するというのも良いと思います.ATmega8とATmega48,88,168,328のシリーズがあります.いずれもピン配置は同じです.mega8が最高16MHz,mega48-328が最高20MHzです.mega48-328の方がより高機能なのでしょうが,ほとんど同じです.tiny26になかった機能として,USART(シリアル通信)機能,TWI(2線シリアルインターフェース)つまりI2C機能を持っています.AD変換で得られたデータをI2Cで外部EEPROMに入れたり,PCと通信したりなど色々なことができそうです.


以下はATmega88用のLED点滅プログラムとAD変換を使った
LED調光プログラムです.

/*
とりあえずmega88でLEDピコピコ
PD0,1,2にLEDを接続,内部発振8MHz,
クロックの分周(Divide clock by 8 internally)なし
1,20,21,22ピンは無接続
mega168でも同様に動く
チップを変えるときはAVRStudioの
Project>Configuration Optionsで異なるチップを選ぶ
*/
#include <avr/io.h>
void wait(int x);
int main( void )
{
DDRD=0B00000111; /* PD0,1,2を出力に設定する */

for (;;) { /* 無限ループ */
PORTD=0B00000001;
wait(4); /* wait関数(waitルーチン)実行 */
PORTD=0B00000010;
wait(4); /* wait関数(waitルーチン)実行 */
PORTD=0B00000100;
wait(4); /* wait関数(waitルーチン)実行 */
}
}

void wait(int x){ /* 時間稼ぎ */
int i,j;
for(i=1;i<x;i++){
for(j=1;j<20000;j++){
j=j; /* dummy */
}
}
}


/*
C言語によるmega88用AD変換のテストプログラム
内部発振8MHzクロック分周なし
ADC0(PC0)は入力,可変抵抗の電圧を入力する
PD0は出力でLEDを接続する
ADCHの値に比例してPD0をオン,PD0をオフする
可変抵抗を変化させることによりLEDの明るさが変化する(調光)
ADCSR=0B11000000でAD変換がスタートし,ADIF=1でAD変換完了
AVCCとVCCを接続,AVGND(22ピン)とGNDを接続,AREFは無接続
AD変換の精度を確保するためにはADPS0-2で
A/D変換クロックを50-200kHzに設定する必要あり
CK=8MHzのときCK/64=125kHz
*/
#include <avr/io.h>
int main( void )
{
int16_t i,ad;
DDRC=0B00000000; /* PC0を入力に設定する */
DDRD=0B00000001; /* PD0を出力に設定する */
ADMUX=0B01100000; //AVCCが基準電圧Vref=2.56V Left Adjust ADC0(PC0)
ADCSRA=0B10000110; //CK/64
while(1){
ADCSRA |= 1<<ADSC; //AD start
while(!(ADCSRA & (1<<ADIF))){} //ADCSRのビット4(ADIF)が1になるまで待つ
ad=ADCH;
PORTD |= 1<<0; //PD0セット
for(i=0;i<ad;i++){}
PORTD &= ~(1<<0); //PD0クリア
for(i=ad;i<256;i++){}
}//while(1)
}
こちらはLED調光の写真です.



2009年6月20日土曜日

ATTINY13,ATTINY25,AT90S2313

AVRの8ピンマイコンATTINY13,ATTINY25,AT90S2313を使ってみました.
AT90S2313は外部発振のみ,ATTINY13とATTINY25は,外部発振と内部発振が使えます.
ATTINY13とATTINY25は,AD変換機能を持っています.
基本的なピン配置は同じなので,同じ書き込み回路が使えます.










ただし,AVRstudio4からISPmkIIを使って書き込みをする場合,AT90S2313は
デバイスの認識ができません.(しかし書き込みはできます)
1:RESRT
2:8MHzクリスタル
3:8MHzクリスタル
4:GND
5:MOSI
6:MISO
7:SCK
8:VCC

以下はPB0,PB1,PB2にLEDを付けたフラッシャーのプログラムです.
ATTINY13,ATTINY25,AT90S2313いずれでも動きます.
#include <avr/io.h>

void wait(int x);

int main( void )
{
DDRB=0B00000111; /* PortB0,1,2を出力に設定する */

for (;;) { /* 無限ループ */
PORTB=0B00000001;
wait(10);
PORTB=0B00000010;
wait(10);
PORTB=0B00000100;
wait(10);
}
}

void wait(int x){
int i,j;
for(i=1;i<x;i++){
for(j=1;j<20000;j++){
j=j;
}
}
}

次のプログラムはtiny13AでAD変換を行い,AD変換の値に比例して
LEDを点灯(調光)します
点灯時間の調整にはタイマ・カウンタのオーバーフローを利用しています.
//tiny13A用AD変換LED出力
//AD入力ADC2(PB4),LED出力PB0
#include <avr/io.h>

void delay(uint8_t t){
TCCR0B=0B00000011;//clk/64 (64分周)
TIFR0 |= 1<<TOV0;//TOV0クリア
TCNT0=255-t;
while(!(TIFR0 & (1<<TOV0))){}//カウンタがオーバーフローするまで待つ
}

int main( void )
{
uint8_t ad;
DDRB=0B00000001; /* PB0を出力に設定する */
ADMUX=0B00100010; //VCCが基準電圧 Left Adjust ADC2(PB4)
ADCSRA=0B10000110; //CK/64

while(1){
ADCSRA |= 1<<ADSC; //AD start
while(!(ADCSRA & (1<<ADIF))){} //ADCSRのビット4(ADIF)が1になるまで待つ
ad=ADCH;
PORTB |= 1<<0; //PB0セット
delay(ad);
PORTB &= ~(1<<0); //PB0クリア
delay(255-ad);
}//while(1)
}


次のプログラムはtiny25でAD変換を行い,AD変換の値に比例して
LEDを点灯(調光)します
点灯時間の調整にはタイマ・カウンタのオーバーフローを利用しています.
//tiny25用AD変換LED出力
//AD入力ADC2(PB4),LED出力PB0
#include <avr/io.h>

void delay(uint8_t t){
TCCR0B=0B00000011;//clk/64 (64分周)
TIFR |= 1<<TOV0;//TOV0クリア
TCNT0=255-t;
while(!(TIFR & (1<<TOV0))){}//カウンタがオーバーフローするまで待つ
}

int main( void )
{
uint8_t ad;
DDRB=0B00000001; /* PB0を出力に設定する */
ADMUX=0B00100010; //VCCが基準電圧 Left Adjust ADC2(PB4)
ADCSRA=0B10000110; //CK/64

while(1){
ADCSRA |= 1<<ADSC; //AD start
while(!(ADCSRA & (1<<ADIF))){} //ADCSRのビット4(ADIF)が1になるまで待つ
ad=ADCH;
PORTB |= 1<<0; //PB0セット
delay(ad);
PORTB &= ~(1<<0); //PB0クリア
delay(255-ad);
}//while(1)
}

次のプログラムはtiny25でAD変換を行い,AD変換の値に比例して
LEDを点灯(調光)します
点灯時間の調整には非同期高速PWMを利用しています.
OCR0Aに255を代入し,カウンタのTOPとし,
OCR0BにAD変換値を代入します
//非同期高速PWM動作のテストTINY13A
//TCNT0の高速PWM動作を使う
//出力OC0B COM0B1-0:10
//BOTTOM:0TOP:OCR0A WGM02-01:111
//カウンタ分周CLK/8 CS02-00:010
//AD入力ADC2(PB4)

#include <avr/io.h>

int main( void )
{
uint8_t ad;
DDRB=0B00000010; /* PB1 OC0Bを出力に設定する */
ADCSRA=0B10000110; //CK/64
TCCR0A=0B00100011;
TCCR0B=0B00001010;
OCR0A=0B11111111;

ADMUX=0B00100010; //VCCが基準電圧 Left Adjust ADC2(PB4)
while(1){
ADCSRA |= 1<<ADSC; //AD start
while(!(ADCSRA & (1<<ADIF))){} //ADCSRのビット4(ADIF)が1になるまで待つ
ad=ADCH;
OCR0B=ad;
}//while(1)
}



2009年6月11日木曜日

maximaの使い方

Windows版maximaの使い方のメモです.
高校,大学の数学の問題はほとんどmaximaで解決してしまいます.

式を入力すると入力(%i*)に対する結果(%o*)が表示される.

Maximaでは変数への代入に:(コロン)を用いる.
a:2;
sqrt(a);

関数は()でくくる.関数の最初は小文字である.
よく使う定数
%e(自然対数の低),%pi(円周率),%i(虚数),inf(無限大)

数式の処理
たとえば x^3 + y^3;で式が記憶される.
この式の因数分解を行いたい場合
factor(%);
ここで%は直前の式をあらわす
今度は,上の結果を展開したい場合
expand(%);
でもとに戻る

式の通分
ratsimp(1/(x+1)+2/(x-1));

方程式の解法
solve(4*x-1=0,x);
solve(a*x^2+b*x+c=0,x);
solve([x-4*y=-2,2*x+y=5],[x,y]);

関数の極限
limit((1+1/x)^x,x,inf);

式の微分
x^3-4*x^2+exp(-x^2)+sin(2*x);
diff(%,x);

微分方程式
atvalue(x(t),t=0,A);初期条件
atvalue(diff(x(t),t),t=0,0);初期条件
desolve(m*diff(x(t),t,2)=-k*x(t),x(t));
Is k*m positive, negative, or zero?と聞かれたら
positive;
などと入力する.
plot2d(式,[変数,開始,終了]);で結果をグラフ表示することも可能である.
plot2d(x^2,[x,-2,2]);

式の積分
1/x-4*x^2+exp(-x)+sin(2*x);
integrate(%,x);
定積分
integrate(exp(-x^2),x,0,1);
integrate(4/(1+x^2),x,0,1);

式の値を数値で与えるには
float(a);

桁数を指定する場合
fpprec:n;
bfloat(a);

fpprec:20;
bfloat(%pi);

複素数の絶対値と偏角
z:(1 + %i)/sqrt(2);
cabs(z); (絶対値)
carg(z);偏角 (argument)

行列演算
v1:[1,0,2]; (ベクトルの定義)

A:matrix([1,4],[2,-1]); (行列の定義)
Y:matrix([-2,5]);
invert(A).Y; (逆行列)

行列の演算
A.B (積)
A^3(累乗)
determinant(A);(行列式)

固有値
load(eigen);
eigenvalues(A);

固有ベクトル
load(eigen);
eigenvectors(A);


行列の固有値と固有ベクトルが条件を満たすか確認する.
A:matrix([3,-5,-5],[-1,7,5],[1,-9,-7]);
load(eigen);
eigenvectors(A);
 [[[-2,2,3],[1,1,1]],[1,-1,2],[0,1,-1],[1,-1,1]]
固有値,重複数,ベクトルの順に表示される

固有値-2に対する固有ベクトルがB:[1, -1, 2];のとき
A.B;と-2*B;が同じ結果になることが確認できる.

グラフ描画
plot2d(sin(4*x),[x,-5,5]);
plot2d([sin(4*x),exp(-x^2)],[x,-2,2],[y,-4,4]);


(媒介変数表示)
plot2d([parametric,cos(t),sin(2*t)],[t,0,2*%pi]);
標準では媒介変数を10の領域に分割していて,[nticks,*]でグラフが荒いので分割数を増やす.
plot2d([parametric,cos(t),sin(2*t)],[t,0,2*%pi],[nticks,100]);
plot3d(exp(-(x-2)^2-y^2)+exp(-(x+2)^2-y^2),[x,-5,5],[y,-5,5]);
plot3d(exp(-(x-2)^2-y^2)+exp(-(x+2)^2-y^2),[x,-5,5],[y,-5,5],[grid,100,100]);
plot3d([cos(x)*cos(y),sin(x)*cos(y),sin(y)],[x,0,2*%pi],[y,-%pi/2,%pi/2]);

関数の定義
f(x):=x^2*sin(x);
plot2d(f(x),[x,-5,5]);

値のクリア
kill(all);

2009年6月2日火曜日

動画や音声の保存

動画や音声の保存に関するメモです

Youtubeで動画を保存する方法
ブラウザにFirefoxをインストールする.
続いてEasy YouTube Video Downloader 1.1をアドオンとしてインストールする.
FirefoxからYoutubeを開くと,mp4などのフォーマットで動画をダウンロード(保存)できます.

PCの外部入力から音声をmp3として保存する
超録(フリーウェア版)をインストールします
インストール後フォルダにlame_enc.dllを入れるとmp3で録音できます.
ラジオや色々なオーディオのmp3録音ができます.

CDからmp3作成
昔はCDからmp3ファイル作成は結構大変でした.
現在ではMediaPlayerの10以降を使えば,CDからmp3の作成ができます.
まずMediaPlayerを右クリックしクラシックメニューの表示にすると,ツールバーが現れます.
ツールのオプション「音楽の取り込み」で保存先とmp3の設定を行います.
あとはCDを入れて取り込みボタンを押せばOKです.

動画からmp3を抽出する
フリーソフトMediaCoderをインストールします
MediaCoderを立ち上げます
○.mp4ファイルをMediaCoderにドラッグします
Audioタグの設定はそのままで,VideoタグでEnableVideoをoffにします.
StartTranscodingで○.mp3ファイルが出来上がります.
またAnyAudioConverterもフリーソフトで,簡単に動画からmp3を抽出することができます.

mp3とwma
FM放送などを録音しておいて後で聞きたいけど,音質は求めない.
32kbpsで録音した場合,私の聞いた感じではmp3よりもwmaの方が高音質で,
mp3は聴くのが辛い,wmaはそれなりに聴けるという感じでした.

2009年3月16日月曜日

PSoC最初の一歩

PSoCEvalを用いたPSoCの使用方法についてまとめてみました.
実行までの手順
(1)PSoC DesignerとPSoC Programmerを入手し,PCにインストールする.
(2)PSoC Designerを立ち上げて,プロジェクトを開き,デバイスを配置する.
(3)ソースプログラムを記述し,Generate/Buildする.
(4)PSoCEvalをPCに接続する.PSoC Programmerでビルドしたプログラムをダウンロードする.
(5)PSoC ProgrammerでPSoCEvalに電源を投入すれば,PSoCが動く.またはPSoCEvalからPSoCを取り外し,回路を組んで電源を投入する.

(CY8C24123Aの書き込みについて)
PSOCEVALで8ピン24123Aに書き込むには,ボードに24123Aをさして
24123AとPSOCEVALを付属の赤ケーブルで以下のように接続する
3(I2CSCL)-P11
4(VSS)-GND
5(I2CSDA)-P10
8(Vdd)-VCC
8ピン24123AではXRESは無接続となる

(PSoCEval Kitを使わずMiniProgだけで書き込み,実行を行う)
MiniProgとPSoCを以下のように接続してください.
カッコはピン番号です.
MiniProg:PSoC(CY8C27443)
VDD:Vdd(28)
GND:Vss(14)
XRES:XRES(19)
SCLK:P1[1](13)
SDATA:P1[0](15)
MiniProgから電源が供給(5V)されますので,PSoC側に電源は不要です.
24123Aのような8ピンPSOCを使う場合,XRESは無接続となります

(簡単なサンプルLED点滅)
PWMを使ってLEDを点滅させる例を使って説明をします.
(1)PSoC Designer,PSoC Programmerのインストール
PSoC DesignerはPSoCのプログラム開発のソフトで,PSoC Programmerはプログラム書き込みと実行のためのソフトです.いずれもCYPRESSのサイトからPSoC DesignerとPSoC Programmerを無料でダウンロードできます.現在はCコンパイラーもPSoC Designerに含まれています.
(2.1)PSoC Designerを立ち上げて,プロジェクトを開く
PSoC Designerを立ち上げてプロジェクトを開いてください.また使用するPSoCチップを選択してください.ここではCY8C27443-24PXI を使います.また使用言語はCを選択してください.
(2.2)デバイスを配置する
画面の左が入力端子,右が出力端子,中央上部がデジタルデバイス,中央下部がアナログデバイスの領域です.今回は16ビットPWMを利用してLEDを点滅させます.デバイスリストの中からPWM16を選んでダブルクリックしてください.デジタルデバイス領域に2つのデバイスが配置されたはずです.(8ビットPWMは1デバイスですが,16ビットPWMは2デバイスです)
16ビットPWMの設定を行います.
例えば,Clock:CPU_32_KHz,Enable:High,Period:20000,
PulseWidth:10000,CompareType:Less Than
としてCompareOutの出力を,Port2_0などのピンにつなげます.
続いて16ビットPWMの出力結果が出力ピンにつながるよう配線を行います.

(2.3)ソースプログラムを記述する
WorkSpaceExplorarの中にプロジェクト名のフォルダがありその中にSourceFilesというフォルダ
がありその中にmain.cがあります.
main関数の中に以下の記述を追加します.
main(){
PWM16_1_Start();

つまりデバイス名_Start();の命令によってデバイスが動きます.

(2.4)プログラムをビルドし書き込む
ソースを記述したらGenerate/Build XXX Projectをクリック
ビルドが成功すればXXX.hexができるので,PSoC Programmerを起動し
PSoCにXXX.hexを書き込む.
PSoC Programmerの電源ボタンをクリックすれば,MINIProgに電源が投入され,PSoCが動くはずです.

(注意)PSoCEvalにPSoCがしっかり刺さっていないと,動きません.
時々PSoC Programmerで書き込みができない場合があります.USBをいったん外して,付け直すとうまくいくことがあります.

(PsoCで液晶表示)
以下はPsoC CY8C27443で液晶に文字を表示させる方法です
LCD(液晶)のモジュールを追加し,
PropertyでNameをLCDに,LCDPortをPort2にしてください.
Generate Configrationfilesして,
ソースコードを下記のように書き加えて,Buildしてください.

#include <m8c.h>
#include "PSoCAPI.h"


void main(){

LCD_Start();
LCD_Position(0,0);
LCD_PrCString("Hello");
LCD_Position(1,0);
LCD_PrCString("PsoC");

}

テストボードを使わずに,単独でプログラムを実行するときは
PsoCとSC1602BSを下記のように接続にして下さい.
PsoC側:LCD
Vss[14]:GND,VLC
Vdd[28]:Power
P2[0]:DB4
P2[1]:DB5
P2[2]:DB6
P2[3]:DB7
P2[4]:E
P2[5]:RS
P2[6]:R/W
液晶のコントラスト調整が不要であれば,VLCは,GNDと接続して構いません.
DMC16117Aなどのように8文字目,9文字目のアドレスが不連続な液晶モジュールは,
1から8文字,9から16文字を分けて表示する必要があります.
9文字目のアドレス0X40に飛ぶため,以下のようにDDRAMアドレスセットが必要です.
LCD_Control(0B11000000);//DB7=1
LCD_PrCString("90123456");


(PsoCでシリアル通信その1)
パソコンとRS232Cで通信を行い液晶に表示するサンプルプログラムです
XBEEを使えば,無線通信も問題なく行えます.
UARTとLCDを配置する
LCDのポート設定を忘れずに(PsoCEvalの場合Port2)
UARTの入力クロックはシリアル通信のビットレートの8倍に設定する.
9600の場合24MHz/2/156=76923(9600×8)
cReadChar()はシリアルの受信がない場合0を返します

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
//UARTのプロパティでClockの設定をする必要がある
//デバイスやクロックの設定を変えた後は必ずGenerate Configuration Filesを行うこと
//テストボードではTx,RxとP02,P03をケーブルでつなげる
//WriteData()でLCDに文字の出力を行う
void main()
{
char ch;
LCD_1_Start();
UART_1_Start(UART_1_PARITY_NONE);
UART_1_CPutString("Hello");
while(1) {
ch=UART_1_cReadChar();
if(ch>0){UART_1_PutChar(ch);LCD_1_WriteData(ch);}
}
}

(PsoCでシリアル通信その2)
PsoCEvalを使ってパソコンとRS232Cで通信を行うサンプルプログラムです
UARTのデータシートを参考にしました
/*

シリアル通信のテストプログラム(PCで入力した文字の次の文字を返す)
PCのボーレートは19200とした

UARTのプロパティでClockはボーレートの8倍に設定する
19200の場合24MHz/156/8=19231Hz

PsoCEvalのテストボードでTxRxとP00P01をケーブルでつなげる

*/

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
void main()
{
char * strPtr; // Parameter pointer
//init
UART_1_CmdReset();
UART_1_IntCntl(UART_1_ENABLE_RX_INT);
UART_1_Start(UART_1_PARITY_NONE);
M8C_EnableGInt;
// Get and Send
UART_1_CPutString("Hello Psoc\r\n");
while(!(UART_1_bReadTxStatus() & UART_1_TX_BUFFER_EMPTY));

while(1) {
if(UART_1_bCmdCheck()) { // Wait for command
if(strPtr = UART_1_szGetParam()) { // More than delimiter?
UART_1_SendData(*(strPtr)+1);
while(!(UART_1_bReadTxStatus()& UART_1_TX_BUFFER_EMPTY));
UART_1_PutCRLF();
}
UART_1_CmdReset(); // Reset command buffer
}
}
}








(16ビットカウンターと割り込みで1秒ごと動作)
1秒ごとに液晶表示を変えます
Counter16とLCDを配置する.
Counter16_1
Enable:High
Clock:32kHz
Period:31999
InterruptType:TerminalCount
LCD_1
LCDPort:Port_2
Counter16のクロックに32kHzを使ってみました.
32kHz/(Period+1)=1Hzで割り込み発生
設定が終わったら
Generate Configuration Files for 'xxx' Projectします.
続いて
¥lib¥Library Source files¥Counter16_1INT.asmファイルの
デバイス名_ISR:とretiの間に
ljmp _myISR
の行を加えます.

main.cを書き換えBuld 'xxx' Projectします.
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
int TimeCount = 0;
#pragma interrupt_handler myISR
void myISR()
{
TimeCount++;
LCD_1_Position(0,0);
if(TimeCount%2==0)LCD_1_PrCString("Hello");
else LCD_1_PrCString("PSoC ");
}
void main()
{

LCD_1_Start();
M8C_EnableGInt;
Counter16_1_EnableInt();
Counter16_1_Start();
while(1){};

}

myISRの名前は変えても実行可能ですが,
○○INT.asmとmain.cの中の名前を統一してください.

(一定時間待つ Delay)
CypressのサイトでDelay Functionsのルーチンが公開されています.
リンク先は変わるかもしれないので"Delay Functions cypress"で検索して探してください.
void Delay50u(void) 50μsec待つ
void Delay50uTimes(BYTE Multiple) 50μsec×引数の時間待つ
void Delay10msTimes(BYTE TenMsTimes) 10msec×引数の時間待つ
使い方
Cypressのサイトからdelay3.zipをダウンロードし展開する.
“Project >> Add File”メニューで“delay.asm”と “delay.h”を追加する.
main.cに“delay.h”を追加する.
#include <delay.h>

(GPSロガー)
PSoC(24123)で一定時間間隔でGPSデータをpagewriteでEEPに書き込みます.
GPSモジュールが測地に成功している時にLED(P05)を表示します.
またGPS-52を使う場合,測地系をWGS-84に変更しています.
電源は単3×3を使っています.
EEPに記録されたWGS-84データは,GoogleMapでN36 XX.XXXX,E140 XX.XXXX
のように入力すれば地図上で確認できます.
またkmlファイルのcoordinates部分に緯度経度情報を連続して書いていき,
googleearthで開けば,経路が地図上に表示できます.
Tx:P03,Rx:P02
5V 24MHzSysClk CPU=SysClk/8
VC1=SysClk/8, VC3=VC1/39 VC3をUARTへ(9800bps)








#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#define AD 0x50 //Adress of EEP


void main(void)
{
unsigned char c1,c2,a[34],j;
unsigned int i,add=0;

UART_Start(UART_PARITY_NONE);
I2Cm_Start(); // Initialize I2C Master interface
for(j=0;j<50;j++)for(i=0;i<30000;i++){}

UART_CPutString("$PSRF106,21*0F\r\n");//Change WGS-84 (GPS-52)
while(1){
while(1){ //"GA"の文字列を見つけるまで待つ
c2=UART_cGetChar();
if(c2=='A' && c1=='G')break;
c1=c2;
}//while()
UART_cGetChar();
for(j=2;j<6;j++)a[j]=UART_cGetChar();//hhmm
for(j=0;j<7;j++)UART_cGetChar();
for(j=6;j<17;j++)a[j]=UART_cGetChar();
UART_cGetChar();
for(j=17;j<34;j++)a[j]=UART_cGetChar();

if(a[30]=='1')PRT0DR|=(1<<5); //Catch Satellite LED P0_5
else PRT0DR&=~(1<<5); //LED off
a[0]=add/256;//Address of EEP
a[1]=add%256;//Address of EEP
I2Cm_bWriteBytes(AD,a,34,I2Cm_CompleteXfer); //Write EEP
add+=32;

for(j=0;j<50;j++)for(i=0;i<30000;i++){}
}//while
}