SSブログ

PSoCでマイクロステッパー 発見 [PSoC]

PSoCでマイクロステッパーが動作させられるのを発見。

ユニポーラも出来ちゃう。

PICでも出来るはずですが、回路やアキテクチャ、トポロジーが結構ややこしい。

AVRならPWMが変則、アナログコンパレータが2ch必要・・と言うことで

当面はPSoCでやってみましょう。


コメント(0) 

レリーズリモコン [PSoC]

PSoC CY8C24123A24PXI PDIP でレリーズリモコンの 状態遷移図を書いてみました。

此処に来るのに長い道のりでした。

WS000307.JPG

WS000308.JPG

http://nonnno.hobby-web.net/html/r_r_PSoC.html

(此処のブログでは書き込むことが出来なかったので上記に過程の画像を載せました)

タイマーを1ms+Nの形に書き換えました。

これでスタートするとき1ms以内に収まるはずです。

(こんなにしないといけないなんてドンクサイですね)


コメント(1) 

E2PROMルーチンテスト [PSoC]

チップデザインで「E2PROMtest」というプロジェクトを作り
C言語を選んで、CY8C27443-24PXIのデバイスを使います。
ユーザーモジュールから「E2PROM」をドラッグドロップして、
ジェネレートビルド「F6」をクリックしますと、
E2PROM_1.asm と E2PROM_1.h が出来ます。
(main.c E2PROMtest.lst E2PROMtest.map も)
他もできますが、これらが重要と思われます。
結果は次です。
ROM 2% full. 349 bytes used (does not include absolute areas).
RAM 0% full. 1 bytes used (does not include stack usage).
E2PROMtest - 0 error(s) 0 warning(s) 12:29:48

あとは main.c に必要な動作を書き込み、
再度ジェネレートビルド「F6」しますと、
再び書き換わってファイルが作られます。
(私は本体プログラムの書き方が得意ではありません)

同じように「E2PROMtestA」として、
アセンブラを選びますと main.asm が出来ることが違うだけで
似た結果になりました。
ROM 2% full. 349 bytes used (does not include absolute areas).
RAM 0% full. 1 bytes used (does not include stack usage).
E2PROMtestA - 0 error(s) 0 warning(s) 12:56:31

生成されたファイルは再ビルドする事として、zipに変換して
http://ee.uuhp.com/~apollo21/E2PROMtest/
にUPしました。

コメント(0) 

PSoC main.c [PSoC]


へんてこりんな駆動回路とタイマーを割り算に結んで、TX8SWに出すべく書いてみました。
こんなんで合っていますか?

//-------------------------------------------------------------------
// C main line
//-------------------------------------------------------------------

#include // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#include "unsigneddivisionAPI.h"

//BYTE = char ;
//WORD = int ;

const unsigned char bPeriod = 0;//定数型宣言,初期化
const unsigned int wPeriod = 0;
unsigned char ModeStatus = 0;
unsigned int warare = 0;//変数型宣言
unsigned int waru = 0;
unsigned int kekka = 0;
unsigned int amari = 0;
unsigned char endf = 0;
unsigned char endf1 = 0; //test
unsigned char endf2; //test
//BYTE ltv;
//unsigned char ltv;
//unsigned char bCounter;
//unsigned int wCentroid;

BYTE bCounter;
WORD wCentroid;

#pragma interrupt_handler CMP_1_INT
void CMP_1_INT(void)
{
if(CMP_CR0_COMP0)
{
if(ModeStatus == 0)
{
ModeStatus = 1;
}
}
else
{
ModeStatus = 0;
}
}

#pragma interrupt_handler CMP_2_INT
void CMP_2_INT(void)
{
if(CMP_CR0_COMP1)
{
if(ModeStatus == 2)
{
ModeStatus = 3;
}
}
else
{
ModeStatus = 2;
}
}

void transdat(void)
{
if(endf)
{
TX8SW_1_CPutString("divisor");
wCentroid = warare;
TX8SW_1_PutSHexInt(wCentroid);

TX8SW_1_CPutString("/*32 dividend");
wCentroid = waru;
TX8SW_1_PutSHexInt(wCentroid);

TX8SW_1_CPutString("=result");
wCentroid = kekka;
TX8SW_1_PutSHexInt(wCentroid);

TX8SW_1_CPutString("%residue");
wCentroid = amari;
TX8SW_1_PutSHexInt(wCentroid);
endf = 0;
}
else
{
}
}

