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

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


たぶんタイミングでしょうね。

 投稿者:初心者  投稿日:2014年12月 2日(火)22時05分12秒
返信・引用
  nekosanさま
ロータリースイッチの接触のわずかなズレのためでしょうね。
驚きです。

PWRTE ONで72ミリ秒遅延するようなので、「あっ」という間には違いないんですが。
 
 

Re: PWRTEの罠。

 投稿者:nekosan  投稿日:2014年12月 2日(火)21時55分14秒
返信・引用
  > No.685[元記事へ]

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

> nekosanさんへのお返事です。
>
> いつもお世話になっています。
> PICが熱くなり、調べたらGPIO4だけで30ミリアンペアほど流れていました。
>
> PWRTE ONの設定で直りました。
>
> ノイズの乗りそうな機器では別電源やフォトカプラでの信号のやりとりが必要かもしれませんね。
>
> もっともクロックモジュールからもFMラジオにノイズが乗りますけどね。
>
> 地デジになってよかったです。
> アナログテレビでは近所に文句いわれたでしょうね。


GPIOの動作が、PWRTEの設定だけで直ってしまう
んですねぇ。リセット時のデフォルト値への
設定が機能してなかったんですかね?

突然、再現したりすると、なんか怖い気もする
んですが…

 

Re: PWRTEの罠。

 投稿者:初心者  投稿日:2014年12月 1日(月)21時21分22秒
返信・引用
  > No.684[元記事へ]

nekosanさんへのお返事です。

いつもお世話になっています。
PICが熱くなり、調べたらGPIO4だけで30ミリアンペアほど流れていました。

PWRTE ONの設定で直りました。

ノイズの乗りそうな機器では別電源やフォトカプラでの信号のやりとりが必要かもしれませんね。

もっともクロックモジュールからもFMラジオにノイズが乗りますけどね。

地デジになってよかったです。
アナログテレビでは近所に文句いわれたでしょうね。
 

Re: PWRTEの罠。

 投稿者:nekosan  投稿日:2014年12月 1日(月)01時03分45秒
返信・引用
  > No.683[元記事へ]

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

> いつもお世話になっております。
> ソフトもできたので組み込んでみたら、電源オン時のGPIOによる選択がうまくいかず、あげくに暴走まで。
>
> テスト回路では動くのに、と半日悩みましたが結論はロータリースイッチの接触時間遅れ。
> (電源回路端子の接触よりも先にGPIO端子の接触が先だった模様)
> PWRTE設定をONにして起動時スリープさせるようにして動くようになりました。
>
> 奥が深いですね。 参りました。


起動時にうまく動作しないのは、リセット回路周りか、
電源回路の安定性に原因があるかもしれません。

特に、大電流を使用する機器を、マイコンと並列に
接続してしまっていると、起動時にそっちに電流を
取られるせいで、電圧が瞬間的に急落したり、電圧が
不安定になったりしているのかも…

テスト回路(多分周辺回路を付けてない状態)でうまく
動いて、実機に色々繋いだら動かないのは、とりあえず
そのアタリが気になります。

もし、大電流を消費する部品(光電管?)を、マイコン
用の電源にパラレルに繋いでいるのであれば、安定する
までの間を、PWRTE有効でリセット状態を維持する方法も
あるかと思いますが、マイコン用の電源(レギュレータ
ICなど)をマイコン専用に分離するなども。
 

PWRTEの罠。

 投稿者:初心者  投稿日:2014年11月30日(日)21時13分58秒
返信・引用
  いつもお世話になっております。
ソフトもできたので組み込んでみたら、電源オン時のGPIOによる選択がうまくいかず、あげくに暴走まで。

テスト回路では動くのに、と半日悩みましたが結論はロータリースイッチの接触時間遅れ。
(電源回路端子の接触よりも先にGPIO端子の接触が先だった模様)
PWRTE設定をONにして起動時スリープさせるようにして動くようになりました。

奥が深いですね。 参りました。
 

Re: お恥ずかしい・・・

 投稿者:nekosan  投稿日:2014年11月28日(金)00時19分20秒
