teacup. [ 掲示板 ] [ 掲示板作成 ] [ 有料掲示板 ] [ ブログ ]

 投稿者
  題名
  内容 入力補助画像・ファイル<IMG> youtubeの<IFRAME>タグが利用可能です。(詳細)
    
 URL
[ ケータイで使う ] [ BBSティッカー ] [ 書込み通知 ] [ 検索 ]


Re: タイマー1

 投稿者:nekosan  投稿日:2014年11月25日(火)23時32分50秒
返信・引用
  > No.674[元記事へ]

初心者さんへのお返事です。

> TMR0だけでは2チャンネル化しても判別できそうもないようです。
> TMR1も併用予定です。


外部割込みは、タイマ割りこみと直接関係あるわけでは
ないのでは?という気がするのですが…


http://www.picfun.com/moduleframe.html

12Fxxシリーズはよく判らないのですが、16Fxxシリーズだと、
RB0は、立ち上がり/立下りのどちらかで割り込み発生、
RB5はピンチェンジ割り込み(立ち上がり/立下り両方)、
となっているので、割り込み処理内での振り分け条件が
異なるのでは?と言う気がするのですが。

このあたりの条件は的確に振り分けロジックに反映されて
いるのでしょうか?
 
 

Re: pic内のflach memory

 投稿者:nekosan  投稿日:2014年11月25日(火)23時28分46秒
返信・引用
  > No.675[元記事へ]

matsuさんへのお返事です。

> いつもお世話になっています。
>
> こういったことって,可能なのでしょうか?
> 次回パワーオン時のために,一時的にメモリにデータを保存しておきたいのですが,
> 内部のフラッシュメモリで,プログラム保管に使ってないエリアにデータを書き込むこと
> って,PICは可能なのでしょうか? 記憶させたいのは,数バイトから数十バイトくらいです。
>
> configに,Write Protection Flash Pageなど,Write Protectionと書かれたconfig設定が
> いくつかあるので,気になっています。I2C接続のEEPROMを増設しようかと思って
> いたのですが,もしPIC自身が持つフラッシュromエリアにPIC自身が書き込みができるなら,
> その方がハードが楽なので,そもそもできるのかどうか・・・。
>
> H8からPICに乗り換えて,いろいろ戸惑うことが多く,お知恵をお借りできると助かります。
> よろしくお願いいたします。
>


PIC全般かどうか判りませんが、一般的なマイコンでは、
ブートローダ機能を搭載しているマイコンなら、自己書き換え
のために、プログラムメモリを書き換える機能が付いている
かとおもいます。逆に、ブートローダが載ってないマイコン
の場合は、付いてないかもしれません。

プログラムメモリの内容を(定数テーブルなどの様に)読み出す
ことは、どのマイコンでも普通は可能になっていると思います。


プログラムメモリではなく、内蔵EEPROMでメモリ量的に足りる
のなら、EEPROMを使うのが手っ取り早いのではないでしょうか?

なお、EEPROMも、プログラムメモリも、読み出しは一般的な
マイコンでは、短時間(1~数クロック)で済むと思いますが、
書き込みはどちらも結構な時間が掛かるはずです。
(SRAMほど簡単にアクセスは出来ないようになっているかと)
 

pic内のflach memory

 投稿者:matsu  投稿日:2014年11月25日(火)02時03分3秒
返信・引用
  いつもお世話になっています。

こういったことって,可能なのでしょうか?
次回パワーオン時のために,一時的にメモリにデータを保存しておきたいのですが,
内部のフラッシュメモリで,プログラム保管に使ってないエリアにデータを書き込むこと
って,PICは可能なのでしょうか? 記憶させたいのは,数バイトから数十バイトくらいです。

configに,Write Protection Flash Pageなど,Write Protectionと書かれたconfig設定が
いくつかあるので,気になっています。I2C接続のEEPROMを増設しようかと思って
いたのですが,もしPIC自身が持つフラッシュromエリアにPIC自身が書き込みができるなら,
その方がハードが楽なので,そもそもできるのかどうか・・・。

H8からPICに乗り換えて,いろいろ戸惑うことが多く,お知恵をお借りできると助かります。
よろしくお願いいたします。
 

タイマー1

 投稿者:初心者  投稿日:2014年11月24日(月)21時52分6秒
