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

このブログを検索

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

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
}