返信・引用
  > No.681[元記事へ]

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

> 分岐を手直ししました。
> シミュレータで動かして・・・あれ?
> ということで。
>
> CH_SELECT
>         BTFSS   GPIO,3
>         GOTO    CH_SELECT_0
>         GOTO    CH_SELECT_4
>
> CH_SELECT_4
>         BCF     CHSEL,0
>         GOTO    MAIN
>
> CH_SELECT_0
>         BSF     CHSEL,0
>         GOTO  MAIN


シミュレータ、馴れたのですね。
 

お恥ずかしい・・・

 投稿者:初心者  投稿日:2014年11月27日(木)07時57分2秒
返信・引用
  分岐を手直ししました。
シミュレータで動かして・・・あれ?
ということで。

CH_SELECT
        BTFSS   GPIO,3
        GOTO    CH_SELECT_0
        GOTO    CH_SELECT_4

CH_SELECT_4
        BCF     CHSEL,0
        GOTO    MAIN

CH_SELECT_0
        BSF     CHSEL,0
        GOTO  MAIN
 

Re: 一応できました・・・がしかし

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

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

> nekosan様
>
> いつも貴重なアドバイスをいただきありがとうございます。
>
> 結論からいいますと、タイマー0割り込みとGPIO割り込みを2セット併用できました。
> 根本的によくわかってないと言うことですね。
>
> で、次にGPIO入力のうち片方を初期設定で切り替えようとしたのですが、
>
>         GPSEL   EQU 41h
>
>         BTFSS   GPIO,3
>         BSF     GPSEL,0
>         BCF     GPSEL,0
>
> 位置はINITにおきましたが切り替わりません。
> 単にBSF  GPSEL,0 か BCF GPSEL,0だけにすると指定通り切り替わります。
> またお知恵をお借りできれば幸いです。
>



ビット操作命令を連続するとうまく行かないというのは、
以前の
http://8528.teacup.com/nekosan0/bbs/664
ポート入出力と同じなのではないかと思います。

SFRにも因るかもしれませんが、ソフト側、ペリフェラル側
など複数の要因で書き換えられるビットは、どこかのタイミング
で必ずシンクロさせないといけないので、このような
「複数要因で更新」されるビットを含むSFR(内部では多分
8ビット単位で更新される)の読み書きではシンクロナイザを
挟む都合、読み出しに反映されるまでのタイムラグが生じるかと
思います。

どのSFRがそうなるのかは、内部回路次第かもしれませんし、
もしかしたらすべてのレジスタがそうなっているかもしれません
が、よくわかりません。(型番によってもマチマチかも)

ので、PICの場合、「読み出し」「書き込み」両方で使うレジスタ
の場合、間に一律「NOP」を挟んでしまうのがよいかもしれません。

 

一応できました・・・がしかし

 投稿者:初心者  投稿日:2014年11月26日(水)22時22分19秒
返信・引用
  nekosan様

いつも貴重なアドバイスをいただきありがとうございます。

結論からいいますと、タイマー0割り込みとGPIO割り込みを2セット併用できました。
根本的によくわかってないと言うことですね。

で、次にGPIO入力のうち片方を初期設定で切り替えようとしたのですが、

        GPSEL   EQU 41h

        BTFSS   GPIO,3
        BSF     GPSEL,0
        BCF     GPSEL,0

位置はINITにおきましたが切り替わりません。
単にBSF  GPSEL,0 か BCF GPSEL,0だけにすると指定通り切り替わります。
またお知恵をお借りできれば幸いです。

以下全文

LIST P=12F629
INCLUDE P12F629.INC

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

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

