象ずパグ、たたはAttiny13AぞのLCD接続

もう䞀床、Habrの読者を歓迎したす



こずわざ。

正盎に蚀っお、私が自分のプロゞェクトで必芁になるずさえ思わなかったずきに、シフトレゞスタの適甚ず䜿甚のトピックに觊れる、少し異なる内容の蚘事を曞きたかったのです。

しかし、私は友人をマむクロコントロヌラプログラミングの分野に匕き蟌むこずにしたした。マむクロコントロヌラプログラミングは、自分自身や他の倚くの問題を容易に理解するでしょう。



圌の最初のアむデアは光の動的な蚭眮を䜜成するこずだったので、私は圌にDigisparksず10ワットRGB LEDのスタヌタヌキットを泚文したした。 しかし、問題は、圌らが埅たなかったずころから来たした。最初の問題は、ハヌドりェアPWMの欠劂です。 そしお2぀目-友人が耇数のLEDを同時に制埡したかった。

もちろん、解決策は簡単です。別のマむクロコントロヌラヌを備えた、より高床なボヌドを䜿甚しおください。 しかし、そのようなボヌドは玠晎らしい手段のために泚文し、再び埅぀か、地元で賌入する必芁があり、その間、私は長い間研究しおきた制埡原理であるシフトレゞスタを思い出したしたが、私はそれを回路で䜿甚したせんでした。



圌はAtmel Studioに座っお、74HC595を通じおマルチチャネル゜フトPWMの蚘述を開始したした。 数日で、いく぀かの制埡モヌドが䜜成され、マルチチャネルPWM、BAMを線成するためのすべおの基本機胜、およびLEDレベルず7セグメントむンゞケヌタヌを操䜜するためのメカニズムが実装されたした。

実際、このテヌマに぀いおは、添付の゜ヌスを䜿甚しお詳现な蚘事を曞きたいず思いたしたが、ボリュヌムが非垞に倧きくなり、蚘事が非垞に広範囲になりたした。 そしお、以䞋で説明する最終的な実装の埌、管理コンセプトを完党に修正する必芁があり、このトピックに関するすべおの開発が即座に陳腐化するこずになりたした。

読者がそのような蚘事を受け取りたいずいう欲望を持っおいるならば、私はそうするでしょう。 そしお、それなしで、 私たちは皆 、 私がどれほど怠けおいるか芚えおいたす 。 :)



䞀般に、友人はArduino環境で䜿甚するためのラむブラリを受け取りたしたが、私は退屈し、LCDHD44780を制埡するために調査結果を適甚するこずを考え始めたした。

この䜜業の結果を今すぐデモンストレヌションし、同時に知識ず゜ヌスコヌドを共有したいず思いたす。



それでは、始めたしょう

誰もが知っおいるシフトレゞスタ、マむクロコントロヌラヌ、および液晶画面ずは䜕ですか。知らないが興味がある堎合は、むンタヌネットから簡単にこの知識を埗るこずができるので、最も基本的な知識は省略したす。



動䜜には、オンデマンドでデヌタ出力を敎理できるラッチが存圚するため、シフトレゞスタ74HC595が遞択されたした。 HD447804ビットモヌドでの動䜜甚およびATtiny13Aマむクロコントロヌラヌず互換性のあるディスプレむ。

この遞択は、より匷力なマむクロコントロヌラヌの䞍足によるものではなく、タスクの範囲、結論の数、メモリずRAMを狭めるこず、そしお単にスポヌツの目的のために行われたした。

目的パフォヌマンス、䜿いやすさ、および党機胜を犠牲にするこずなく、特定の機噚で実行できるコヌドの䜜成。



衚瀺開始。

最初に敎理する必芁があるのは、蚱容可胜な速床でシフトレゞスタを介しおデヌタを出力するこずでした。これは、Tinkiの3本の脚を䜿甚しお行われたした。

この方法で蚘述された接続の画像

次に、LCDで蚱容される圢匏でデヌタを衚瀺する関数が䜜成されたした。 この関数は、埌続のすべおの出力のベヌスずなる䞀皮のカヌネルたたはラむブラリドラむバヌです。 デヌタの断片化をニブルニブルに敎理し、シフトレゞスタを介しおLCDに送信し、メむンデヌタ転送機胜を呌び出す远加機胜補助機胜。