void calcdat(void)
{
Timer16_1_Stop();

divisor = Timer16_1_wReadTimer();
warare = divisor;
dividend = 32*Timer8_1_bReadTimer();
waru = dividend;

Timer8_1_WritePeriod(bPeriod);//初期値
Timer16_1_WritePeriod(wPeriod);//初期値
Timer16_1_Start();//測定始め

// div16( dividend, divisor);//ここから*.hを呼び出す手続き、変数型は書かない
ltv = div16( dividend, divisor);//ここから*.hを呼び出す手続き、変数型は書かない
// if(RETA == 0)THEN"ERR"
kekka = dividend;//代入式で戻り数を貰う
amari = remainder;
endf = 1;
transdat();
}

void modemov(void)
{
switch(ModeStatus)
{
case 3: //逆振り
{
DL_N_On();
Timer8_1_Start();
}
break;
case 0: //下振り
{
DL_N_Off();
// DH_P_Off();
Timer8_1_Stop();
}
break;
case 1: //正振り,測定終わり
{
DH_P_On();
Timer8_1_Start();
}
break;
case 2: //上振り
{
// DL_N_Off();
DH_P_Off();
Timer8_1_Stop();
calcdat();
}
break;
// default: ;
// break;
}
}

void main(void)
{

M8C_EnableIntMask(INT_MSK0, INT_MSK0_ACOLUMN_0|INT_MSK0_ACOLUMN_1);

AMUX4_1_Start();
AMUX4_2_Start();
CMP_1_EnableInt();
CMP_2_EnableInt();
CMP_1_Start();
CMP_2_Start();

EzI2Cs_1_EnableInt();
EzI2Cs_1_Start();

LED_1_Start();
LED_2_Start();
LED_3_Start();
LED_4_Start();

DL_N_Start();
DH_P_Start();
// TX8_1_Start(TX8_1_PARITY_NONE);
// PWM8_1_Start();
M8C_EnableGInt;
// TxString(theStr1) ; //Opning Mes.
// TX8SW_1_Start();
// TX8SW_1_CPutString("Sending_Message\0");

while(1)
{
modemov();
// calcdat();
// transdat();

}

}

コメント(0) 

PSoC ソース修正 [PSoC]

Cypressさんから回答を頂きました。

