暇なときは、アセンブラでマイクロコントローラをプログラミングするのが好きです。 これまで私は主にあらゆる種類のPIC(12.16)とAVRで運転してきましたが、MCS-51を軽視していません。特に実際に運転を始めたので。 私のレベルは「常に始まります」。 このタイプのLEDは、タイマーであっても点滅方法をすでに知っています。
次に、SIM900 GSMモジュールとやり取りするためのプログラムを作成するタスクを設定しました。 これを行うには、UARTに何かを送信し、そこから何かを受信できる必要があります。
この全体の能力によると、2つのリングバッファーが開始されます。受信用と送信用です。 このジャンルの古典のように思えますが、新しいものは想像できません。 しかし、私は松葉杖が好きではないような人ですが、同時に自転車が大好きです。 私は自分のものを思いつきたかった。 だから:
1.マルチタスクシステムがありません。1つのコマンドをモジュールに送信し、1つの応答を待つことになっています。 したがって、送信は既に割り込みではなく、メインループで実行できます。 送信バッファなしで実行できます。
2.モジュールからの回答は1つだけです(たとえば、信号レベルをチェックする場合はそうではありませんが)。私はそれがどうあるべきかを期待しています。 そのため、バッファーを省き、メインループで直接解析することにしました。
3.すべてが便利で美しいように、この全体をマクロに配置します。
私のコードの基礎は、2008年の雑誌「アマチュアラジオ」第3号の記事「初心者向けのMK」の例です。
まず、「印刷」:
; : , ; : String,Destiny_ ; : ; , : ; Print 'First string',UART ; UART ; Print 'Second string',LCD ; LCD UART equ 0 LCD equ 1 Print macro String;,Destiny_ ; String - , Destiny_ - : Display UART mov destiny,#Destiny_ call Output ; . 1 db String,0Dh,0Ah,0 endm Print_data segment data rseg Print_data destiny: ds 1 Print_code segment code rseg Print_code Output: ; , pop DPH ; DPTR , pop DPL ; Loop_Output: clr A movc A, @A+DPTR ; inc DPTR ; jnz Output_Symbol ; , jmp @A+DPTR ; Output_Symbol: ;------ UART ------------------------- push ACC ; , mov A, Destiny jz Out_UART ; Out_LCD: pop ACC ; call Out_2_LCD ; jmp Loop_Output ; Out_UART: pop ACC ; jnb TI, $ ; clr TI ; , mov SBUF, A ; jmp Loop_Output ;
オリジナルと比較して、いくつかの「宛先ポイント」に出力する機能を追加しました。
単純かつ美しくなったことを見て、私は同様の方法で解析を行うことにしました。 起こったことは次のとおりです。
; : , ; : String,Label,waiting_value ; : jmp Label String ; , : ; Parsing 'First string',UART_Error,1000 ; UART 1000 , , UART_Error ; Parsing 'Second string',UART_Error,0 ; UART, , UART_Error, - Parsing macro String,Label,waiting_value ; String - , Label - , waiting_value - *100 ( 11,0592 MHz) mov parsing_delay,#waiting_value ; - 100 , - 25,5 call Intput ; . 1 db String,0Dh,0Ah,0 jbc parsing_error,Label ; endm Parsing_data segment data rseg Parsing_data parsing_delay: ds 3 Parsing_bit segment bit rseg Parsing_bit parsing_error: dbit 1 Parsing_code segment code rseg Parsing_code Intput: ; , clr RI ; , , pop DPH ; DPTR , pop DPL ; 1 Loop_Intput: clr A movc A, @A+DPTR ; inc DPTR ; jnz Wait ; , jmp @A+DPTR ; . DPTR , Wait: ; push ACC ; mov A, parsing_delay jz Always_Wait ; = 0, mov parsing_delay+2,#0 mov parsing_delay+1,#90 ; 11,0592 Loop_Wait: jb RI, Stop_Wait ; , djnz parsing_delay+2,Loop_Wait jb RI, Stop_Wait djnz parsing_delay+1,Loop_Wait jb RI, Stop_Wait mov parsing_delay+1,#90 ; 11,0592 djnz parsing_delay,Loop_Wait ; pop ACC ; , jmp Error_Intput ; Always_Wait: jnb RI, $ ; Stop_Wait: mov parsing_delay,SBUF ; clr RI pop ACC ; cjne A,parsing_delay,Error_Intput ; 1 , jmp Loop_Intput ; Error_Intput: ; , clr A movc A, @A+DPTR inc DPTR jnz Error_Intput ; setb parsing_error ; jmp @A+DPTR ; . DPTR ,
Quartz 11.0592 MHzを使用すると、メインループで57600 bpsの速度で行を「印刷」して解析し、文字が欠落することがなくなります。 22.1184 MHzのクォーツでは、115200 bpsの速度で同じことを行うことができると予想されます。