save_st EQU     2Ch         ; STATUSのセーブ領域
save_w  EQU     2Dh         ; W-regのセーブ領域
ICNT    EQU     2Eh         ; TMR0割込みまでのカウント設定
ICNT1   EQU     31h        ; TMR1割込みまでのカウント設定
GP0FLG  EQU     33h
GP1FLG  EQU     34h
GP2FLG  EQU     35h
GP5FLG  EQU     36h      ; TMR0割込み指定回数でフラグ
GP4FLG  EQU     37h
GPSEL   EQU     41h
CNT3    EQU     42h
CNT4    EQU     43h
;********************************************************************
; プログラム開始
;********************************************************************
ORG 00H ;RESETの入口
GOTO INIT ;初期設定へ
ORG 04H ;割込みの入口
GOTO WARIKOMI_START;割込み処理ルーチンへ
ORG 08H ;メインプログラム


;********************************************************************
; 初期設定
;********************************************************************
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'00011011' ; ピン変化割り込み設定;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'10101000' ; ⑦GIE,③GPIE on
   MOVWF    INTCON

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

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

GP_SEL
        CALL TIME_10mSEC

        BTFSS   GPIO,3
        BSF     GPSEL,0
        BCF     GPSEL,0

        CALL TIME_10mSEC
        GOTO  MAIN

;********************************************************************
; 割込みルーチン
;********************************************************************
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_CHSEL
        BTFSS GPSEL,0
        GOTO  WARIKOMI_GP0
        GOTO  WARIKOMI_GP4

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

WARIKOMI_GP0A
        BSF   GPIO,5        ;点灯(負論理)
        BSF   GP0FLG,0
        GOTO   WARIKOMI_GP1

WARIKOMI_GP4
        BTFSS GPIO,4 ;1→0の変化のみ拾う
        GOTO  WARIKOMI_GP4A
        GOTO  WARIKOMI_GP1

WARIKOMI_GP4A
        BSF   GPIO,5        ;点灯(負論理)
        BSF   GP0FLG,0
        GOTO   WARIKOMI_GP1

WARIKOMI_GP1
        BTFSS GPIO,1 ;1→0の変化のみ拾う
        GOTO  WARIKOMI_GP1A
        GOTO  WARIKOMI_END

WARIKOMI_GP1A
        BSF GPIO,2        ;点灯(負論理)
        BSF GP1FLG,0
        GOTO   WARIKOMI_END

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

        BSF     ICNT,0    ; TMR0割込みフラグをセット

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

        GOTO    TMR1_WARIKOMI

TMR0_SET_A
        MOVLW   16
        MOVWF   GP5FLG     ; 割込みカウンタの設定
        GOTO    TMR1_WARIKOMI

TMR1_WARIKOMI;GPIO,0が0になった時作動
;        BCF     INTCON,T0IF ; 割込みフラグクリア

        BTFSS   GP1FLG,0
        GOTO    WARIKOMI_END

        DECFSZ  GP2FLG,F
        GOTO    WARIKOMI_END

        BSF     ICNT1,0    ; TMR0割込みフラグをセット

        BTFSC   GPIO,3
        GOTO    TMR1_SET_A
        MOVLW   4
        MOVWF   GP2FLG     ; 割込みカウンタの設定

        GOTO    WARIKOMI_END

TMR1_SET_A
        MOVLW   16
        MOVWF   GP2FLG     ; 割込みカウンタの設定

        GOTO    WARIKOMI_END


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

;********************************************************************
;    メイン処理
;********************************************************************
MAIN
        BTFSS GPSEL,0
        GOTO  MAIN0
        GOTO  MAIN4

MAIN0
        BTFSS   ICNT,0    ; TMR0割込み指定回数発生?
        GOTO    MAIN1      ; NOならループ
        BCF     ICNT,0    ; YESならTMR0割込み発生フラグクリア

        BTFSS   GPIO,0

        GOTO    MAIN1

        BCF     GPIO,5     ; GPIO,0 点灯
        BCF   GP0FLG,0

        GOTO    MAIN1        ; MAINに戻る

MAIN1
        BTFSS   ICNT1,0    ; TMR0割込み指定回数発生?
        GOTO    MAIN      ; NOならループ
        BCF     ICNT1,0    ; YESならTMR0割込み発生フラグクリア

        BTFSS   GPIO,1
        GOTO    MAIN

        BCF     GPIO,2     ; GPIO,0 点灯
        BCF     GP1FLG,0

        GOTO    MAIN        ; MAINに戻る

