おじさん工房 BBS 628183


AE-AQM1620A(ST7032)timing

1:笛吹おじさん :

2025/04/07 (Mon) 17:13:10

https://bbs6.fc2.com//bbs/img/_448700/448683/full/448683_1744013590.jpg 今日は。
AE-AQM1620A(ST7032)のLCD_init(void)の動きを調べてみました。
ロジアナをRun状態でRFC-7の電源ON
電源ON<-328.8ms->LCD-ON<-27.5ms->lcd_init start<-125.1ms->lcd_init complete

lcd_init(void)
lcdc_cmdwrite8( 0x6C ); // FON=1, Rab=100
delay_msec( 200 ); // 電源安定まで 200ms 待つ
lcdc_cmdwrite8( 0x38 );

200msのdelayが有りますが、ロジアナでは125msと表示されていますね。
lcd_ini()の動きが確認できました。
PCF8574使用(ADRS=4E)のLCDはADRS4Eが送られているのですがACKが返りません。
ACKが戻る様に時間調整が必要の様です。
2:笛吹おじさん :

2025/04/07 (Mon) 17:39:07

https://bbs6.fc2.com//bbs/img/_448700/448683/full/448683_1744015147.jpg 追加画像です。

0x4Eに対してACKが戻っていません。
3:やどさん :

2025/04/07 (Mon) 19:40:02

https://bbs6.fc2.com//bbs/img/_448700/448683/full/448683_1744022402.jpg こんばんは、
 PCF8574使用のLCDで ACKが返らないですね!

こちらも、秋月からAQM1602Y-NLW-FBW(ST7032)とUSB-MicroBコネクタが届いたので、実験していました。

ディレイを大にしたら(下記のDELAY_N=3とかで)表示するかもしれません。たぶん…

〇I2C液晶が表示しない確率が高そうなので、DELAY設定を変えてSCL周波数や表示動作を確認してみました。
 i2c.cの"DELAY_N"値を変えています。
 また、LCD電源は動作マージンが良くなるであろう5Vを供給しました。


結果:

 DELAY_N  NOP数 F.SCL(Addr) F.SCL(Disp) 表示OK? 
  0    2/0   940kHz   585kHz   ×
  1    3/1   830kHz   585kHz   〇
  2    8/4   575kHz   380kHz   〇
  3    16/8   465kHz   310kHz   〇

 * F.SCL(Addr)は、初期I2Cアドレスサーチ中のSCL周波数
 * F.SCL(Disp)は、動作・表示中のSCL周波数

…ちなみに、届いた液晶はオリジナルの実行ファイル(DELAY_N=1)で表示しました。


考察:

 倍半分程度のバラつきまで考慮すると、DELAY_N設定値は「3」くらいが安全なのかもしれません。
 まぁ、個々に動作する上限に設定すれば良いですが…
 それにしても、LCDが容量負荷大で低消費電力化としても、、今時のロジックで400kHzMaxなんて遅すぎますよね~!?


 添付画像1 LCD表示NGとOK時の比較
 添付画像2 表示NGとOK時のI2C波形比較


i2c.cの"DELAY_N"設定箇所: (参考)

#define DELAY_N 3 // 0->666kHz 1->588kHz @10MHz

#if( DELAY_N==0 )
#define DELAY() {NOP;NOP;}
#define DELAY_HALF()
#elif( DELAY_N==1 )
#define DELAY() {NOP;NOP;NOP;} // 588kHz
#define DELAY_HALF() {NOP;}
#elif( DELAY_N==2 )
#define DELAY() {NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;}
#define DELAY_HALF() {NOP;NOP;NOP;NOP;}
#elif( DELAY_N==3 )
#define DELAY() {NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;}
#define DELAY_HALF() {NOP;NOP;NOP;NOP;NOP;NOP;;NOP;NOP;}
#else
#define DELAY() {volatile uint i=DELAY_N; while(i--);} //
#define DELAY_HALF() {volatile uint i=DELAY_N/2;while(i--);} //
#endif
//
4:やどさん :

2025/04/07 (Mon) 19:41:10

https://bbs6.fc2.com//bbs/img/_448700/448683/full/448683_1744022471.jpg 添付画像2 表示NGとOK時のI2C波形比較
5:笛吹おじさん :

2025/04/07 (Mon) 21:50:47

https://bbs6.fc2.com//bbs/img/_448700/448683/full/448683_1744030247.jpg やどさん、今晩は。