機胜郚分の実装。

䜜業のこの郚分が完了しおテストされるずすぐに、初期LCD初期化に必芁なデバむスコントロヌルパネルで説明されおいるLCD制埡機胜の䞋䜍レベルず、LCDがオンにならない初期初期化機胜自䜓の敎理を開始したした。 。

たた、1぀の出力関数䞊蚘のドラむバヌのみがLCDにデヌタを送信するためのものであるため、他のすべおの関数は、察応するパラメヌタヌを転送するこずにより、呌び出しによっお簡単に構成できたす。 そのため、プログラムメモリを節玄するために、他のすべおの関数は#defineディレクティブを䜿甚しお定矩できたす。



この時点で、誰も䜿甚しない初期化方法を芋぀けたしたが、それはHITACHI company DSで詳现に説明されおいたす私の蚘憶がうたく機胜しおいる堎合。 これは、LCDのデヌタラむンのビット深床を切り替えるために、最初の2぀の呜什が4ビットであるこずが必芁であるずいうこずです。

さたざたなサむトを読んでLCD制埡の問題を調べたずき、倚くの人に知られおいる暙準の初期化モヌドがそこに蚘述されおいたした。

その結果、他のメヌカヌのLCDを䜿甚する際の問題を回避するために、2぀の初期化関数が䜜成されたした。 モヌドは、プログラムの先頭にあるディレクティブによっお決定されたす。

その埌、LCD制埡機胜の基本セットを拡匵する䞀連の機胜が定矩されたした。これには、2皮類のLCDデバむスのカヌ゜ル䜍眮決め機胜1602および2004タむプ切り替えはプログラムの先頭のディレクティブによっお線成されたすおよび文字出力機胜も含たれたす





次に、トップレベルの関数の補助セットを䜜成しお、画面䞊の暙準タむプのデヌタの出力を敎理したした。たずえば、バむト、ワヌド、HEX圢匏のバむト、文字列などです。

数倀デヌタを出力するために、10および100による玠早い陀算の関数ず、察応する陀算トリックの残りを「レヌキ」する補助マクロが蚘述されたした。 したがっお、uint16を出力するために5぀の陀算の代わりに、より少ない数の陀算が必芁です-8ではなく4、uint8では4ではなく2。 新しい文字を決定する機胜、RAMの行のロシア語テキストをトランスコヌドする機胜、テキストの倉換によるプログラムメモリからの行の出力も曞き蟌たれたす。

このセットは次のずおりです。



バむトビットマップの出力ずバむトビットマップのマスクされた出力を敎理する2぀の補助関数が、マスクで指定された特定のビットのステヌタスの監芖を可胜にするために、そこに行きたした。 以䞋のビデオでは、これが実蚌されおいたす。

ただし、実際のハヌドりェアで衚瀺するには、文字コヌドを他の文字に倉曎するか、代替文字を䜜成しお、そのコヌドを䜿甚する必芁がありたす。 これらの関数に関するコメントは、これを倉曎する堎所を瀺しおいたす。



さお、結論ずしお、この「ビネグレット」党䜓は、最高の機胜セットによっお拡匵されたした。

画面䞊の特定の䜍眮でデヌタの出力を敎理したす。 これは、defineディレクティブを介しお同じ方法で行われたした。





提瀺されたコヌドの抜粋は、コメント内のコヌドの詳现を瀺しおいるため、䜿甚に問題はありたせん。 最適化の結果、かなり控えめなコヌドサむズでかなりリッチな出力を衚瀺できるようになりたしたが、その凊理速床には感銘を受けたせんでした。 たた、スタックずネストレベルの䜿甚を分析した埌、出力カヌネルの関数を曞き換えお、2぀のパラメヌタヌを必芁ずする補助関数を削陀するこずを決定したした。これにより、スタックが倧幅にアンロヌドされ、コヌドが100バむト削枛されたしたが、出力はあたり高速化されたせんでした。



ハヌドりェアのアップグレヌド。

そしおその瞬間、10幎前にRCチェヌンを䜿甚しおシフトレゞスタぞのデヌタ出力を線成したドむツ人の䟋を芋぀けたした。 第䞀に、このメ゜ッドの実装により、マむクロコントロヌラヌの片方の脚を解攟するこずができ、第二に、それが私を新しい考えに駆り立おたした。

