PSoCプログラミング・メモ

by K.I

Index


概要

CypressのPSoCのプログラムのメモ。気が付いたこと、分かったことを書き留めておこう。
[top]

関数

数値→文字列変換

普通はsprintfとか使って、あまり考えずに出来るが、ここらへんのライブラリは未だ完全じゃないみたいだ。 ちょっと面倒だなぁ。フォーマットも出来ないし。あとstdlib.hのincludeが必要。

LCD数値表示マクロ

#include <string.h>
#include <stdlib.h>
//---- 右詰めn桁10進出力マクロ(出力幅8文字まで)
//----  テンポラリで16文字分のバッファを使用します
#define lcd_print_d(buf,n,data) do {                    \
        cstrcpy((buf),"                ");              \
        itoa((buf)+8,(data),10);                        \
        LCD_1_PrString((buf)+8-(n)+strlen((buf)+8));    \
} while(0)

printf(090406追記)

テーブル

M8Cはハーバードアーキテクチャなので、プログラムメモリとデータメモリが分かれている。 プログラムでは、テーブルを良く使うが、書換える必要がない固定のテーブルは結構良く使われる。この場合はデータメモリは勿体無いので、プログラムメモリ上に置いた方が良い。
        const int table[] = { 1, 2, 3, 4, 5 };
        const char ctable[] = "0123456789ABCDEF";

1あまり聞かない関数だなぁ。atoiとかは良く使うけど。
2それに冗長だ。。。
3所詮、1チップマイコンなので欲張らないように。。
4const指定が無い場合はデータメモリ上にStringが配置されるはずだが、これはもしかすると間違ってるかもしれない。(061105追記)

[top]

I/Oポートの操作

間違って理解してるかもしれないけど。。。

PORTxDMx

汎用I/Oポートのモード設定
DM2 DM1 DM0 Mode Drive
0 0 0 Hドライブ、Lは抵抗ドライブ Pull Down
0 0 1 H、Lともドライブ(通常は出力モード) Strong
0 1 0 High-Z(通常は入力モード) High Z
0 1 1 Hは抵抗ドライブ、Lドライブ Pull Up
1 0 0 Pch オープンDrain(Hドライブのみ) Open Drain High
1 0 1 H、LともSLOWドライブ5 Strong Slow
1 1 0 High-Z(アナログモード) High Z Analog
1 1 1 Nch オープンDrain (Lドライブのみ) Open Drain Low

PRTxDR

ここをアクセスすることで、プログラムから直接I/Oポートを読み書き出来る。

PRTxDR入出力の注意

Shadowレジスタを使う

PRTxGS -- グローバルバスI/O接続

RDIxSYN -- グローバルバス入力同期

ABF_CR0 -- CulmunMUXの切替え

AMD_CR0,AMD_CR1 -- ASCブロックのモジュレータ機能

RDIxLTx -- デジタルブロック出力のLUT切替え

OSC_CR0 -- CPUクロックの切替え

CMP_CR0 -- コンパレータバスの読出し

ARF_CR -- アナログ・リファレンス

REF[2:0] AGND RefHi RefLo
000b Vdd/2 Vdd/2+Bandgap Vdd/2−Bandgap
001b P2[4] P2[4]+P2[6] P2[4]−P2[6]
010b Vdd/2 Vdd/2+Vdd/2 Vdd/2−Vdd/2
011b 2xBandgap 2xBandgap+Bandgap 2xBandgap−Bandgap
100b 2xBandgap 2xBandgap+P2[6] 2xBandgap−P2[6]
101b P2[4] P2[4]+Bandgap P2[4]−Bandgap
110b Bandgap Bandgap+Bandgap Bandgap−Bandgap
111b 1.6xBandgap 1.6xBandgap+1.6xBandgap 1.6xBandgap−1.6xBandgap

デバイスエディタによる設定

ポート設定の謎

入出力が出来なくなる?

そんなの、ちゃんと設定してるし前に確認してるのに、と思って見てみると変になってたりする。 始めから回路構成が決まってれば、そんな間違いはしないと思うけど、PSoCだとどうしても試行錯誤が多くなるから、よくやっちゃうんだと思う。
5って何?
6フローティング状態なら動作するので、場合によっては大丈夫なんだけど。
7変数使った場合と同じような気がして、自分は使ったことないけど。
8あまり自由度は無いけど。。
9結局、あとでljmp _PSoC_GPIO_ISR って書換えないといけない。
10いや、少なくとも自分は良くある。。普通の人は無いかもしれないけど。。。

[top]

割り込み

Cで割り込み処理を記述

割り込みベクタ

        org 1Ch                 //GPIO Interrupt Vector
//        ljmp  PSoC_GPIO_ISR   // asmのハンドラを
          ljmp _gpio_handler    // Cで書いたものに置き換える
        reti
