| TOP | ホーム | ページ一覧 |

No.14876 への▼返信フォームです。
 
出力ポートへのデータ転送について
   投稿者: tongari    
2022/12/04(日) 12:35
No. 14876 引用
 
  こんにちは。

出力ポートへのデータ転送についで教えてください。

下記のように、PortDの上位4bitをLCDに使用していて、空いているPortDの下位4bitに変数Aの下位4bitを転送しています。
PortDの下位4bitは、7セグLED(ダイナミック点灯)用のBCDデータとして使用します。


7セグLEDの表示には問題ないのですが、LCD側で時々文字化けが発生するので原因を探っています。


Dim A As Byte

Config Lcdpin = Pin , Db4 = PortD.4 , Db5 = PortD.5
Config Lcdpin = Pin , Db6 = PortD.6 , Db7 = PortD.7

A = A and &H0F
PORTD = PORTD and &HF0
PORTD = PORTD or A

上記の転送方法で問題ないか教えてください。
なお、LCDの更新周期は1秒、7セグLEDのコモン信号の切り替えは4ms周期です。

また、もし出力ポートに4bit転送ができるコマンドがありましたらご教授願います。

 
Re:出力ポートへのデータ転送について  引用
  投稿者: tongari    ..2022/12/04(日) 13:02  No.14877
  7セグLEDのコモン信号のONOFFタイミングを変えると、LCDの文字化けの雰囲気が変わりました。

1秒が4msの倍数で表示のタイミング重なるのが良くないのかと思い、LCDの表示周期1秒の割り込みタイミングを少しだけずらしたところ、今のところ文字化けしないようです。

もう少し様子を見てみます。

原因が以上の内容として、もっとスマートな解決方法ありますでしょうか・・・
Re:出力ポートへのデータ転送について  引用
  投稿者: O-Family    ..2022/12/04(日) 13:13  No.14878
  まず、7セグLEDのダイナミック点灯は、割り込み処理ですか?
割り込み処理ならばLCDの表示を変えるときに割り込みを禁止しないと、ポート単位で共有するときはデータが変わってしまう可能性があります。
ただ、LCDの処理は時間がかかるので、割り込みを止めるとダイナミック点灯にちらつきが出ると思います。

7セグLEDのBCDデータを、ビット単位(1bitずつ)で出力すれば解決するかと思います。
Re:出力ポートへのデータ転送について  引用
  投稿者: tongari    ..2022/12/04(日) 13:28  No.14879
  > まず、7セグLEDのダイナミック点灯は、割り込み処理ですか?
割込み処理です。

> 7セグLEDのBCDデータを、ビット単位(1bitずつ)で出力すれば解決するかと思います。
ありがとうございます。調べてみます。

set reset 命令がToggleになる  引用
  投稿者: 野良猫好き    ..2023/04/22(土) 11:17  No.14929
  BASCOM 2.071を使っています。SET命令が内部でポートを読み込んで反転させるという処理を自動で行っているということがわかる迄オシロを使いかなり時間がかかりました。
Toggle命令が別にあるのになぜこのような余計な処理をするのか理解できません。
単純に”1”にしてくれるような命令はないのでしょうか
Re:set reset 命令がToggleになる  引用
  投稿者: O-Family    ..2023/04/23(日) 09:13  No.14930
  どのチップを使用されているのかわかりませんが、AVRも進化の過程で色々な機能が拡張されてきました。

初期のチップはポートもA,B,C,Dポートくらいしか無かったので、それぞれのポートの特定のビットを1つの1ワード命令で[H]か[L]に設定できるようなアセンブラの命令セットが組まれています。
これによって、それまでの旧式のCPUと違い、8bitのポートを読み込んでからANDやORをしてポートのビットを変更しなくても、1命令で高速に処理できました。

しかし、40ピンを超える大きなチップが追加されて、ポートもE,F,G,H などと増えたため、初期の命令セットではこの増えたポートを操作できません。
AVRは旧式のCPUやPICと違い、レジスターもI/Oも各種メモリーも同じ連続したアドレス空間にあるため、新たなI/O操作命令を作ってプログラムの互換性を無くさなくても、追加されたポートを別のメモリーアドレスに割り振って、そのメモリーアドレスの内容を読み込んでからANDやORをして上位ポートのビットを変更する事で対応しています。

従って、下位のポートに対しては1つの1ワードのアセンブラ命令でポートを変化させますが、上位のポートに対しては3ワードの命令が必要になります。
コンパイラでは上位ポートも下位ポートも同じSET命令で区別無く処理できるため、おそらくその違いがオシロで見たときのポートの変化時間に表れたのを不思議に思われたのだと思います。



名前
Mail   URL
文字色
タイトル   簡単タグ入力
添付   >>お絵かき
フォームに保存  プレビュー      削除キー