やどさんのDELAY=3を頂いて書き込んでみました。
見事表示がでました。
ロジアナの波形はちょっと違う様な気がしますが、でもちゃんと表示されています

蛇の目基板のRFC-7はロジアナのプローブを付けると
表示されなくなります。プローブにシリーズに抵抗を入れて見ましたが、ダメでした。
微妙ですね。

6:やどさん :

2025/04/07 (Mon) 23:19:00

出ましたか!

表示していればもうLCD表示器起因で決定ですね。
よかった−。。
でもロジアナ波形読みでSCLが380kHzくいらなので、400kHzに近いですし、、もっと落とした方が良いのかな。。

たしかにプローブで消えるくらいだと、マージンが全然なかったという事かも。。
LCDのバラつきは、思った以上に有りそうです。
//
7:ji1udd :

2025/04/08 (Tue) 05:54:58

やどさん、お世話さまです。

興味本位なのですが、DELAY_N を 4(以上) にするのは試されましたでしょうか? SCLの周波数はどの位になりましたでしょうか?

自分で試せば良い話ではあるのですが、、、、(^^;
8:やどさん :

2025/04/08 (Tue) 07:41:21

おはようございます。

> DELAY_N を 4(以上)は、、

あっ、測定値のメモを見たら転記間違いがありました。。
DELAY_3はNOP 12/6個の値でした。。下記訂正です 汗);

DELAY_N  NOP数 F.SCL(Addr) F.SCL(Disp) 表示OK? 
  3    12/6   465kHz   310kHz   〇
  4    16/8   400kHz   260kHz   〇

DELAY_N=0の表示中の値もオカシイな……
//
9:ji1udd :

2025/04/08 (Tue) 18:09:48

やどさん、早朝にコメントありがとうございました。

言葉足らずですみません。私が気にしたのは DELAY_N を 4以上にした場合の
#define DELAY() {volatile uint i=DELAY_N; while(i--);} //
#define DELAY_HALF() {volatile uint i=DELAY_N/2;while(i--);} //
の実物の動きです。

もしご存じでしたらで結構です。
10:笛吹おじさん :

2025/04/08 (Tue) 18:11:07

https://bbs6.fc2.com//bbs/img/_448700/448683/full/448683_1744103468.jpg こんにちは。

PCF8574使用(ADRS=4E)のLCDのアドレスサーチ時と計測時の周波数を調べてみました。

アドレスサーチ時:2.5uS 400KHz
計測時:4uS 250KHz

Delay=3の状態です。
11:やどさん :

2025/04/08 (Tue) 19:06:07

笛吹おじさん ji1uddさん、こんばんは。

PCF8574使用(ADRS=4E)のLCD(I2C)LCK周波数、誤記訂正版とほぼ一致で安心しました。
昨日のロジアナ波形読みだと周波数が高かったのが後から気になっていました。


>DELAY_N を 4以上にした場合の…

あっ、そうか、わかりました。
OjisankoubouプログラムではNOPを並べなくても済むように既に配慮されていたのですね!?

#elseの後の記述って何?とか思いながら、NOPを沢山ならべてしまいました。汗);;
//
12:やどさん :

2025/04/08 (Tue) 21:04:28

https://bbs6.fc2.com//bbs/img/_448700/448683/full/448683_1744113868.jpg こんばんは。

DELAY_N >= 4 やってみました。

ChatGPTに聞いたら、
「NOP命令を直接並べる方法に比べて、while ループによるディレイはコンパイラの最適化の影響を受けやすく、厳密な時間精度は期待できない場合があります。」

のような不穏な回答がきたので、実際に試してみました。


結果:
DELAY_N freq(SCL.disp)
 4    123.5kHz   画像
 6    95.2kHz
 8    75.8kHz
 10    65.3kHz

考察:
NOPは、I2Cのファーストモード(400kHz)用
Whileは、標準モード(100kHz)用に有効な感じでしょうか。


あと、、、
起動直後のI2Cアドレスサーチ部のLCK周波数が動作・表示中の周波数より1.5倍ほど高い理由が分かっていません。

どちらも、i2c.cの「static int i2c_write8( int wdata );」を使っているようにしか見えないのですが、
そうなら周波数は同じになるだろうと思うのですが、、、

それは、ココが違うから、、とか在りましたら教えてください。
//

13:ji1udd :

2025/04/08 (Tue) 21:57:09

