OSDN Git Service

git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@91 47198e57-cb75-475f-84c4-a814cd6...
authornyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Sun, 6 Nov 2011 16:06:19 +0000 (16:06 +0000)
committernyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Sun, 6 Nov 2011 16:06:19 +0000 (16:06 +0000)
misc/MiMicVM/api.js/LPCXpresso1769.Pwm.js [new file with mode: 0644]

diff --git a/misc/MiMicVM/api.js/LPCXpresso1769.Pwm.js b/misc/MiMicVM/api.js/LPCXpresso1769.Pwm.js
new file mode 100644 (file)
index 0000000..233e942
--- /dev/null
@@ -0,0 +1,287 @@
+/**\r
+ * LPCXPresso1769のPWMクラスを定義します。\r
+ class Pwm\r
+ PWMペリフェラルを操作するクラス\r
+ class AdcPin\r
+ PWMピンを操作するクラス\r
+ */\r
+(function(){\r
+var DEV=LPCXpresso1769;\r
+var BCF=DEV._BCF;\r
+var EE=DEV._EE;\r
+var isUndef=MiMicLib.isUndef;\r
+var cloneAssoc=MiMicLib.cloneAssoc;\r
+\r
+\r
+\r
+/**\r
+ * このクラスは、PWMペリフェラルを管理します。\r
+ @param i_opt\r
+ オプション値です。\r
+ {\r
+       freq:100,\r
+       phl:{power:1,clock:0}\r
+ }\r
+ */\r
+DEV.Pwm=function Pwm(i_mcu,i_opt)\r
+{\r
+       try{\r
+               this._mcu=i_mcu;\r
+               //PHL生成。\r
+               this._phl=new DEV.Peripheral(i_mcu,DEV.PHL.PWM1);\r
+               //設定値のロード\r
+               var opt=isUndef(i_opt)?{phl:{}}:\r
+               {//i_optある。\r
+                       phl:isUndef(i_opt.phl)?{}:cloneAssoc(i_opt.phl),\r
+                       freq:i_opt.freq\r
+               };\r
+               //デフォルト値設定\r
+               if(isUndef(opt.phl.power)){opt.phl.power=1;};\r
+               if(isUndef(opt.phl.clock)){opt.phl.clock=0;};\r
+               if(isUndef(opt.freq)){opt.freq=100;}\r
+               \r
+               var bc="";\r
+               var db=new Array();\r
+               //optionの設定\r
+               bc+=this.BCF_setOpt(opt,db);\r
+               bc+=BCF.setMem(this._PC,0x0,db);\r
+               //PCR\r
+               bc+=BCF.setMem(this._PCR,0x0,db);\r
+               //CTCR\r
+               bc+=BCF.setMem(this._CTCR,0x0,db);\r
+               //TCRに値設定(カウンタとPWMモードを無効化)\r
+               bc+=BCF.setMem(this._TCR,0x0,db);\r
+               bc+=BCF.setMem(this._TC,0x0,db);\r
+               //TCRに値設定(カウンタとPWMモードを有効化)\r
+               bc+=BCF.setMem(this._TCR,0x9,db);\r
+               //初期化\r
+               this._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
+               //ペリフェラルをMCUに登録\r
+               this._mcu.registerPhl(this,"PWM");\r
+       }catch(e){\r
+               throw new MiMicException(e);\r
+       }\r
+\r
+}\r
+DEV.Pwm.prototype=\r
+{\r
+       _cache:{\r
+               mr0:0\r
+       },\r
+       _TCR:0x40018004,\r
+       _TC:0x40018008,\r
+       _PR:0x4001800C,\r
+       _PC:0x40018010,\r
+       _MCR:0x40018018,\r
+       _PCR:0x4001804C,\r
+       _LER:0x40018050,\r
+       _CTCR:0x40018070,\r
+       _MRn:[0x40018018,0x4001801C,0x40018020,0x40018024,0x40018040,0x40018044,0x40018048],\r
+       _phl:null,\r
+       _mcu:null,\r
+       /**\r
+        * {phl:{object},(freq:int|mr0:int)}
+        */\r
+       BCF_setOpt:function BCF_setOpt(i_opt,i_db)\r
+       {\r
+               try{\r
+                       var bc="";\r
+                       var phlopt;\r
+                       var mr0;\r
+                       //ペリフェラルの設定\r
+                       if(!isUndef(i_opt.phl)){\r
+                               bc+=this._phl.BCF_setOpt(i_opt.phl,i_db);\r
+                       }\r
+                       if(!isUndef(i_opt.freq)){\r
+                               //サイクル(Hz)とペリフェラルのクロックから、MR0のサイクルを決定\r
+                               mr0=Math.round(this._phl.getPCLK()/i_opt.freq);\r
+                               if(mr0<=0){\r
+                                       //ペリフェラルクロック小さすぎワロタ\r
+                                       throw new MiMicException("The peripheral clock too small.");\r
+                               }\r
+                               //MR0に値設定\r
+                               bc+=this.BCF_setMRn(0,mr0,i_db);\r
+                               //LERにビットセット\r
+                               bc+=this.BCF_setLER(0,i_db);\r
+                               this._cache.mr0=mr0;\r
+                       }\r
+                       return bc;\r
+               }catch(e){\r
+                       throw new MiMicException(e);\r
+               }\r
+       },\r
+       BCF_setLER:function BCF_setLER(i_ch,i_db)\r
+       {\r
+               //LERにビットをセット\r
+               return BCF.setBit(this._LER,0x01,0x01,i_ch,i_db);\r
+       },\r
+       \r
+       /**\r
+        * MRnに値を設定するBC\r
+        */\r
+       BCF_setMRn:function BCF_setMRn(i_ch,i_val,i_db)\r
+       {\r
+               try{\r
+                       return BCF.setMem(this._MRn[i_ch],i_val,i_db);\r
+               }catch(e){\r
+                       throw new MiMicException(e);\r
+               }\r
+       },\r
+       BCF_setMRnByDuty:function BCF_setMRnByDuty(i_ch,i_duty,i_db)\r
+       {\r
+               try{\r
+                       return this.BCF_setMRn(i_ch,Math.round(i_duty*this._cache.mr0),i_db);\r
+               }catch(e){\r
+                       throw new MiMicException(e);\r
+               }\r
+       },\r
+       /**\r
+        * PCRに値を設定するBC\r
+        i_ch=1の場合、エッジモードは無視します。\r
+        @param i_ch\r
+        1-6\r
+        @param i_edge\r
+        エッジモード(1/0)\r
+        @param i_en\r
+       有効/無効の選択\r
+        */\r
+       BCF_setPCRbit:function BCF_setPCR(i_ch,i_edge,i_en,i_db)\r
+       {\r
+               try{\r
+                       var m,v;\r
+                       m=v=0;\r
+                       if(!isUndef(i_edge)){\r
+                               v|=i_edge;\r
+                               m|=0x00000001;\r
+                       }\r
+                       if(!isUndef(i_en)){\r
+                               v|=(i_en<<8);\r
+                               m|=0x00000100;\r
+                       }\r
+                       //ビットの設定\r
+                       return BCF.setBit(this._PCR,m,v,i_ch,i_db);\r
+               }catch(e){\r
+                       throw new MiMicException(e);\r
+               }\r
+       },\r
+       /**\r
+        * see API manual\r
+        */\r
+       getPin:function getPin(i_pin,i_opt)\r
+       {\r
+               try{\r
+                       return new DEV.PwmPin(this,i_pin,i_opt);\r
+               }catch(e){\r
+                       throw new MiMicException(e);\r
+               }\r
+       }       \r
+}\r
+\r
+/**\r
+ * このクラスは、PwmペリフェラルとPwm識別子から、シングルエッジPwmピンを構成します。\r
+ @param i_PWM\r
+ Pwmペリフェラル\r
+ @param i_pwm\r
+ PWMを構成するピン番号\r
+ @param i_opt\r
+ ピンオプション。各値は省略できます。\r
+{duty:100,enable:1,pin{sel:auto,mode:undefined,od:undefined}}\r
+ */\r
+DEV.PwmPin=function PwmPin(i_pwm,i_pin,i_opt)\r
+{\r
+       try{\r
+               this._pwm=i_pwm;\r
+               //PINがPWM持ってるか確認\r
+               this._pin=new DEV.Pin(i_pwm._mcu,i_pin);\r
+               //PinNameからピン情報を得る。\r
+               this._pwminfo=function(i_pin){\r
+                       //pinの完全な機能名を得る。(得られれば機能がある。)\r
+                       var func_name=DEV.completePinFunctionName(i_pin,"PWM");\r
+                       //portとbitを得る(AD0だけしか管理しないよ)\r
+                       var a=func_name.substring(2).split(".");\r
+                       var r={port:0,ch:parseInt(a[1]),pin_sel:DEV.getPinSelByFunctionName(i_pin,func_name)};\r
+                       if(!isNaN(r.ch)){\r
+                               return r;\r
+                       }\r
+                       throw new MiMicException(EE.INVALID_CFG,"The pin has not PWM fuction.");\r
+               }(i_pin);\r
+               //設定用のBCを作って実行\r
+               {\r
+                       var opt=isUndef(i_opt)?{pin:{}}:\r
+                       {\r
+                               pin:isUndef(i_opt.pin)?{}:cloneAssoc(i_opt.pin),\r
+                               duty:i_opt.duty,\r
+                               enable:i_opt.enable\r
+                       };\r
+                       //デフォルト値のロード\r
+                       if(isUndef(opt.pin.sel)){ opt.pin.sel=this._pwminfo.pin_sel;}\r
+                       if(isUndef(opt.duty)){opt.duty=0;}\r
+                       if(isUndef(opt.enable)){opt.enable=1;}\r
+                       this.setOpt(opt);\r
+               }\r
+       }catch(e){\r
+               throw new MiMicException(e);\r
+       }\r
+}\r
+\r
+DEV.PwmPin.prototype=\r
+{\r
+       _pwm:null,\r
+       _pin:null,\r
+       _pwminfo:null,\r
+       /**\r
+        * @param i_opt\r
+        シングルエッジPWMのオプション値を設定する。\r
+        {pin:{ピン初期化パラメタ},enable:有効値,duty:デューティ比}}
+        */\r
+       BCF_setOpt:function BCF_setOpt(i_opt,i_db)\r
+       {\r
+               try{\r
+                       var bc="";\r
+                       //pinselの値\r
+                       if(!isUndef(i_opt.pin)){\r
+                               //PINSEL設定\r
+                               bc+=this._pin.BCF_setOpt(i_opt.pin,i_db);\r
+                       }\r
+                       //PCRに値設定\r
+                       if(!isUndef(i_opt.enable)){\r
+                               bc+=this._pwm.BCF_setPCRbit(this._pwminfo.ch,0,i_opt.enable,i_db);\r
+                       }\r
+                       //MRnに値設定してLERにセット\r
+                       if(!isUndef(i_opt.duty)){\r
+                               bc+=this._pwm.BCF_setMRnByDuty(this._pwminfo.ch,i_opt.duty,i_db);\r
+                               bc+=this._pwm.BCF_setLER(this._pwminfo.ch,i_db);\r
+                       }\r
+                       return bc;\r
+               }catch(e){\r
+                       throw new MiMicException(e);\r
+               }\r
+       },\r
+       setOpt:function setOpt(i_opt)\r
+       {\r
+               try{\r
+                       var db=new Array();\r
+                       var bc=this.BCF_setOpt(i_opt,db);\r
+                       this._pwm._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
+               }catch(e){\r
+                       throw new MiMicException(e);\r
+               }\r
+       },\r
+       \r
+       /**\r
+        * デューティ比を設定する。\r
+        @return\r
+        */\r
+       setDuty:function setDuty(i_duty)\r
+       {\r
+               try{\r
+                       this.setOpt({duty:i_duty});\r
+               }catch(e){\r
+                       throw new MiMicException(e);\r
+               }\r
+       }\r
+}\r
+       \r
+\r
+\r
+}());\r