そのため、デヌタ転送プロトコルを分析しお、「E」-LCD信号の出力ずシフトレゞスタラッチの出力が䞀臎しおいるこずに気付きたした。

これは、シフトレゞスタの1行を解攟し、デヌタ出力を2回高速化できるこずを意味したす。

その埌、RS-LCD出力もデヌタラむンに転送され、シフトレゞスタの別のラむンを解攟するこずができ、デヌタ転送プロトコルはこの事実を考慮しお曞き盎されたした。

結果は、デヌタずフラグコマンドたたは関数の出力を受け取る単䞀のカヌネル関数であり、それ自䜓がニブルを解析し、必芁な遅延でデヌタ行に衚瀺し、100バむトを超えたせん。

LCDデヌタバス4ビットは1぀のシフトレゞスタの出力の半分を占有し、埌半はデモで瀺したものを瀺すために䜿甚できたす。



その埌、DIHALTのりェブサむトeasyelectronics.ruでシフトレゞスタのRCチェヌンの䜿甚に関する簡単な説明に出䌚い、そこにすべおの資料を投皿したかったのですが、アカりントに正しくログむンできたせんでした。 たたは倚分圌はサむトを混乱させた-メむンおよびコミュニティサむト。 䞀般的に、私は非垞に動揺したせんでした、ずにかくこんにちは:)

そしお、私が説明しおいる分野の知識が䞍足しおいるず感じる人のために、この欠点を取り陀くためにこのリ゜ヌスを蚪れるこずをお勧めしたす。 DIHALTずコミュニティのメンバヌは、問題のデバむスをすべお詳现に説明しおいたす。



さらに、接続および䜿甚情報。

私はコヌドを別のラむブラリに持ち出したせんでした。生成されたコヌドは、LCDでのデヌタの衚瀺に関連する開発のために簡単に倉換されたす。 欠点は、シフトレゞスタ䞊にあるLCDデヌタバスを再構成できないこずです。垞に0〜3行を占有したす出力関数の巊シフトコマンド「lsl」を右シフトコマンド「で眮き換えるこずにより、シフトレゞスタの出力を「ミラヌリング」するこずは可胜ですがrsl」は、シフトレゞスタピンの割り圓おを「反転」し、デヌタバスはピン7〜4にありたす。 しかし、マむクロコントロヌラヌの出力は、すべおのMKに察しお任意に構成できたすが、譊告がありたす行は同じポヌト䞊にある必芁がありたすこの堎合も、このオプションport = 0x16で、出力関数のポヌト番号の再割り圓おが必芁です。

コヌドには、指定された領域だけでなく有甚なトリッキヌなトリックがいく぀か含たれおいたすたずえば、残りを10ず100で陀算する。

コヌドは、蚺断目的のために初期化されたハヌドりェアPWMを陀いお、割り蟌みやその他の呚蟺機噚を䜿甚したせん。その埌、デモ䟋ポヌトラむンPB0-PWM、PB1-逆PWM、LEDの状態からの倉曎のために残されたした。 これにより、たずえば、ディスプレむのバックラむトの明るさをプログラムで制埡できたす。

したがっお、これは最小のLCDデヌタ出力ラむブラリですそしおおそらくコヌドで最も速く、最も文曞化されおいたす:)

ハヌドりェアでのテストはありたせんでしたが、RCチェヌンのパラメヌタヌの枬定された偏差に基づいお、問題はないず思いたす。

このビゞネスを鉄でチェックする勇敢な人がいるなら、私は非垞に感謝したす。

たた、9.6 MHzおよび4.8 MHzのMK呚波数で操䜜性がテストされおいるこずに泚意しおください埌者の堎合、RCチェヌンの抵抗を9kに倉曎する必芁がありたす。

アむロンのコンデンサは100 pFである必芁がありたす10 pFはMKポヌトの脚の容量の蚱容範囲です。



INIT3セクションは、MKパラメヌタヌを事前に初期化し、デバむスの電源を入れた埌に衚瀺を開始するために個別に䜜成されたした。次のようになりたす。





アプリケヌションの䟋。

操䜜性、機胜、凊理速床を実蚌するために、すべおの機胜ずはほど遠い機胜を䜿甚するデモモヌドが䜜成されたしたが、そのセットを理解するのに十分です。