やどさん、確認して頂きありがとうございます。

DELAY_N 3 と 4 との周波数調整の連続性がどんな感じなのかなと思っていましたが、ループ使うと大きく周波数が下がってしまうのですね。
お話の通り 100kHz付近でのHW動作チェックには有効ですね。

> 起動直後のI2Cアドレスサーチ部のLCK周波数が動作・表示中の周波数より1.5倍ほど高い理由が分かっていません。

細かいところまで追えていないのですが、アドレスサーチはクロックソースの切替え前に実行しているからでは?と思います。
#board.c の board_init() の記述から推測

追記:
lcdc_init(); // LCD 初期化 lcdc16xn.c
SystemClock_Config_HSE(); // system clock HSE
を逆順にして実験してみるとか...

追記2:
 クロックソース切替で 16MHz → 10MHz みたいです。64MHzで動作するMCUなので 10MHzで動かしているのか自信ないですけど。
14:やどさん :

2025/04/08 (Tue) 23:44:53

https://bbs6.fc2.com//bbs/img/_448700/448683/full/448683_1744123493.jpg ji1uddさん、すごいです!

モノのSCL周波数が初期と動作中で異なる事をピッタリ説明できますね!

もう、、さっそくboard.c修正してみました。→ 画像

結果:

初期I2Cアドレスサーチ部と動作中のSCL周波数は一致しました! 嬉しい~!

これで、I2Cアドレスが取得できなくてLCDが表示しない問題が起こる確率が大幅に低下すると思われます。。
//
15:笛吹おじさん :

2025/04/09 (Wed) 09:23:19

https://bbs6.fc2.com//bbs/img/_448700/448683/full/448683_1744158200.jpg 今日は。


追記:
lcdc_init(); // LCD 初期化 lcdc16xn.c
SystemClock_Config_HSE(); // system clock HSE
を逆順にして実験してみるとか...

私もやってみました。
アドレスサーチ時、計測時も同じ時間になりました。
2.625uS、380KHzです。

前回の投稿でDelay=3で表示が出たと書きましたが、
逆順にすることでDelay=2でも表示が出る様になりました。もとへ戻すとDelay=3にしないと表示が出ません。

USBコネクタの接触が段々わるくなりましたので、これで良しとしてケースを作ります。

16:ji1udd :

2025/04/09 (Wed) 19:25:45

やどさん、笛吹おじさん、実験結果を教えて頂きありがとうございました。

LCD表示できる DELAY_N値で使い始めて、もし先々 LCD表示できなくなったら 慌てずに DELAY_N値を 増やして対処しましょう (^^)
17:笛吹おじさん :

2025/04/10 (Thu) 09:44:48

お早うございます。
わたしのRFC-7固有の問題かも知れませんが、
SystemClock_Config_HSE();の順序を逆にした場合、REF切替スイッチをEXTにした時に[REF_CLK?]が表示されなくなりました。

取り敢えず、Delay=3に戻しました。


18:ji1udd :

2025/04/10 (Thu) 13:25:28

なるほど。

リファレンスクロックの切替でマイコンへの10MHzのクロックが途絶えるとマイコンのハードウェアが自動的に内蔵のHSIクロックに切替えるので、その結果、マイコンが16MHzで動作し、I2Cの周波数も上昇してLCD表示できなくなるのですね。

HSIクロック時のシステムクロックを1/2分周に設定(RCC_CRレジスタのHSIDIV[2:0]ビット)しておき、10MHzクロックが途絶えたときにHSIの8MHzでCPUが動作するようすれば、LCD表示できると思います。
19:やどさん :

2025/04/10 (Thu) 22:15:56

https://bbs6.fc2.com//bbs/img/_448700/448683/full/448683_1744290956.jpg ji1uddさん 皆さま こんばんは。

そういう事ですか!

外部クロック入れてない時でもスイッチを切り替えると「REF_CLK?」と表示されるカラクリが分かりませんでした。

で、
「HSIクロック時のシステムクロックを1/2分周に設定」… やってみました。(画像:DELAY_N=1です)

結果:
動作中のHSEクロック時も1/2になってしまい、レジスタ設定箇所が違った?と思われますが、未解決です。

参照:
STM32G0x1リファレンスマニュアル、ChatGPTにも訊きました。


〇board.c 修正箇所

ハードウェア初期化部は
SystemClock_Config_HSE(); // system clock HSE
lcdc_init(); の順にした