「main.c」
endat = div16( dividend, divisor);//式で戻り数を与え、ここから直接asmを呼び出す、変数型は書かない、ここから直接asmを呼ぶ
「unsigneddivisionAPI.h」//(関数と変数型定義だけ)
unsigned int div16(unsigned int,unsigned int);//戻り数つきで変数型宣言、関数宣言をする
「division.asm」
export div16//Cからの呼び出し点
export _div16//asmの場合はアンダーバーつき群も用意する、これによりmainから直接呼び出す
//そのほか呼び出される、返す変数もアンダーバー付無しを記載する。
//呼び出しラベルも同じ。
_div16://asmにアンダーバーつきラベルも用意する
div16:
これが標準だそうですが、「algorithm___unsigned_division_routines___an2101_12.pdf」ライブラリには書いてなかった。
(division.asm)
しかし、まだワーニングがでています。
C:\PROGRA~1\Cypress\Common\CYPRES~3\tools\make: *** Warning: File `略~1\memory.inc' has modification time in the future (2010-08-12 21:35:54 > 2010-08-12 21:35:52)
前のリストとの違いを追って見ます。






コメント(9) 

PSoC 小まとめ [PSoC]

================================
PSoCデザイナーでの言語文法
個別ファイルの追加は

ワークスペースエクスプローラ内
プロジェクトホルダを右クリックしてファイルを加えると
適正な場所に配置される。

C言語 と アセンブラのリンク
================================
C言語は「*.c」のファイル名、
あるいは定義部分をまとめた「*.h」で構成される。

「*.h」はインクルードされた部分に、
文字として書かれたと同じ効果を持つ。
「#include "PSoCAPI.h" // PSoC API definitions for all User Modules」
================================
関数定義は、1つの戻り数と複数の引数を持つことができる。
戻り値、引数がない場合は「void」と表記する。
関数宣言の最後に「;」を付けない。
「{」で始まり
記述中の関数呼び出しの最後は[;]で終わる。
戻り数を求めるには、(戻り式)を記述する。
「return 戻り数;」にする。(戻り数は受け取りレジスタ名でもある)
あるいは2つの戻り数を求める場合、
「受け取りレジスタ名2 = 戻り数2;」を return の前に置く。
「}」で段落または終わりとする。

関数宣言
「{」

(または、戻り式)
「}」
================================
C言語から 計算をする場合 
「math.h」に計算定義が書かれていて
計算式を呼び出すだけでよい、
なお、変数は以前にどこかで型を定義してあるはずであるから
型の再定義はしない。
(定義していない場合は式より手前に必要)
普通は次の形であり複数の式も持てる。

関数宣言
「{」

(または、戻り式)
「}」
================================
C言語から ライブラリを呼び出して計算する場合、
「arith.h」にライブラリ定義がしてあり、
その名前を使って呼び出せる。
この時の記述方式はC言語そのものである。

関数宣言
「{」

(または、戻り式)
「}」
================================
C言語から アセンブラを呼び出して計算する場合、
「unsigneddivisionAPI.h」にライブラリ定義がしてあり、
その名前を使って呼び出せる。
この時の記述方式はインラインアセンブラであり
C言語そのものである。

関数宣言
「{」
アセンブラ記述を
「asm("lcall ラベル名");」で囲み
「}」 で終わる。
アセンブララベル名に「_」が無い場合は
「_ラベル名」では呼び出せない。
================================
インラインアセンブラファイルは 本来C言語であり 
「*.c」あるいは、定義部分をまとめた「*.h」のファイル名を持つ。
記述規則はそれに従う。
アセンブラによく似た書き方と働きをする。

関数宣言
「{」
アセンブラ記述を
「asm("」と「");」で囲み
「}」 で終わる。
(途中に普通のC言語記述を挟むことは出来るか?不明)
================================
アセンブラ、「*.s」または「*.asm」のファイル名にする。
ラベル名の前に「_」アンダーバーを付ける(ただしなくても良いか不明)
インクルード
「include "m8c.inc"」
外部参照を定義
「export 関数」
「export 引数」
「export 戻り数」
内部使用変数エリアを定義
「area bss(RAM)」

dividend: BLK 3 ;reserve 3 bytes for dividend
divisor: BLK 3 ;reserve 3 bytes for divisor
remainder: BLK 3 ;reserve 3 bytes for remainder
lcount: BLK 1 ;loop counter
temp: BLK 3 ;reserve 3 bytes for temporary register

「area text(ROM,REL)」
始まり
ラベル
div16:
mov [remainder+0],00h ;clear Remainder
*
ret
終わり
================================
WS000146.JPG
コメント(15) 

PSoCの不思議 [PSoC]

PSoCデザイナーは不思議2
C言語からアセンブラの割り算をする・・のに挑戦してみました。
結果は、アセンブラの特徴アンダーバー「_」の使用が不明確でした。

また戻り数が理解できていないため、数値を受け取れませんでした。

デザインにはシステムデザインとチップデザインがありそれ以外に
C言語またはアセンブラの直接書き込みによる方法があります。

CY8C21534は非力と思われそうですが、なかなかどうして隠された機能もあるようです。
コンパレータを正規でない使い方をして、割り算に失敗した見本を次ぎにUPしておきます。
http://ee.uuhp.com/~apollo21/pez_div/
以下にあるファイルは合計120KBくらい圧縮してあります。
デザイナーで開いて下さい。

追加
「>別の所には Result Remainder [dividend+1,0][remainder+1,0]とも書かれています。
というのはどこの何のファイルを指されていて,一体何をどうされたいのかわかりませんが,
Cのライブラリ関数であればあくまでもコンパイラが生成する
コードの中で利用するための物ですから、直接呼ぶのは
コンパイラが生成したコードや先ほどのマニュアルの内容が
読みきれる位になるまでは避けた方が賢明だと思います。

どこからか持って来たものであるということでしたら、使い方に
ついては持ってきた先に尋ねられるのが早道ではないでしょうか?」

と言うお返事を戴きまして
「一応cypressのC言語マニュアルとアセンブラマニュアルにしたがったつもりなんですが、読解力がないため見分けられませんでした。
マニュアルを翻訳してよく読んでみます。

また持ってきた先cypressにも聞いてみます。
有り難うございました。」

その後ソースを沢山読んでいるうちに、正解らしいところに行き当たりました。

「Assembly Language Guide」
System Supervisor Call

「C Language Compiler User Guide」
Interfacing C and Assembly
Pragma Fastcall16 Conventions for Argument Passing
Pragma Fastcall16 Conventions for Return Value

これらが関係していました。
決め手は**
WS000147.JPG
別途 マニュアルhの日本語化
googleの翻訳があります。
ttp://www.google.co.jp/language_tools?hl=ja
ウェブページを翻訳するに次を入れます。
ttp://www.cypress.com/?rID=35428
すると次のページになって
ttp://translate.google.co.jp/translate?u=http%3A%2F%2Fwww.cypress.com%2F%3FrID%3D35428&sl=en&tl=ja&hl=&ie=UTF-8
(URLが違う場合もあります)
ここから目的をクリックしますと
「PDF」が「htm」で読めます。
これを 名前を付けてページを保存とかにしますと和訳htm文書になります。
何かのエディターで開いて「href="」を「コピー」しておいて探し、次の「href="」
を通り越し「#」「"」の手前までをドラッグ、貼り付けしますと不要なURLが消えます。

不要 有用 」も
不要 」を消せば英文が重なりません。

コメント(3) 

PSoCマイコンスタートアップを使ってみて [PSoC]

「PSoCデザイナー」を使ってみました。

CY8C21534を使って
「8-8システムレベルデザインによるプロジェクトの作成」をしています。

p108から始めて見本どおりに組み付けて行きますと、
インプット>キャップセンス>キャップセンスCSD>ボタンCSD「CSD_Btn」「CSD_Prop」

アウトプット>ディスプレー>LED>シングルカラー>ON/OFF「LED」

トランスファーファンクションバリエーター>?テーブルルックアップ
でしたが、実際には
>プライオリテイエンコーダ「Varuator」 を
選ぶと組み付が出来ました。

プロジェクト>アサインレジスタマップ(別のプロジェクト名)
8-29図どおりに配置して、
ビルド>CY8C21534を選んで オートPINアサイン でGO
ノーエラー・ノーワーニングで出来たのでピンアウトとチップデザインを確認、
此処で「システムデザイン>BOM」 と 「チップデザイン>ピンアウトSOC」の内容が合っていません。(いずれは合致するのでしょうか?)

UARTを使ったチューニングのためUARTソフトモジュールの追加。
チップデザイン>ユーザーモジュール>TX8SW>右クリックでプレース
TX8SW_1 右クリックプロパティーで「TX8SW」にリネーム(そういえばweb上のソースにはTX8SW_1も有りました)、ポートピンを 「P1_4」に設定。

リビルド(F7の下)をしますと1ワーニングに成りましたので、ジェネレートビルド(F6)をしますとノーワーニングになりました。
(此処はどの様に使い分けるのでしょうか?)
相変わらず 「BOM と SOC」 は合っていません。

もう一度システムデザインに戻り、
アウトプット>PWM>
バリアブルフリケンシー・バリアブルデューティー・ハイサイド10mA「PezDrive」 と
アウトプット>ディスプレー>LED>シングルカラー>ON/OFF「TestLED」
追加しました。
システムデザインはこの様な感じで
WS000043.JPG
このピン配置
WS000047.JPG
部品表
WS000046.JPG
配線図
WS000045.JPG
チップデザイン
WS000044.JPG
ピンアウト これは 上記の分と 同期が取れていない感じです。
WS000042.JPG

コメント(0) 

ディジタルブロック [PSoC]

「CY8C24423A-24PXI」のディジタルブロックを組み付けてみます。
ディジタルブロックには 接続線として
入力 グローバルインプット から ローインプットに
GIO、GIE 各8と GIOØ~GIO7、GIEØ~GIO7 の16
RIØ[Ø] GIEØ、GIE4、GIOØ、GIO4 いずれかに
RIØ[1] GIE1、GIE5、GIO1、GIO5 いずれかに
RIØ[2] GIE2、GIE6、GIO2、GIO6 いずれかに
RIØ[3] GIE3、GIE7、GIO3、GIO7 いずれかに
などに接続して ヒステリシスを持たせて
ローインプット内部バスに接続します。

この入力は 外部ピンに接続できます。
GIOØ P1_Ø
GIO1 P1_1
GIO2 P1_2
GIO3 P1_3
GIO4 P1_4
GIO5 P1_5
GIO6 P1_6
GIO7 P1_7
GIEØ PØ_Ø P2_Ø いずれかに
GIE1 PØ_1 P2_1 いずれかに
GIE2 PØ_2 P2_2 いずれかに
GIE3 PØ_3 P2_3 いずれかに
GIE4 PØ_4 P2_4 いずれかに
GIE5 PØ_5 P2_5 いずれかに
GIE6 PØ_6 P2_6 いずれかに
GIE7 PØ_7 P2_7 いずれかに
**********************************************
出力側
RIØ[Ø] GOOØ
RIØ[1] GOO1
RIØ[2] GOO2
RIØ[3] GOO3

出力 グローバルアウトプット の接続

ローインプット ローアウトプット
RIØ[Ø] か ROØ[Ø] を選択 して Aとして
ROØ[1] を Bとして
A、B、¬A、¬B、A∧B、¬(A∧B)、A∧¬B、¬A∧B、A∨B、¬(A∨B)、
A∨¬B、¬A∨B、¬(A∧B)∧(A∨B)、(A∧B)∨¬(A∧B)、TRUE、FALSE
の論理を選び グローバルアウトプット
GOOØ、GOO4、GOEØ、GOE4 どれでも任意に 出力します。

同じように
RIØ[1] か ROØ[1] と ROØ[2] で 論理を選んで GOO1、GOO5、GOE1、GOE5のどれでも任意に 出力します。
RIØ[2] か ROØ[2] と ROØ[3] で 論理を選んで GOO2、GOO6、GOE2、GOE6のどれでも任意に 出力します。
RIØ[3] か ROØ[3] と ROØ[1] で 論理を選んで GOO3、GOO7、GOE3、GOE7のどれでも任意に 出力します。

この出力は 外部ピンに接続できます。

GOOØ P1_Ø
GOO1 P1_1
GOO2 P1_2
GOO3 P1_3
GOO4 P1_4
GOO5 P1_5
GOO6 P1_6
GOO7 P1_7
GOEØ PØ_Ø P2_Ø いずれかに
GOE1 PØ_1 P2_1 いずれかに
GOE2 PØ_2 P2_2 いずれかに
GOE3 PØ_3 P2_3 いずれかに
GOE4 PØ_4 P2_4 いずれかに
GOE5 PØ_5 P2_5 いずれかに
GOE6 PØ_6 P2_6 いずれかに
GOE7 PØ_7 P2_7 いずれかに

更に次の選択をします。
接続名
アナログインプット
デフォルト
GIE_(N) GIO_(N)
GOE_(N) GOO_(N)
スタンダードCPU

状態
ハイZ
ハイZアナログ
オープンドレンハイ
オープンドレンロー
プルダウン
プルアップ
ストロング
ストロングスロー

割り込み
禁止
落ちる
上がる
読んだときの変化

他には 
コンパレーターバスØ
コンパレーターバス1
アナログバスØ
アナログバス1 
アナログバフØ PØ_3
アナログバフ1 PØ_5
ローブロードキャスト ディジタルブロックに接続できる
が有ります。
WS001006.JPG

アナログブロック [PSoC]

「CY8C24423A-24PXI」のアナログ回路を組み付けてみます。
取りつけたい能力は

外部リファレンスが可能で、内部で計算したアナログ電圧と
外部モニターのアナログ電圧を比較して
外部スイッチを一定時間停止する回路です。

上記条件で
速度の点で「MDAC6」を選び、
コンパレーターとしてCTブロックを探しますと2入力
コンパレータに使えそうなデザインは見つかりません。
SCブロックで一番近そうなのは基本SCBLOCKに値を
設定してコンパレータに出来るかですが、一応出来ると仮定して
進めてみます。
他には外部モニターのアナログ電圧が0~1vと小さめなので
これを4倍して0~4Vとする「PGA」も組み付けておきます。

ブロックダイアグラムには表示されない素子には
「ワークスペースエクスプローラ」には表示される
「LED」「シャドーレジスタ」「AMUX4-1」
等があります。

WS001037.JPG

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。