このプロジェクトでは、ATMEGA32タイマーを使用して簡単な目覚まし時計を設計します。ATmega32Aマイクロコントローラーには16ビットタイマーがあり、そのタイマーを使用して秒をカウントし、デジタル時計を開発します。
すべてのデジタル時計には、時計の心臓部であるクリスタルが内蔵されています。この水晶は、時計に存在するだけでなく、すべてのコンピューティングリアルタイムシステムに存在します。この水晶は、タイミング計算に必要なクロックパルスを生成します。クロックパルスを取得する方法は他にもいくつかありますが、精度と高周波のために、水晶ベースのクロックが最も好まれます。正確な時計を得るために、水晶をATMEGA32に接続します。
必要なコンポーネント
ハードウェア: ATmega32マイクロコントローラー、11.0592MHzクリスタル、22pFコンデンサー(2個)、電源(5v)、AVR-ISPプログラマー、JHD_162ALCD(16x2 LCD)、100uFコンデンサー(電源間に接続)、ボタン(4個)、10KΩ抵抗(6個)、100nFコンデンサ(4個)、3ピンスイッチ(2個)、2N2222トランジスタ、ブザー、200Ω抵抗。
ソフトウェア: Atmel studio 6.1、progispまたはflashmagic。
回路図と動作説明
正確なタイミングのために、クロック用に11.0592MHzの水晶を接続しました。ATMEGAの内部クロックを無効にするには、LOW FUSEBITSを変更する必要があります。JTAG通信が引き続き有効になるように、高ヒューズビットには触れていないことに注意してください。
ATMEGAに内部クロックを無効にし、外部で動作するように指示するには、以下を設定する必要があります。
LOW USE BYTE = 0xFFまたは0b11111111。
回路では、ATMEGA32のPORTBがデータポートLCDに接続されています。ここで、PORTCを通常の通信ポートとして使用したい場合は、上位ヒューズバイトを変更して、ATMEGAのPORTCでのJTAG通信を無効にすることを忘れないでください。16x2 LCDでは、ブラックライトがある場合は全体で16ピン、バックライトがない場合は14ピンになります。バックライトピンに電力を供給するか、そのままにしておくことができます。14ピンには8つのデータピン(7-14またはD0-D7)、2つの電源ピン(1&2またはVSS&VDDまたはgnd&+ 5v)、コントラスト制御用の3番目のピン(VEE-文字の太さを制御します)があります。示されている)、および3つの制御ピン(RS&RW&E)
回路では、私が2つの制御ピンしか取っていないことがわかります。これにより、理解を深める柔軟性が得られます。コントラストビットと読み取り/書き込みはあまり使用されないため、グランドに短絡できます。これにより、LCDが最高のコントラストと読み取りモードになります。ENABLEピンとRSピンを制御して、それに応じて文字とデータを送信する必要があります。
LCD用に行われる接続を以下に示します。
PIN1またはVSSをアースに接続
PIN2またはVDDまたはVCCから+ 5v電源
PIN3またはVEEを地面に接続(初心者に最適な最大のコントラストを提供)
PIN4またはRS(レジスタ選択)をuCのPD6に
PIN5またはRW(読み取り/書き込み)をグランドに接続(LCDを読み取りモードにすると、ユーザーの通信が容易になります)
PIN6またはE(有効)からuCのPD5
uCのPIN7またはD0からPB0
uCのPIN8またはD1からPB1
uCのPIN9またはD2からPB2
uCのPIN10またはD3からPB3
uCのPIN11またはD4からPB4
uCのPIN12またはD5からPB5
uCのPIN13またはD6からPB6
uCのPIN14またはD7からPB7
回路では8ビット通信(D0-D7)を使用していることがわかりますが、これは必須ではありません。4ビット通信(D4-D7)を使用できますが、4ビット通信プログラムでは少し複雑になります。したがって、上の表に示すように、LCDの10ピンをコントローラーに接続します。8ピンはデータピンで、2ピンは制御用です。
スイッチ1は、アラームと時間の間の調整機能を有効にするためのものです。ピンが低い場合は、ボタンを押すことでアラーム時間を調整できます。その高いボタンが時間だけを調整するためのものである場合。ここには4つのボタンがあります。最初のボタンは、アラームまたは時間の分単位の増分です。2つ目は、アラームまたは時間の分をデクリメントするためのものです。3つ目は、アラームまたは時間のHOURの増分です。FOURTHは、アラームまたは時間のHOURSをデクリメントするためのものです。
ここにあるコンデンサは、ボタンのバウンス効果を無効にするためのものです。それらが削除された場合、コントローラーはボタンが押されるたびに複数カウントする可能性があります。ピンに接続されている抵抗は、ボタンを押してピンをグランドに引き下げるときに電流を制限するためのものです。
ボタンが押されるたびに、コントローラーの対応するピンがグランドにプルダウンされるため、コントローラーは特定のボタンが押されたことを認識し、対応するアクションが実行されます。
まず、ここで選択するクロックは11059200 Hzで、1024で割ると10800になります。したがって、毎秒10800パルスが得られます。したがって、1024プリスケーラでカウンターを開始して、カウンタークロックを10800Hzにします。次に、ATMEGAのCTC(Clear Timer Counter)モードを使用します。カウンタが割り込みが生成するように設定されている比較値までカウントアップすると、値(比較値)を格納できる16ビットレジスタがあります。
比較値を10800に設定するので、基本的には毎秒ISR(すべての比較で割り込みサービスルーチン)があります。したがって、このタイムリーなルーチンを使用して、必要な時計を取得します。
BROWN(WGM10-WGM13):これらのビットは、タイマーの動作モードを選択するためのものです。
ここで、OCR1Aバイトの比較値を持つCTCモードが必要なので、WGM12を1に設定するだけで、残りはデフォルトでゼロのままになります。
赤(CS10、CS11、CS12):これらの3ビットは、プリスケーラーを選択して適切なカウンタークロックを取得するためのものです。
プリスケーリングとして1024が必要なため、CS12とCS10の両方を設定する必要があります。
ここで、考慮すべき別のレジスタがあります。
緑(OCIE1A):このビットは、カウンター値と設定したOCR1A値(10800)の比較一致時に割り込みを取得するために設定する必要があります。
OCR1A値(カウンタ比較値)は、上記のレジスタに書き込まれます。
プログラミングの説明
目覚まし時計の動作は、以下のコードで段階的に説明されています。
#include //ピンのデータフロー制御を有効にするヘッダー#defineF_CPU 1000000 //接続されているコントローラーの水晶周波数を通知する#include