• 締切済み
※ ChatGPTを利用し、要約された質問です(原文:PIC12F675 の入力読み込み が正しく出来…)

PIC12F675の入力読み込みができない

このQ&Aのポイント
  • PIC12F675の入力読み込みについて問題が発生しています。
  • GP3がLOの時、GP2を一定時間LOレベルにし、その後何度もLO/HIを繰り返しています。
  • コンパレータ機能や割り込み発生の設定にも注意していますが、まだ解決できていません。

みんなの回答

noname#230359
noname#230359
回答No.2

GP3が挙動不振な動作をしているとなると、デジタルI/Oポートに設定されていないのではと疑いたくなります。 Configuration bitsのMCLREは正しく設定していますか? (データシート 9.1 Configuration Bits参照) 私の回答の書き方があいまいで、誤解されているようにも読み取れるので補足します。 「デジタルI/Oポートに設定されていないのでは~」の趣旨は、「GP3ポートは、MCLRの機能を備えているのでANSELの設定に加え、"__CONFIG _MCLRE_OFF"を行わないとデジタルI/Oポートにならない」です。 データシートのブロックダイヤによれば、MCLRE_ON状態でGP3を読み出すと常に"0"となることから、 >>(1) Q出力がHIのとき ?PICはGP3がLOであると判断して... >> はいオシロスコープを借用してGP3(04ピン)を観測しましたがHIレベルに の状態に合致すると推測しました。 プログラムのコンフィグ文で"_MCLRE_OFF"を指定しているならば、私の推測は外れということになります。

noname#230358
質問者

お礼

JO_O さん イシさん ありがとうございます ”何度でもLO/HI を繰り返しています” は一回だけLO/HI(JK-FFのクロックとして)の変化をさせたいのですがそうはならず何度も繰り返します お二人ともGP3入力が怪しい! のご指摘です。 デジタルIO設定は質問時のようにしていますので先ず大丈夫と思っています MCLREのほうもプログラム先頭部分とPICデータ書込み時書込み設定をしていますので多分大丈夫と思います。 GP3の切り離し ヒゲ ステップ毎の挙動監視を進めます ただお二人には早速アドバイスを頂いていながら恐縮ですが本業で 済ませなければいけないことが出てきました そちらを先に手をつけなければいけませんので結果が出るまで一寸時間が掛かりそうでいます。 すみませんが宜しくお願いします。 

全文を見る
すると、全ての回答が全文表示されます。
noname#230359
noname#230359
回答No.1

毎度JOです。 PIC12F675 データシート http://ww1.microchip.com/downloads/en/DeviceDoc/41190E.pdf 幾つか教えて下さい。 >>Q出力がHIのとき ?PICはGP3がLOであると判断して  実際にテスターやオシロでHIと確認しましたか? JK-FFの型番は? スレーブ型? トリガ型?? このJK-FFにパスコンは入っていますか? JK-FFにはクリアー又はリセット或いはプリセット端子が出ていますが接続先は? 毎度JOです。 GP3  ↓ GP2 GP3がLの時100mSのLパルス(繰り返し??)  ↓ FF(CK)  ↓  Q JKがHですからCKを分周する事になる  ↓ GP3 何の為のループかわかりませんが、 >>LO/HI操作を一度通過した後何度でもLO/HI を繰り返しています  仮にGP3が連続Lの時、プログラム上でLO/HIを繰り返すループに入っているのですか? そのようなプログラム?? このようなループ回路をデバッグする場合、どこかで切り分ける必要があります、わずかな「ひげ状」のパルスでも反応してしまいます、 ループの各所を一箇所づつ挙動を監視する事になります、 今回の症状としてLO/HIを繰り返すのであれば、GP3の入力を疑ってみる所からスタートですね、 QとGP3を切り離して、GP3をHに固定して様子を見るとかですかね?   毎度JOです。 遅くなっても結構ですから結果の報告をして下さい、回答者としても気になるところです、 又、結果を投稿する事により過去ログとしてデータベースの一部となります、 今後質問される方の参考にもなりますね。  