優先度 address 割り込み種別
0(高) 0000h Reset
1 0004h Supply voltage monitor
2 0008h Analog column 0
3 000Ch Analog column 1
4 0010h Analog column 2
5 0014h Analog column 3
6 0018h VC3
7 001Ch GPIO
8 0020h PSoC block DBB00
9 0024h PSoC block DBB01
10 0028h PSoC block DCB02
11 002Ch PSoC block DCB03
12 0030h PSoC block DBB10
13 0034h PSoC block DBB11
14 0038h PSoC block DCB12
15 003Ch PSoC block DCB13
24 0060h I2C
25(低) 0064h Sleep timer

割込みベクタが消える

PSoCの割込みプログラムのデバッグをやってると、いつのまにか割込みベクタが消えていることがある。

GPIO割込み

タイマ割込み

タイマ割込みに限らず、カウンタやPWMなどデジタルブロックを使う割込み(DBB00〜DCB13)は、デジタルブロックの割込みとして掛ける必要がある。

コンパレータによる割込み

全体の割込みを許可

個別の割込み許可をした後は、全体の割込みを許可する必要がある。

PSoCの割込みって。。。

PSoCの割込みは、最初ちょっと分かり難かった。 初めは、何がなんだか、全然分かりませんでした。。

Cの割込み記述(130419追記)

Cの割込み記述について(150819追記)


11boot.asmの冒頭のメモに書かれていることだけど。
12各ピンのInterrupt設定で、FallingEdge,RisingEdgh,ChangeFromReadを選ぶ。→DisableIntにすれば、PRTxIEはDisableになる。
13あれ、でもCapture割込みの場合はどれにすれば良いんだろう?
14最終更新日:February 29, 2012 だが、PSOC1の開発環境はそんなに変わっていないので、この記述を信じて良いと思われる。

[top]

モジュールの動作

PSoCの各モジュールの動作についてのメモ

Timer

タイマの端子の意味が分からなかったので、TimerTimingDiagramを見て、以下のような動作と理解した。

EEPROM

実際に使ってみた(080228追記)


15CompareValueを動的に変化することが出来るので、面白い使い方が出来そうだが思い付かない。。。
16Dr.Matrixさん、なのかな?こちらのPSoC関連のTipsは分かり易い。素晴らしい。
17実際、コンパイルは通っても実行時にエラーになったりした。と思う。うろ覚えだが。。

[top]

テクニック

アナログバス出力をさらにPGAに繋ぎたい

これはテクニックでも何でもないんだけど、PSoC Designerを使っていると接続可能であることに意外と気がつかないかもしれない。

コンパレータバスを直接出力したい

コンパレータバスは、直接見ることが出来ないみたいだ。 →単にコンパレータバスを出力するだけなんだけど。

DigBuf

リファレンス電圧出力

これも「はじめてのPSoCマイコン」より
        ACB02CR2 = (ACB02CR2 & 0xE3) | 0x14;

ダイナミック・リコンフィグレーション


18この方法は普通ちょっと思いつかない。この本は良く見るといろいろ参考になります。

[top]

PSoC Designer

PSoC Designerって、慣れないと結構分からないことがある。気が付いたことをメモしておこう。

Cloneで作ったコピーがエラー

boot.tplについて

Designer4プロジェクトについて


19どんな場合か良く分からないんだけど、多分Designerで割込み関連の設定を弄った時だと思われる。
20Designer5.1以降は、このUpdate機能が無い。全部のバージョンにこの機能を付けておいてくれたら良かったのに。。
21但し、古い環境をインストールすると弊害もあるかもしれないので注意。

[top]

いろんな失敗

UARTのクロック設定が悪いとLCD表示がされない?

デバッグ用RS232Cインターフェースを繋ぐと書込めなくなる?

UARTでTX出来るけど、RX出来ない

UARTでRXの受信抜けや重複が起こる

ポート設定が正しいのにアナログ入力出来ない

calling function without prototype may cause errors

MiniProg -- Device不一致で書き込めない

Counter出力が出ない

まぁスタート忘れも多いんだけど、それ以外に、

GPIO出力がおかしい

割込み処理の動作がおかしい

MiniProg -- ISSPで書き込み出来ない(091209)

I2Cmが動かない(100112)

A/D変換値が設定する度に変わる(100312)

ポートから出力できない

割込みが有効にならない

I2CmでNoStopでも1秒後にStop

GPIO割込みが掛からない

ADC出力がおかしい

シフト演算の間違い

ポート設定がおかしい

UARTの速度が出ない

RAM領域が先頭から破壊

SPIモジュールが動かない

SPI入出力がうまくいかない(未解決)

strtolが遅い

書込みできない

I2Cmでピンが選択できない

27443から29466移行時の問題


22実は、別の回路を繋ぐ時に、電源供給したかったので改造したところだった。
23設定によっては、PRTxDRの値と同じになる場合もあるけど。
24マズくない場合もあるけど、その時は明示的に割込み許可すれば良い訳だし。
25これって、Cypressのサイトじゃないか。へー凄いなぁ。。
26もしかすると他のモジュールもダメな奴があるかも。
27SMDだったので、間違いになかなか気がつかなかった。。


comments powered by Disqus