返信・引用
  TMR0だけでは2チャンネル化しても判別できそうもないようです。
TMR1も併用予定です。
 

Re: こんなのあり?

 投稿者:初心者  投稿日:2014年11月24日(月)20時38分50秒
返信・引用
  > No.668[元記事へ]

nekosan様
いつもお世話になっております。
力技ですが、動くようになりました。
引き続き、2チャンネル化に挑戦します。

GPIO,0変化を受けてGPIO,5変化
GPIO,5保持時間はGPIO,3で指定(スライドスイッチで固定)


LIST P=12F629
INCLUDE P12F629.INC

__CONFIG _CPD_ON & _CP_ON & _BODEN_ON & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF

    ERRORLEVEL      -302  ;これ入れるとバンクが違うと出なくなる。

ICNT    EQU     2Ch         ; TMR0割込みフラグ
GP0FLG  EQU     2Dh
save_st EQU     2Eh         ; STATUSのセーブ領域
save_w  EQU     2Fh         ; W-regのセーブ領域
GP5FLG  EQU     31h      ; TMR0割込み回数指定

;********************************************************************
; プログラム開始
;********************************************************************
ORG 00H ;RESETの入口
GOTO INIT ;初期設定へ
ORG 04H ;割込みの入口
GOTO WARIKOMI_START;割込み処理ルーチンへ
ORG 08H ;メインプログラム

;********************************************************************
; 割込みルーチン
;********************************************************************
WARIKOMI_START
        MOVWF   save_w      ; W-regセーブ
        SWAPF   STATUS,W
        MOVWF   save_st     ; STATUSレジスタセーブ

        BTFSS INTCON,GPIF  ;ピン変化の割り込みか?
    GOTO TMR0_WARIKOMI;違うのでTMR0変化を見に行く
        BCF     INTCON,GPIF ;ピン変化割込みならフラグクリア

WARIKOMI_GP0
        BTFSS GPIO,0 ;1→0の変化のみ拾う
        GOTO  WARIKOMI_GP0A
        GOTO  WARIKOMI_END

WARIKOMI_GP0A
        BSF GPIO,5        ;点灯(負論理)
        MOVLW   B'10100000' ; ⑦GIE,⑤T0IE,③GPIE
        MOVWF INTCON       ;タイマー0だけを有効にする
        GOTO   WARIKOMI_END

TMR0_WARIKOMI;GPIO,0が0になった時作動
        BCF     INTCON,T0IF ; 割込みフラグクリア
        DECFSZ  GP5FLG,F
        GOTO    WARIKOMI_END

        BSF     ICNT,0    ;

        BTFSC   GPIO,3
        GOTO    TMR0_SET_A
        MOVLW   2
        MOVWF   GP5FLG     ; 割込みカウンタの設定
        GOTO    WARIKOMI_END

TMR0_SET_A
        MOVLW   12
        MOVWF   GP5FLG     ; 割込みカウンタの設定

WARIKOMI_END
        SWAPF   save_st,W
        MOVWF   STATUS      ; STATUSレジスタロード
        SWAPF   save_w,F
        SWAPF   save_w,W    ; W-regロード
        RETFIE              ; 割込み許可にしてリターン

;********************************************************************
; 初期設定
;********************************************************************
INIT
    ; << PICの初期化 >>
     CLRF GPIO
     MOVLW 07h
     MOVWF CMCON
;■バンク1
     BSF STATUS,RP0 ;■バンク1に切替え

         CALL 3FFh ;OSCCAL Valueの読み込み
         MOVWF OSCCAL ;読み込んだ校正値をOSCCALレジスタにセット

     MOVLW  B'00011011'   ;0と1と3と4を入力にする
     MOVWF TRISIO
     MOVLW   B'00000001' ; ピン変化割り込み設定;0
     MOVWF IOC ; GP0:ピン変化割り込み有効

        MOVLW   B'00000111' ; OPTIONレジスタの設定
        MOVWF   OPTION_REG  ; T0CS:0 ,PSA:0 ,PS2-PS0:111

        BCF     STATUS,RP0  ; STATUSのRP0をクリア(0) → バンク0