参考URL:
http://ww1.microchip.com/downloads/en/DeviceDoc/41190E.pdf
noname#230358
質問者

お礼

JO_O さん イシさん ありがとうございます ”何度でもLO/HI を繰り返しています” は一回だけLO/HI(JK-FFのクロックとして)の変化をさせたいのですがそうはならず何度も繰り返します お二人ともGP3入力が怪しい! のご指摘です。 デジタルIO設定は質問時のようにしていますので先ず大丈夫と思っています MCLREのほうもプログラム先頭部分とPICデータ書込み時書込み設定をしていますので多分大丈夫と思います。 GP3の切り離し ヒゲ ステップ毎の挙動監視を進めます ただお二人には早速アドバイスを頂いていながら恐縮ですが本業で 済ませなければいけないことが出てきました そちらを先に手をつけなければいけませんので結果が出るまで一寸時間が掛かりそうでいます。 すみませんが宜しくお願いします。 

noname#230358
質問者

補足

いつものことながら早速ありがとうございます (1) Q出力がHIのとき ?PICはGP3がLOであると判断して...    はいオシロスコープを借用してGP3(04ピン)を観測しましたがHIレベルに あってヒゲのような信号の乱れはみあたりません にも関わらず(これまで の所業からあまり力を入れられないのですが)PIC内部ではLOレベルと判断 している様子です (2) JK-FFの型番は 74LS107 立下りトリガです (3) このJK-FFのためにだけということでなくACアダプターからの5Vに対して 47UF電解コンデンサと0.1UFセラミックを各1ケ入れています ICは74LS107 1ケとTLP621-2が1ケの2ケです  (4) クリアー端子は10Kの抵抗でプルアップし0Vに向かって0.1UFのセラミックコ ンデンサを繋いでいます 以上ですが いかがでしょうか

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PICのプログラム

    PICのテストプログラムを作ったのですが、LEDの点灯が、順々に動くプログラムのはずがすべてのLEDが同時に着いてしまいます。なぜですか???? とても困っています。誰か教えてくれたらありがたいです。 PICは、16F877Aです。 ポートDにLEDがついています。 TITLE "QUARK Test1 PICUN1" LIST p=PIC16F877A __CONFIG _HS_OSC & _CP_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _WRT_OFF & _DEBUG_OFF #INCLUDE "P16F877A.inc" __IDLOCS D'1' matu EQU 020H matu2 EQU 021H matu3 EQU 022H main ORG 0 clrf STATUS clrf INTCON bsf STATUS,RP0 clrf TRISA clrf TRISB clrf TRISC clrf TRISD clrf TRISE clrf STATUS clrf PORTD clrf matu clrf matu2 clrf matu3 mainloop bsf PORTD,2 call matuloop3 bcf PORTD,2 call matuloop3 goto mainloop ;この後にmatuloop1~3が続く。 END よろしくお願いします。

  • PIC12F615でGP5が使えません(T_T)

    お世話になりますm(_ _)m PICマイコン初心者です(^^;) MPLAB IDE v8.80で、C言語でプログラムして、 PICkit3を使ってPIC12F615に書き込んでいます。 GP2にスイッチ、GP5にLEDを接続して、スイッチを押すとLEDが点灯するプログラムです。 これだけなら、普通にGP5は利用できます。 タイトルの「GP5が使えない」というのは、 このプログラムに、 割り込みを使用するために INTE=1; を書き込むと何故か、GP5が使えなくなります。 入力も出力も出来ません。 どなたか分かる方、よろしくお願い致しますm(_ _)m ↓プログラム↓ ---------------------------------------------------------------- #include <htc.h> __CONFIG(OSC_4MHZ & UNPROTECT & MCLREN & PWRTEN & WDTDIS & INTIO & BORDIS); void main(void) { //PIC12F615仕様  CMCON0 = 0x07 ; //コンパレート無効化  ANSEL = 0x00 ; //全てデジタル  TRISIO = 0b00001100 ; //入力出力設定  WPU = 0b00000100; //プルアップビット指定  GPPU = 0; //プルアップ有効化  GPIO = 0 ; //各ピンデフォルト値  INTEDG = 0; //INT割り込み立ち下がりエッジ  INTE = 1;  GIE = 1;  while(1)   {    if(!GP2) GP5=1; else GP5=0;   } } ----------------------------------------------------------------

  • PIC12F683 AD変換について

    PIC12F683のアセンブラの設定についてご教授ください。 以下のように設定したところGP4ピンにてAD変換できませんでした。 init MOVLW   07h MOVWF   CMCON0 BSF     STATUS,RP0 MOVLW   b'00111000' MOVWF   TRISIO MOVLW   070h MOVWF   OSCCON MOVLW   018h MOVWF   ANSEL BCF     STATUS,RP0 MOVLW   b'10001101' MOVWF   ADCON0 「MOVLW 018h」の行を削除すると問題なくAD変換動作します。 しかしその場合「ANSEL」に070hが入るのでGP4がデジタル 入出力になり動作しない用に感じますが、なぜか動作します。 動作するので問題はないのですが、なぜかすっきりしません。 原因が分る方がおられましたら教えていただけますでしょうか? .

  • PIC16F819とMAX232Cについて困っています。

    まだ駆け出しでわからないことだらけで、以下のプログラムをふまえてPIC16F819とMAX232C(RS232C?)を接続したいのですが、どうプログラム(アセンブラ)を追加したら、また回路的にどうしたらいいのかわからないので教えてください。以下のプログラム(コメント省略)は、電圧変化により出力(LEDの点灯数の変化)を行ったものです。 LIST p=PIC16F819 #include <P16F819.inc> __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _LVP_OFF AD_DATA_H EQU 20h AD_DATA_L EQU 21h WAITCOUNT EQU 22h ORG H'00' GOTO START ORG H'04' GOTO START ;------------------------------ ; 初期設定 ;------------------------------ START BSF STATUS, RP0 BCF ADCON1, ADFM BCF ADCON1, ADCS2 BSF ADCON1, PCFG3 BSF ADCON1, PCFG2 BSF ADCON1, PCFG1 BCF ADCON1, PCFG0 MOVLW B'00000001' MOVWF TRISA MOVLW B'00000000' MOVWF TRISB BCF STATUS, RP0 CLRF ADCON0 CLRF PORTA CLRF PORTB ;------------------------------- ; メインルーチン ;------------------------------- MAIN CALL AD_CONVERT MOVLW b'10000000' SUBWF AD_DATA_H, W BTFSC STATUS, C GOTO V_UPPER_HALF GOTO V_LOWER_HALF V_UPPER_HALF MOVLW b'11000000' SUBWF AD_DATA_H, W BTFSC STATUS, C GOTO V_3_4 GOTO V_1_2 V_LOWER_HALF MOVLW b'01000000' SUBWF AD_DATA_H, W BTFSC STATUS, C GOTO V_1_4 GOTO V_ZERO V_3_4 MOVLW b'00000111' MOVWF PORTB GOTO MAIN V_1_2 MOVLW b'00000011' MOVWF PORTB GOTO MAIN V_1_4 MOVLW b'00000001' MOVWF PORTB GOTO MAIN V_ZERO MOVLW b'00000000' MOVWF PORTB GOTO MAIN ;--------------------------------- ; A/D 変換サブルーチン ;--------------------------------- AD_CONVERT MOVLW B'10000001' MOVWF ADCON0 CALL WAIT_100U BSF ADCON0, GO BTFSC ADCON0, GO GOTO ADLOOP MOVF ADRESH, W MOVWF AD_DATA_H MOVF ADRESL, W MOVWF AD_DATA_L RETURN ;------------------------------------------------------------ ; 100usec ( 100usec = 0.2u/Cycle at 20MHz x 500 ) ;------------------------------------------------------------ WAIT_100U MOVLW D'165' MOVWF WAITCOUNT WAIT_100UL DECFSZ WAITCOUNT,F GOTO WAIT_100UL RETURN END 長くなりましたがご教授どうかお願いします。

  • PIC12F683 のULPW機能につきまして

    PIC12F683の機能のUltra Low-Power Wake-up の機能使おうとこちらhttp://www.picfun.com/pic26.htmlを参考にさせていただいて、GP0に抵抗と、コンデンサをR=200Ω、C=0.1μFで動かしてみました。 取りあえずは動作した(オシロできちんとのこぎりの波形を確認でました)のですが、しばらくすると、GP0がHiの状態のままになってしまいます。 このような現象を経験された方はいないでしょうか? 情報があれば助かります。 この動作を行うためのプログラムは以下のようにしてみました。 (MikroCを使っています) *****************************************************/ #define _ON 1 #define _OFF 0 #define _INPUT 1 #define _OUTPUT 0 #define SIG GPIO.F1 #define PWR GPIO.F5 void interrupt() { // 全体割り込み停止しているので、GPIO.1pin に変化があっても、ここの関数は呼び出されない if (INTCON.GPIF) { INTCON.GPIF = 0; // Port Change Interrupt Flag clear // GPIO.F1 = 1; // delay_ms(700); // 700ms LED ON // GPIO.F1 = 0; } } void opl_sleep() { INTCON.GIE = 0; //全体割り込みは停止 IOC = 0b00000001; // Interrupt pin GP0 only //1pinだけ検知する。 INTCON.GPIF = 0; // Port Change Interrupt Flag clear INTCON.GPIE = 1; //Enables the GPIO port change interrupt //ポート割り込み有効にすればsleepから復帰 TRISIO.F0 = _INPUT; // Input PCON.ULPWUE = _ON; SIG = _OFF; // Low sleep_start: asm{ nop nop nop nop sleep nop nop nop nop } INTCON.GPIE = 0; // disable GPIO port change interrupt INTCON.GPIF = 0; // Port Change Interrupt Flag clear //場合によっては、ここにチャタリング処理(wait)を入れると良い // INTCON.GIE = 1; } void _FloatValToStr( float val, char* str ) { unsigned char ch = 0x00; int val2; val2 = val * 1000; // val2 = val; ch = (val2 / 1000) % 10; // extract 1.0 volts digit str[0] = 48+ch; // write ASCII digit at cursor point str[1] = '.'; ch = (val2 / 100) % 10; // extract 0.1 volts digit str[2] = 48+ch; // write ASCII digit at cursor point ch = (val2 / 10) % 10; // extract 0.01 volts digit str[3] = 48+ch; // write ASCII digit at cursor point ch = val2 % 10; // extract 0.001 volts digit str[4] = 48+ch; // write ASCII digit at cursor point str[5] = 0x00; } void _CheckADC() { short i; double adc; double val = 0; char str[10]; //センサー信号取り込み ( Vref=3.0V : 実測値 ) adc = Adc_Read(2); val = (double)( adc * 300 ) / 1023; val = val / 100; // _FloatValToStr( val, str ); if ( val > 2.5 ) { // センサーに圧が掛かった! PWR = _ON; Delay_ms( 2000 ); PWR = _OFF; } } void main() { unsigned int co; ANSEL = 0b00100; // Configure AN pins as digital // CMCON = 7; // Turn off the comparators OSCCON = 0b01110000; // クロックを8Mhzに設定する。 CMCON0 = 0b00000111; // コンパレータ使用しない PCON = 0b00100000; // Ultra Low-Power Wake-up enabled TRISIO = 0b00000101; //GP0 pin input GPIO = 0; OPTION_REG.NOT_GPPU = 0; //GPIO pull-ups are enabled //内部弱プルアップに設定する WPU = 0b00000001; //PULL-UP REGISTER setting ,only GP0 pull-up SIG = _OFF; while( 1 ) { TRISIO.F0 = _OUTPUT; // Output GPIO.F0 = _ON; // Hi delay_ms(10); /*** for(co=0;co<10;co++){ //500ms だけLEDをピカピカッとやる GPIO.F1 = ~GPIO.F1; delay_ms(50); } **/ opl_sleep(); //SLEEPへ SIG = _ON; _CheckADC(); delay_ms(40); } }

  • PIC12F675 GPIO入出力について

     現在、PIC12F675にてA/D変換、EEP- W/R,TMR0を使ったプログラムを作成しているのですが、GPIOの入出力がおかしくTMR0、GP0~2が正常に動作しません。   ●各PINの使用状況・・・ ・GP0/出力(H/L) ・GP1/出力(H/L) ・GP2/TMR0 ・GP3/入力(S/W) ・GP4/入力(A/D変換) ・GP5/出力(H/L) ●開発環境   ・MPLAB IDE V8.40   ・デイバイス PIC KIT1 MPLAB IDEのファイルレジスタとウォッチのウインドウでデバッグしていて気づいたのですが、SFRアドレス00H~05Hまでの変化がそのままGPポートの変化へとつながっており、GP0がRestricted Memoryicted Memoryが表示され、SIMでRUNさせてみるとプログラムでは「BSF」でGP0を出力してもGPIOの0ビット目は変化しません。 GP2も変化がなくTMR0も動作していない様です。  もちろんBANK1でTRISIOの設定(B'00011000')は行っています。 自己解決を試みましたが万策尽きて投稿させていただきました。 恐れ入りますが何方かご教授いただけましですでしょうか。  

  • PIC 16F877A 出力電圧が60Hz発振してしまう

    PIC 16F877A にてLED点灯回路およびプログラムを作成して動作させてみたのですが、LEDが点灯せず困っています。 LED投入電圧が不安定なため、周波数を測定したところ、出力電圧が約60Hzで発振していることが分かりました。考えられる原因・対策を教えて頂けませんでしょうか? よろしくお願いいたします。 <備考> ・はじめてのPICアセンブラ入門(CQ出版社) p67-76に沿って作りました。 ・LEDへの出力は15,24ピンから出しています。 ・振動子はパナソニック, EFOEC8004A4, Resonator, (8MHz)を13,14ピンにつけています。 ・以下ASMファイルの内容です。 list p=16f877a ;pic16f877a pgm declare #include p16f877a.inc ;read header file of pic 16f877a __config _HS_OSC & _CP_OFF & _PWRTE_OFF & _WDT_OFF & _LVP_OFF ; initialization bcf STATUS, RP0 bcf STATUS, RP1 ;set bank0 clrf PORTC ;set0 to prevent from LED light clrf PORTD ;output 0 clrf PORTE ;output 0 bsf STATUS, RP0 ;set bank1 clrf ADCON1 ;set PORTA analog input movlw 0xff movwf TRISB ;set PORTB digital input bcf OPTION_REG, NOT_RBPU ;enable PORTB weak pull-up clrf TRISC ;set all ports for output clrf TRISD clrf TRISE bcf STATUS, RP0 ;set bank0 ; initialization finished ; led on movlw B'00100001' movwf PORTC goto $ ;endless loop end

  • PIC16F877を用いたC言語でのAD変換について

    PICを用いてAD変換をしようとしていますが,思うように出力が出ず困っています. 可変抵抗を用いて0-5V間を調整可能な入力をAN0ピンに接続し,AD変換の結果をBポートに出力しようとしています. 使用条件は,mikroC使用,PIC16F877使用,C言語使用,水晶20MHz,Aポート入力(AN0ピンアナログ入力),Bポート出力,Tad=1.6μsです. 以下のプログラムで間違っている点をご指摘いただきたいと考えています. unsigned int out_b; void port_initialize() { INTCON=0; //割り込みなし ADCON0=0x81; ADCON1=0x8E; //AD変換中の入力範囲設定は電源と共有 TRISA = 0x3f; //AD変換用ポート(1で入力) TRISB = 0; //出力用ポート(0で出力) PORTB = 0; } void value_initialize() { out_b=0; PORTB=out_b; } void main() { port_initialize(); value_initialize(); while(1){ //endless ADCON0=0x81; //AD変換bitを選択 Delay_us(24); //アクィジション時間+AD変換後の待ち時間 ADCON0=0x85; //AD変換開始 Delay_us(20); //AD変換待ち時間 out_b=ADC_Read(0); PORTB=out_b; } }

  • PIC16F819

    PIC16F819のADコンバータを使用しています。 RA0からアナログ信号を入力して、PORTBのそれぞれのピンから1bitずつ(計8bit)のデジタル信号を出力させるためのプログラムを書いてみましたが、まったく動作しません。レジスタの設定なども変えてみましたが動作しませんでした。特にPORTBを全てHighにした場合、なぜかRB6とRB7からの出力を確認することができませんでした。 動作しない原因がまったく分からないので困っています。原因が分かる方がおられましたらご教授お願いします。 #include <pic.h> __CONFIG(DEBUGEN&WDTDIS&LVPDIS&HS&PWRTEN); void init_a2d(void){  ADCON0=0x40;  ADCON1=0x40;  ADON=1; } unsigned char read_a2d(unsigned char channel){  channel&=0x07;  ADCON0&=0xC5;  ADCON0|=(channel<<3);  GODONE=1;  while(GODONE)continue;  return(ADRESH); } void main(void){  unsigned char x1;  init_a2d(); //initialise the A2D module  GIE=0; // we don't want interrupts  TRISB=0x00;     // PORTB will be used in output mode  PORTB=0x00;  x1=read_a2d(1); // sample the analog value on RA0  PORTB=x1; }

  • PIC12F683 TMR2の割込がうまくいきませ

    タイトルのPICを使ってTMR2の割込動作を確認しているのですが、割込が全く掛かりません。 TMR2は単独で割込を掛けないで動作することは確認できましたがエラーもあるわけでもなく あれこれやっても解決せず迷走中です。また、割込ルーチンはこれまで動作が確認できたプログラムを埋め込んで使っているので問題はないと思っています。 何方かお助け頂けませんでしょうか。宜しくお願い致します。 ;******************************************* ; PIC初期設定 ;******************************************* START_INI BCF STATUS,RP0    ;BANK【0】 MOVLW 07h MOVWF CMCON0 ;GP0-2はデジタルIO BSF STATUS,RP0    ;BANK【1】 MOVLW B'0000000' MOVWF ANSEL ;A/D変換クロックF/2 デジタルI/O BCF OPTION_REG,7 ;GPIO端子をプルアップ MOVLW B'001000' ;RESET端子有効 MOVWF TRISIO ;GP0,1,2,4,5:OUT GPO3:IN MOVLW B'1000000' ;40h MOVWF OSCCON ;クロック=1MHz ;******************************************* ; TMR2の設定 ;******************************************* BCF STATUS,RP0    ;BANK【0】 MOVLW B'000101' ;ポス=1:1 TMR2=ON プリ=1:4 MOVWF T2CON ; BCF PIR1,TMR2IF    ;Timer2 割込み検出フラグをクリア BSF STATUS,RP0    ;BANK【1】 BSF PIE1,TMR2IE    ;Timer2 有効 MOVLW H'FA' ;250 MOVWF PR2    ;TRM2カウントSET ;******************************************* BCF STATUS,RP0     ;BANK【0】 CLRF TMR2 BSF INTCON,GIE     ;割り込み全体を有効