MAIN4
        BTFSS   ICNT,0    ; TMR0割込み指定回数発生?
        GOTO    MAIN4A      ; NOならループ
        BCF     ICNT,0    ; YESならTMR0割込み発生フラグクリア

        BTFSS   GPIO,4

        GOTO    MAIN4A

        BCF     GPIO,5     ; GPIO,0 点灯
        BCF   GP0FLG,0

        GOTO    MAIN4A        ; MAINに戻る

MAIN4A
        BTFSS   ICNT1,0    ; TMR0割込み指定回数発生?
        GOTO    MAIN      ; NOならループ
        BCF     ICNT1,0    ; YESならTMR0割込み発生フラグクリア

        BTFSS   GPIO,1
        GOTO    MAIN

        BCF     GPIO,2     ; GPIO,0 点灯
        BCF     GP1FLG,0

        GOTO    MAIN        ; MAINに戻る

;********************************************************************
TIME_10mSEC  ;使っていません
        MOVLW   014H      ;20
        MOVWF   CNT3      ;書き込み
DLP1A;1mS
        MOVLW   0FAH      ;250をCNT2に書き込み
        MOVWF   CNT4      ;

DLP2A
        NOP
        DECFSZ  CNT4,F
        GOTO    DLP2A     ;CNT2Aがゼロになるまで繰り返す
        DECFSZ  CNT3,F    ;CNT1AがゼロになったらDLP1へ
        GOTO    DLP1A

        RETURN
;********************************************************************

        END

 

Re: pic内のflach memory

 投稿者:matsu  投稿日:2014年11月26日(水)01時00分59秒
返信・引用
  > No.676[元記事へ]

nekosan様,
PICマイコンのプログラムで,プログラムエリアの書き換えも可能であり,
容量が足りるなら,内蔵EEPROMを使えば手っ取り早くできる,
との情報,ありがとうございます。プログラムエリアの未使用領域は,
ハードルが高そうですが,EEPROMの方でチャレンジしてみます。
せいぜい,10バイトほどなので,十分容量は足りると思います。
ありがとうございました!


> matsuさんへのお返事です。
>
> > いつもお世話になっています。
> >
> > こういったことって,可能なのでしょうか?
> > 次回パワーオン時のために,一時的にメモリにデータを保存しておきたいのですが,
> > 内部のフラッシュメモリで,プログラム保管に使ってないエリアにデータを書き込むこと
> > って,PICは可能なのでしょうか? 記憶させたいのは,数バイトから数十バイトくらいです。
> >
> > configに,Write Protection Flash Pageなど,Write Protectionと書かれたconfig設定が
> > いくつかあるので,気になっています。I2C接続のEEPROMを増設しようかと思って
> > いたのですが,もしPIC自身が持つフラッシュromエリアにPIC自身が書き込みができるなら,
> > その方がハードが楽なので,そもそもできるのかどうか・・・。
> >
> > H8からPICに乗り換えて,いろいろ戸惑うことが多く,お知恵をお借りできると助かります。
> > よろしくお願いいたします。
> >
>
>
> PIC全般かどうか判りませんが、一般的なマイコンでは、
> ブートローダ機能を搭載しているマイコンなら、自己書き換え
> のために、プログラムメモリを書き換える機能が付いている
> かとおもいます。逆に、ブートローダが載ってないマイコン
> の場合は、付いてないかもしれません。
>
> プログラムメモリの内容を(定数テーブルなどの様に)読み出す
> ことは、どのマイコンでも普通は可能になっていると思います。
>
>
> プログラムメモリではなく、内蔵EEPROMでメモリ量的に足りる
> のなら、EEPROMを使うのが手っ取り早いのではないでしょうか?
>
> なお、EEPROMも、プログラムメモリも、読み出しは一般的な
> マイコンでは、短時間(1~数クロック)で済むと思いますが、
> 書き込みはどちらも結構な時間が掛かるはずです。
> (SRAMほど簡単にアクセスは出来ないようになっているかと)
>
 

レンタル掲示板
/79