;■バンク0
        BCF    STATUS,RP0 ;■バンク0に切替え

   MOVLW   B'10001000' ; ⑦GIE,③GPIE on
   MOVWF    INTCON

        BTFSC   GPIO,3
        GOTO    TMR0_SET_ZERO
        MOVLW   2          ;TMR0割り込み発生回数
        MOVWF   GP5FLG     ; 割込みカウンタの設定
        GOTO    CLR_FLG

TMR0_SET_ZERO
        MOVLW   12          ;TMR0割り込み発生回数
        MOVWF   GP5FLG     ; 割込みカウンタの設定

CLR_FLG
        CLRF    ICNT      ; TMR0割込み発生フラグクリア
        CLRF    GPIO       ; GPIOフラグをクリア
        CLRF    GP0FLG
        CLRF    TMR0        ; TMR0をクリア

        GOTO  MAIN
;********************************************************************
;    メイン処理
;********************************************************************
MAIN
        BTFSS   ICNT,0    ; TMR0割込み指定回数発生?
        GOTO    MAIN      ; NOならループ
        BCF     ICNT,0    ; YESならTMR0割込み発生フラグクリア

        BTFSS   GPIO,0
        GOTO    MAIN

        BCF     GPIO,5     ; GPIO,0 点灯
        MOVLW   B'10001000' ; ⑦GIE,⑤T0IE,③GPIE
        MOVWF INTCON       ;タイマー0を無効にする

        GOTO    MAIN        ; MAINに戻る

        END
 

Re: AD1PCFGについて

 投稿者:nekosan  投稿日:2014年11月19日(水)23時43分26秒
返信・引用
  > No.671[元記事へ]

> > Pin Diagramを見ると,例えば,16ピンは,AN0とRB0が共用になっていますので,
> > PIC24FJ128GB206 が,アナログ入力をオフにできないとも思えないのですが,
> > 何かアナログ入力をOFFにする方法があるのでしょうか?
> >
> > アナログをオフにする必要が無いのかもと思ったのですが,どうしても
> > プッシュスイッチの状態が読み込めない(つねにLow)状況で,どうしようもなくなって
> > しまいました。
> >


解決されたようでなによりです。

PICは、デフォルト値でADCになってるチップが
たくさんあるので(ADC搭載の全部?)、面倒が
ありますよね。
 

Re: AD1PCFGについて

 投稿者:matsu  投稿日:2014年11月18日(火)21時35分21秒
返信・引用
  > No.670[元記事へ]

お世話になっています。
以下の件,自己解決できました。

    //AD1PCFG = 0xffff;       //これは,このCPUでは使えない(A/Dをオフにできない)
    ANSB  = 0x0000;         // set all RB port to Digital(not a/d)

でOKでした。
PIC24FJ256GB210 Family Data Sheet.pdf
の,
ANSB: PORTB ANALOG FUNCTION SELECTION REGISTER
に掲載されていました。
日本語のマニュアルが,2007年になっていましたが,
上記,データシートは,2010年。
新しい方は,更新されていたようです。
ありがとうございました。


> いつもお世話になっています。お忙しいところ恐縮です。
>
> プルアップ設定した,ポートBに接続した,プッシュスイッチの入力ができないので,
> 調べたところ,アナログ入力をオフにしなければいけないことがわかりました。
>
> それで,
> AD1PCFG = 0xffff;       //全アナログピンをOFF
> としたのですが,
> コンパイラが,Unable to resolve identifire AD1PCFGというエラーをはき出します。
>
> 使っているCPUは,
> PIC24FJ128GB206
> です。
> それで,そのヘッダファイル
> p24FJ128GB206.h
> を開くと,確かにAD1PCFGがありません。
>
> また,
> PIC24FJ256GB210 Family Data Sheet.pdf
> のADC REGISTER MAPを見ても,
> AD1PCFGらしい設定がありません。
>
> Pin Diagramを見ると,例えば,16ピンは,AN0とRB0が共用になっていますので,
> PIC24FJ128GB206 が,アナログ入力をオフにできないとも思えないのですが,
> 何かアナログ入力をOFFにする方法があるのでしょうか?
>
> アナログをオフにする必要が無いのかもと思ったのですが,どうしても
> プッシュスイッチの状態が読み込めない(つねにLow)状況で,どうしようもなくなって
> しまいました。
>
 

