プログラミングと工作と

PythonとかPascalとかAVRマイコンとか、コンパイラつくったり電子工作なんかを楽しんでいるおっさんの記録

AVRマイコン アセンブリ言語入門 ― 外部割込み

前回、割込み動作の説明をやったついでに、外部割込みの説明をします。 外部割込みってなんだよ? たいていのマイコンは、外部割込み端子ピンを持っています。AVRmega48/88/168/328シリーズだと、INT0, INT1 の2本の端子があり、ピン4,5番端子がそれにあたり…

AVRマイコン アセンブリ言語入門 ― 割込み動作

割込み動作ってなに? ある人曰く、マイクロプロセッサの最大のイノベーションは割込み動作、だそうです。基本的に、ひとつのプロセッサは一度にひとつの処理しか出来ません。割込み動作とは、プロセッサが一生懸命ある処理をしている途中で、「あ、俺の仕事…

AVRマイコン アセンブリ言語入門 ― 8bitタイマその4

さて、今回はいよいよ8bitタイマを使ったLED点滅プログラムを作ってみます。 まずは、レジスタの設定値を決めます。前回の復習 ー 設定する項目は 動作モード:ノーマルモードかCTCモードか等 プリスケーラの値 カウント比較値 割込み要求の設定 になります…

AVRマイコン アセンブリ言語入門 ― 8bitタイマその3

今回は、8bitタイマを使う時に設定する「レジスタ」の説明をします。8bitタイマに限らず、マイコンの各機能を使うときは、その機能の設定をするレジスタが用意されています。このレジスタに値を書き込んで、「こういう動作をしてください」とマイコンにお願…

AVRマイコン アセンブリ言語入門 ― 8bitタイマその2

前回、タイマ動作はクロックのパルスの数を数えて「一定の時間」を生み出すと説明しました。今回、ここの部分を具体的に説明します。 タイマ動作の「一定の時間」は、次の項目により決定します。 クロック プリスケーラ 比較レジスタ(OCRnA) 1のクロック…

AVRマイコン アセンブリ言語入門 ― 8bitタイマ

前回までで、環境の構築からアセンブル、書き込み、動作確認までをやりました。 今回から、AVRマイコンが持っている沢山の機能を、一つづつ攻略していきたいと思います。 初回の今回は、「8bit タイマ」です。 タイマって何するの? なにかつくろうとする時…

AVRマイコン アセンブリ言語入門 ― ポート出力その3

今回は、前回書いたプログラムをアセンブルして、マイコンに書き込み、動作確認する、と言うところまでを行います。 前々回のAtmel Studioのプログラム書き込み部分にソースを書き込みます。 プログラムを入力し終わったら、Build → Build Solution をクリッ…

AVRマイコン アセンブリ言語入門 ― ポート出力その2

それでは、実際に動かしてみましょう。 まず回路ですが、PB0に470Ωくらいの抵抗とLEDアノード側の足を直列にして接続し、LEDカソード側の足をGNDに接続する。 これだけです。 ちなみに、この回路だとHigh出力でLEDが点灯します。マイコン的には、Low出力で電…

AVRマイコン アセンブリ言語入門 ― ポート出力その1

ずいぶん更新をサボっていました。前回の続きで、実際にポートから出力をする実験をします。コードばかり書いてても面白くないですからね。実際に動かしながらやるのが1番です。 では、ポートBのBit0へつないだLEDを光らせる、という簡単な例から始めます。…

AVRマイコン アセンブリ言語入門 ― ポート設定

今日からしばらく、AVRマイコンのアセンブリ言語を勉強していきます。chipはATmega168P/328P をターゲットとしますが、基本は全部いっしょです。 で、まずは、基本中の基本、ポートの設定から。ATmega168P/328Pは、PORTB, PORTC, PORTD の3系統のポートを持…

まともなコンパイラにするために、必要な残された事など

さて、基本的な骨組みは出来上がってきました。ここから、まともなコンパイラとして機能するためには、まずは アセンブリ言語出力 これが出来なければ話になりません。中間言語の最適化から、アセンブリ・コード出力するための変換プログラムを作りこんでい…

制御構造を実装した(一部)

制御構造を実装してみました。これで、プログラムらしいことが一応出来るようになりました。アセンブリ言語にはまだ変換できませんが・・ 制御構造は、まだ一部しか実装していません。現在は if文、if-else文 while文 repeat文 だけに対応しています。 for文…

中間言語実装してみた

ソフトを作るのに没頭していてブログ更新をさぼっていた。 とりあえず、中間言語の実装、制御構造の実装(一部)というところまでたどり着いた。 今日は、中間言語をさらっと紹介します。直接アセンブリ言語に変換せずに中間言語というワンクションを置くの…

構文解析Ver.1の試運転

昨日までで、新しい構文規則を全部スクリプトへ落とし終えました。ちょっと長くなりますが、構文解析クラスのスクリプト全文を示します。その後に、実行結果を載せます。とりあえず、問題なく動いているようです。#!/usr/bin/python# coding: utf-8class psr…

構文解析部の変更その10 ー生成則 2. EXEC_STMTSー

今日は、生成則 2. EXEC_STMTS を書いていきます。生成則を再掲します。 2. EXEC_STMTS → EXEC_STMT EXEC_STMTS → λ 実行文を繰り返すだけです。 それでは、スクリプトへ落としていきましょう! def exec_stmts(self): self.token.next() if self.token.toke…