───────────────────────────────────
// System CLock を HSE に設定
//───────────────────────────────────
int SystemClock_Config_HSE(void) {
//#ifdef DEBUG
//dbg_uart1_putstr("\rRCC_CR=");dbg_uart1_puthex_32( RCC->CR );
//#endif
error_hse=0;
RCC->CFGR |= RCC_CR_HSIDIV_0; // DIV(001) 2分周(8MHz) ← これを追加した
RCC->CR |= RCC_CR_CSSON; // CSS( Clock Security System )
RCC->CFGR &= ~RCC_CFGR_SW; // HSI
RCC->CR |= RCC_CR_HSEBYP; // HSE_BYPASS
int timeout = 400000; // 0.2秒ぐらい
   :
   :
//
20:ji1udd :

2025/04/10 (Thu) 22:25:36

やどさん、レジスタ名が間違ってます。

RCC_CRレジスタ (のHSIDIV[2:0]ビット) です。
21:やどさん :

2025/04/11 (Fri) 00:17:53

ありゃりゃ、、
 CFGRじゃなくてCRでした。。汗);;

CFGRにHSIDIVビットなんて無いのに、どうしてコンパイルエラーにならなかったのかな!?

修正したら期待通りのSCL周波数になりました。やったー!Tnx!


笛吹おじさん:
この修正も入れて、オリジナルのDELAY_N=1で、表示するかもです。。多分ですが、、

board.cに
RCC->CR |= RCC_CR_HSIDIV_0; // DIV(001) 2分周(8MHz) ← この行を追加
//
//
22:笛吹おじさん :

2025/04/11 (Fri) 08:57:22

https://bbs6.fc2.com//bbs/img/_448700/448683/full/448683_1744329443.jpg 皆さん、お早うございます。

やどさん、
>RCC->CR |= RCC_CR_HSIDIV_0; // DIV(001) 2分周(8MHz) ← この行を追加

追加してREF_CLK?は出る様になりました。
Delay=1は駄目でした。Delay=2でちゃんと標示しています。
有難うございました。

格好の悪いケースに収めました(中途半端の状態ですが)
23:やどさん :

2025/04/12 (Sat) 14:51:43

https://bbs6.fc2.com//bbs/img/_448700/448683/full/448683_1744437103.jpg 皆さま こんにちは。

笛吹おじさん、Delay=1だとLCD表示しないこと了解です。
やはり、LCD製品の動作マージンはあまりなくて、スペック通り400kHzMaxなのですね。


画像は、動作・1行表示データ転送中の波形を見てみたものです。
DELAY_N=1(580kHz)で約1.23msなので、
DELAY_N=2(380kHz)なら約1.89msくらいになりそうです。


参考:Ojisankoubou様(2025/02/23)コメントより

「TIM2 割り込みから演算、表示、などを 3ms 以内にしたかったため I2C は規格より速く設定しています。 私のところでは ST7032 も 5V で動かしています」
「3msは 途中で周波数が変化した場合を考慮したためで、普通は 5ms(200Hz) で測定しているので I2C の周波数を変えた(DELAY_N=1を2)としても影響はほとんどないと思われます。」
//
24:笛吹おじさん :

2025/04/13 (Sun) 19:51:30

https://bbs6.fc2.com//bbs/img/_448700/448683/full/448683_1744541491.jpg 皆様、今晩は。
RFC-7カウンターもそれなりに出来上がりました。
皆様のご協力ありがとうございました。
マンション住まいではGPSを使った高精度な測定は敷居が高くて出来そうもありません。
ベランダにアンテナをどうやって取り付けるのか?落下事故を考えるといい加減なことも出来ませんし結局
面倒臭いのが先に立ち重い腰が上がりません(笑い)。

今まで製作したカウンターを並べてみました。
ケースは適当に作るので統一感もなくバラバラです。
幕下力士勢ぞろい、、、といった所でしょうか。
25:パオさん:

2025/04/13 (Sun) 21:44:33

笛吹おじさん
自作の高性能な周波数カウンタが、これだけ揃うと壮観ですね!
完成おめでとうございます。

私も集合住宅住まいで、さらに北海道なので窓を開けっぱなしにできず、アンテナ問題には常に悩まされています。(一軒家なら、壁に穴を開けて簡単に外にアンテナが設置できますが・・・)

  • 名前: E-mail(省略可):
  • 画像:

Copyright © 1999- FC2, inc All Rights Reserved.