AD1PCFGについて

 投稿者:matsu  投稿日:2014年11月18日(火)21時03分7秒
返信・引用
  いつもお世話になっています。お忙しいところ恐縮です。

プルアップ設定した,ポートBに接続した,プッシュスイッチの入力ができないので,
調べたところ,アナログ入力をオフにしなければいけないことがわかりました。

それで,
AD1PCFG = 0xffff;       //全アナログピンをOFF
としたのですが,
コンパイラが,Unable to resolve identifire AD1PCFGというエラーをはき出します。

使っているCPUは,
PIC24FJ128GB206
です。
それで,そのヘッダファイル
p24FJ128GB206.h
を開くと,確かにAD1PCFGがありません。

また,
PIC24FJ256GB210 Family Data Sheet.pdf
のADC REGISTER MAPを見ても,
AD1PCFGらしい設定がありません。

Pin Diagramを見ると,例えば,16ピンは,AN0とRB0が共用になっていますので,
PIC24FJ128GB206 が,アナログ入力をオフにできないとも思えないのですが,
何かアナログ入力をOFFにする方法があるのでしょうか?

アナログをオフにする必要が無いのかもと思ったのですが,どうしても
プッシュスイッチの状態が読み込めない(つねにLow)状況で,どうしようもなくなって
しまいました。
 

Re: こんなのあり?

 投稿者:nekosan  投稿日:2014年11月17日(月)01時12分44秒
返信・引用
  > No.668[元記事へ]

> ①TMR0を1msec程度でフリーランさせておく。
> ②入力GPIO変化で割り込みをかけて、ブリスケーラ値か減算カウンタ設定値を思い切り大きくしてTMR0の所要時間を延ばすと共に出力を変化させる。
> ③TMR0カウントアップの際に出力を戻し、またタイマー設定を戻し、TOIFフラグを消す。
>
> あるいはTOIFフラグは普段は消さず、割り込みさせないでスルーさせておき入力GPIO変化時のみ消す。←これでフリーラン中はTMR0割り込みも起こさない。
>
> ただ、これでも2チャンネル使用時(TMR0とTMR1併用)カウント中は他チャンネルの信号入力を受け付けないのでしょうか。
>
> シミュレータの資料が手元になくて、GPIOを変化させたときの動きがトレースする方法がわからないのが難儀です。
>
> MPLAB IDE8xxをやめて日本語マニュアルのあるMPLAB Xに行くかと思いましたがこれもドツボにはまるのが目にみえてます。



IDEを、複数同じPCにインストールすると、古い環境の
設定が壊されたりして、共存できなかったりすることも
あるので、ドツボにはまる可能性たかいですよね。
私は以前それではまったことがあるので、完全に新しい
IDEに乗りかえるか、別のPCに入れるか、どちらかにする
だろうなと思います。


タイマのプリスケーラを動作中に切り変えたりすると、
その動作がチップによって(というか搭載している
タイマ回路の構成によって)、ナイーブな動きを
しかねないので(カウンタが継続するのか、リセット
掛かるのかとかもろもろ)、この点もどうかなぁ、
という感じもします。シミュレータにバグが無ければ、
画面上で動作を追えるんですけどね。


タイマは、完全にフリーランにしてしまって、経過時間
の計測だけに使って(1/1000秒単位とか)、GPIOのセンス
はピンチェンジ割りこみではなく、ポーリングで見た方が、
処理はシンプルで楽におこなえそうな気がします…

タイマ割りこみをフリーランさせるだけなら、とりあえず
シミュレータを使わなくても、動作確認は出来るかと。


特にPICの場合、ハードウェア割りこみを複数要因で
発生させる場合、1回1回の継続性(リスタート掛ける
必要性など)とか、同時に複数割りこみトリガが発生した
場合の調停とか、他のCPUに比べて面倒な話が多いと思う
ので、このあたりはシミュレータで動作を追いこんで
行くか、そもそも複数割りこみを使わないか、というのが、
ラクチンに済ませられる気がします。

メイン処理側で、GPIOを直接読みとって、その値の変化と、
変化した時点の経過時刻(タイマ割りこみが発生した回数)
から、出力信号の有効/無効の切りかえをすれば、要件は
満たせるのではと。