Proteusプログラムのビデオ゚ミュレヌションはこれを瀺しおいたす。



私は声の挔技をおizeびしたす。2番目のモニタヌの音を消すのを忘れおしたいたした。芖聎の邪魔にならないこずを願っおいたす。



いく぀かの技術情報。

このデヌタから



デモがメむン関数で480バむトを䜿甚するこずは明らかです。 残りのコヌドは䜿甚されるラむブラリ関数、cp1251は文字倉換テヌブル33 * 2、HelloPGMは文字列定数 "Hello、Habr"、最埌の4぀のコヌドフラグメントはそれぞれ7バむトですモヌドを出力するための文字列定数 "Red"、 "Green" 、「Blue」、「Yellow」の埌にスペヌスが続くがフラッシュメモリに保存されたす。

1バむトのRAM-LEDフラグの状態倉数を受け取りたす。

ビデオでは、䜿甚されるキャラクタヌは完党に再描画されたProteusラむブラリに組み蟌たれおいたす。 したがっお、鉄では、画像は異なりたす。 :)

しかし、パフォヌマンスは圱響を受けたせん



垌望する人のためのパルス信号ずデヌタパケットの時間パラメヌタ



デヌタ出力機胜はゞッタの完党な陀去を考慮しお最適化されおいるため、信号「0」ず信号「1」の持続時間最初の図は時間的に完党に䞀臎するこずがわかりたす。

2番目の図は、LCDぞの1パケットバむトの転送を反映しおいたす。デヌタバスは4ビットであるため、この転送は2段階で実行され、その間にLCDがデヌタの最初の郚分を「消化」できるように遅延がありたす。

出力関数を気にする人は、ここにありたす



ここでは、Atmel MKにのみ特城的な結論のあるトリックも䜿甚したした。



おわりに

誰かが私の䜜成をハヌドりェアで具䜓化するこずを決定し、起動に問題が発生した堎合は、遅延しお再生するこずをお勧めしたすグロヌバルデヌタの説明セクションの#defineディレクティブで瀺されたす。 ヘルプが必芁になりたす、蚘事ぞのコメントで質問を連絡しおください、私はお手䌝いさせおいただきたす。 私はほずんど远加するのを忘れおいたした割り蟌みを䜿甚するずき、あなたは自分で行にデヌタを出力する機胜にバリアを提䟛する必芁がありたす機胜の最埌に、コメントの䞋にSREGステヌタスレゞスタを保存および埩元する䟋がありたす。 そうしないず、デヌタ転送機胜䞭に割り蟌みを呌び出す問題が発生し、誀動䜜に぀ながりたす手順cliずseiでは䞍十分です。



い぀ものように-远蚘

私は、コヌドがデヌタ出力に関連する新しい開発にどの皋床適応できるかを確認するこずにしたした。最初に思い぀いたのは、ATtiny13Aに電圧蚈を実装するこずでした。



提瀺された実装の開発には30分しかかかりたせんでしたが、そのほずんどが回路の蚭蚈に費やされたした。

2チャンネルアンペア、ボルトメヌタヌ

1チャンネル0-60V、0-40A

2チャンネル0-15V、0-10A

コヌドサむズ760バむト

䜿甚する呚蟺機噚ADC0、ADC1、ADC2、ADC3

リセット-犁止されおいたす。すべおのPORTBが䜿甚されたす。



蚘事で䞍正確な蚘述が行われた可胜性がありたす。同様に、限界コヌドで瀺されたプロファむリング結果で䞍正確な可胜性があり、コヌドは数回曞き換えられたした。 コヌドの機胜に関しおは、すべおの機胜が䜕床もテストされたこずを保蚌できたす。

Atmel Studio 7.0のデモずProteus 8.3 sp2のプロゞェクトの゜ヌスコヌドが添付されおいたす。これ以䞊の倉曎は行われたせん。



い぀ものように、私は誰もが圌らの仕事で...そしお他の努力で成功するこずを願っおいたす

もうすぐ春が来たす



営利目的のプロゞェクトでの䜿甚、゜ヌスコヌドの転売、営利目的およびmerc兵目的での䜿甚は犁止されおいたす。 ゜ヌスコヌドはそのたた無料で配垃されたす。他のサむトたたは他の゜ヌスで䜿甚する堎合は、著者の指瀺ず配眮の通知が必須です。



All Articles