構文解析部の変更その9 ー生成則 3. EXEC_STMTー

今日は、生成則 3. EXEC_STMT を書いていきます。生成則を再掲します。 3. EXEC_STMT → ASSIGN_STMT 簡単すぎて、なんでこんな規則が必要なんだ?と思いますが、これは後々のための文法です。今は代入文(assign stmt)だけなので無意味に見えますが、今後if文…

構文解析部の変更その8 ー生成則 4. ASSIGN_STMTー

今日は、生成則 4. ASSIGN_STMT を書いていきます。生成則を再掲します。 4. ASSIGN_STMT → NON_KEY_ID ':=' EXPRESS ';' 昨日までは、ほぼ同じ形の生成規則が続いたのでコピペですんでいましたが、久しぶりに違う形がやってきました。といっても、やはり生…

構文解析部の変更その7 ー生成則 5. EXPRESSー

おっと、下書きを書いたら安心して、upするの忘れてた←昨日 今日は、生成則 5. EXPRESS を書いていきます。生成則を再掲します。 5. EXPRESS → TERM EXPRESSES 形としては、FACTORやTERMとまったく同じです。これはもう、コピペあるのみです。それでは、スク…

構文解析部の変更その6 ー生成則 6. EXPRESSESー

今日は、生成則 6. EXPRESSES を書いていきます。生成則を再掲します。 6. EXPRESSES → REL_OP TERM → λ 形としては、FACTORSやTERMSと同じです。これまた、ほぼコピペで行けそうです。それでは、スクリプトへ落としていきましょう! def expresses(self): i…

構文解析部の変更その5 ー生成則 7.TERMー

今日は、生成則 7.TERM を書いていきます。生成則を再掲します。 8. TERM → TACTER TERMS これまた、なんかどこかで見た気がします。昨日のFACTORSとFACTORの関係と同じですね。生成規則10.FACTORを再掲してみます。 9. FACTOR → PART FACTORS かたちがまっ…

構文解析部の変更その4 ー生成則 8.TERMSー

今日は、生成則 8.TERMS を書いていきます。生成則を再掲します。 8. TERMS → ADD_LEV_OP FACTOR TERMS → λ なんか、どこかで見た気がしますね。そう、この前作ったFACTORSとそっくりです。生成規則10.FACTORSを再掲してみます。 10.FACTORS → MULT_LEV_OP P…

構文解析部の変更その3 ー生成則 9.FACTORー

今日は、生成則 9.FACTOR を書いていきます。生成則を再掲します。 9. FACTOR → PART FACTORS なんか、簡単すぎる気がしますね。 それでは、スクリプトへ落としていきましょう! def factor(self): if self.token.token not in ['not', 'true', 'false', '('…

構文解析部の変更その2 ー生成則 10.FACTORSー

今日は、生成則 10.FACTORS を書いていきます。生成則を再掲します。 10.FACTORS → MULT_LEV_OP PART FACTORS → λ なんか、短くて簡単そうな気がします。ちなみに、MULT_LEV_OP というのも生成則 14.になります。これも再掲しておきます。 14.MULT_LEV_OP → …

構文解析部の変更その1 ー生成則 11.PARTー

今日から構文解析部の追加部分を作っていきます。最初は、生成則 11.PART から取り掛かります。生成則を再掲します。11.PART→ 'not' PART → '(' EXPRESS ')' → '+' ( '(' EXPRESS ')' | INTEGER | NON_KEY_ID ) → '-' ( '(' EXPRESS ')' | INTEGER | NON_KEY…

tokenクラスの変更

さて、Ver1の変更ですが、一番簡単そうなtokenクラスから始めます。tokenの変更は、昨日書いたように キーワード mod, div, not, and, or の追加 新トークン :=, *, <>, <=, >=, <, >, ), ( の追加 上記の追加を token.next()メソッドへ反映させる という点…

Ver.1の変更点について

「代入」を追加する新バージョンをVer.1とします。 Ver1での新入り達 Ver.1では、次の5つの新しいキーワードが入ります。 ・mod, div ・not, and, or最初の mod, div は整数算術演算子で、次の not, and, or がブール演算子です。 また、次の9つの新しいトー…

新章突入! -- 代入の実装 --

昨日、第0段階の骨組みが完成しました!若干のあやしいところはあるものの、まずは正常動作しています。こまかい修正はそのつど行うとして、先に進みましょう!第一段階で追加するのは、---> 「代入」 です。もっとも基礎的な実行可能ステートメントですよね…

記号表クラス修正-その2

昨日に引き続き、おかしなところを直していきましょう。定数 yes と no の型'type'が整数'int_s'になっている変数x,y,zが分離されていない今日は、変数x,y,zが分離されない問題を考えます。本来、変数 x と y と z は別の変数として登録されないといけないの…

記号表クラス修正-その1

昨日の動作試験で記号表におかしなところがありました。 定数 yes と no の型'type'が整数'int_s'になっている 変数x,y,zが分離されていない 最初の部分、yes と no の型が間違っている点を考えます。スクリプトを追っていくと、記号表に型名を入れるメソッ…

記号表つくってみた

さて、昨日つくった記号表クラスを使って、実際にコンパイラを動かしてみました。その結果が下になります。~/PythonProject/PasAvr$ python main.pyprogram test;const yes = true; no = false; small = 0; big = 123456; neg = -123;var id1 : integer; id2…