この方法なら、チャンネル数を2つとか3つとかに増やしても、
メイン側で読みこむGPIO端子を増やしたり、各チャンネル
ごとの経過時間を保管しておくメモリを増やするだけで、
幾らでも増やせると思いますし。


1/1000秒単位で計算するとなると、16ビット幅でも65535/1000
なので、スタートからゴールまで約1分ちょっと(実際は、正負の
符号ビットも要るのでその半分の30秒ちょっと)までしか計測
できないので、24ビットが必要になりそうです。16ビット単位の
演算ライブラリとかだと足りないので、場合によっては引き算
処理とかを独自に計算する必要あるかもしれません。

まぁ、多桁の加減算はキャリーフラグ含めた加減算命令が
あれば、難なくできるので、24ビットでも32ビットでも
それほど大変ではなさそうですが。
(このクラスのPICに、キャリーを使った加減算命令があったか、
 忘れてしまいました。AVRは即値の加減算でキャリーが使えず、
 困ったことがありました)
 

こんなのあり?

 投稿者:初心者  投稿日:2014年11月15日(土)22時59分10秒
返信・引用
  > No.667[元記事へ]

nekosanさんへのお返事です。

いつもお世話になっております。

①TMR0を1msec程度でフリーランさせておく。
②入力GPIO変化で割り込みをかけて、ブリスケーラ値か減算カウンタ設定値を思い切り大きくしてTMR0の所要時間を延ばすと共に出力を変化させる。
③TMR0カウントアップの際に出力を戻し、またタイマー設定を戻し、TOIFフラグを消す。

あるいはTOIFフラグは普段は消さず、割り込みさせないでスルーさせておき入力GPIO変化時のみ消す。←これでフリーラン中はTMR0割り込みも起こさない。

ただ、これでも2チャンネル使用時(TMR0とTMR1併用)カウント中は他チャンネルの信号入力を受け付けないのでしょうか。

シミュレータの資料が手元になくて、GPIOを変化させたときの動きがトレースする方法がわからないのが難儀です。

MPLAB IDE8xxをやめて日本語マニュアルのあるMPLAB Xに行くかと思いましたがこれもドツボにはまるのが目にみえてます。


>
> プログラムを細かく追ったわけではないので、詳細は
> わかりませんが、割り込みベクタが1組しかないマイコン
> で、ピンチェンジ割り込みとタイマー割込みを併用すると、
> 多重割り込みで、色々な関連レジスタ、関連フラグが微妙
> に影響しあうので、とりあえず、1ステップずつステップ実行
> しながら、関連するレジスタのビット変化やブランチ文の
> 分岐が想定通りに動くか確認してみるのが、近道かなと思います。
> (ブレークポイント仕掛けてループでもいいですが)
>
> シミュレーションの際に、タイマー0、ピンチェンジ割り込み、
> フラグレジスタ、INTCON辺り(GIEのオン/オフなど)を集中
> して、変化を眺めてみれば、各命令ごとに、想定していない
> 動作がどこかで発生するのが拾えるのではないかと。
>
>
> もしくは、別の処理方法として、タイマ割り込みの方は
> フリーランにさせておいて、周期的に1ずつカウントアップ
> しておいて経過時間カウントに使用し、メインルーチン側で
> GPIOの変化をポーリングでチェックする、と言う形にして、
> 割り込み処理はタイマのみ、という風にするのもありかなと。
>
> なにしろ、ひとつの割り込み処理ルーチンで、別の割り込み
> 要因の処理を振り分けすると、多重割り込みの動作が複雑に
> なりがちだし、制御ビットの1個だけが狂っても全体がうまく
> 動かなくなるので、色々厳しいかと。
>
> あと、この世代のPICは、1個のCPUで処理させてみて、うまく
> 行かないなぁと、別のCPUに切り替えてみるか…ということを
> やり始めると、CPUによってハード構成やSFRのメモリマップ
> や微妙な動作とかも変わってたりすると思うので、切り替えた
> ほうのCPUのクセに引っかかって、新たな問題を掘り起こす的な
> こともあると思うので、多分動くまで(もしくは絶対動かない
> と判断されるまで)は、CPUは変えない方が良さそうに思います。
>
> AVRだと、CPUコア周りやSFRのメモリマップは、大体同じなので、
> それで困ることがないんですけどね…
>
 

レンタル掲示板
/79