PIC12F683の入出力について

このQ&Aのポイント
  • GPIOレジスタとTRISIOレジスタの関係が理解できません、どなたか教えて頂けませんか。
  • GPIOレジスタに「0」を設定すると電位は、H(ハイ)となるのですか、L(ロー)となるのですか。
  • TRISIOレジスタに「0」を設定すると電位は、H(ハイ)となるのですか、L(ロー)となるのです。
回答を見る
  • ベストアンサー

PIC12F683の入出力について

GPIOレジスタとTRISIOレジスタの関係が理解できません、どなたか教えて頂けませんか。 1.GPIOのレジスタに「0」を設定すると電位は、H(ハイ)となるのですか、L(ロー)となるのですか。  2.TRISIOのレジスタに「0」を設定すると電位は、H(ハイ)となるのですか、L(ロー)となるのです。 3..TRISIOの「0」は、出力モードと説明がありますが、その時のp型FETに加えられる電位は、HですかLですか。 4.P型FETにはGPIO,TRISIOいずれか一方の電位が、Lであれば出力は、H、n型FETにはいずれも電位が、Lのとき出力は、Lと考えていいでしょうか。 5.TRISIOが「1」入力モードになるとなぜ、p型FET、n型FETとも動作しない様な説明がありますが なぜでしょうか。   以上の点が判然としませんのでGP(0.1.2.3.4.5)に、H出力するのか、L出力するのかわかりません。 教えていただけませんか。

  • diwk85
  • お礼率83% (141/168)

質問者が選んだベストアンサー

  • ベストアンサー
  • ts3m-ickw
  • ベストアンサー率43% (1248/2897)
回答No.1

まず基本的な理解をしましょう。 TROSIOレジスタはポートの入力モードと出力モードを切り換えます。 GPIOレジスタはポートが出力モードであれば書き込んだ値をポートから出力します。 よって回答として 1.GPIOレジスタに0を設定し、TRISIOレジスタに0を設定すればポートから0(L)が出力されます。 2.TRISIOレジスタに0を設定すると、GPIOレジスタに設定した値が出力されます。 3.P-FETのどこに加えられる電位を聞いているのか判りません。一般にソースにはVddが接続されています。ゲートにはGPIOレジスタの値の反転値が印加されます。 4.これも何を聞いているのか判りません。FETの基本的な動作は参考書を読んでください。 5.出力しない入力モードだから動作しないのです。 なお、12F683のポート3は入力固定で、ポート4、5には他の機能が割り当てられていることに注意が必要です。

diwk85
質問者

お礼

早速のご回答ありがとうございました。 疑問が解けました。更に進みたいと思います。 今後ともよろしくお願いします。

関連するQ&A

  • 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 12C509でFA回路を作ってみたが動作しない。

    8ピンの12C509でFA(FullAdder,全加算器)を作ってみたのですが、正常に動作しません。 LIST P=PIC12C509A include "P12C509A.INC" ORG 04H MOVLW B'00000111' TRIS GPIO ;1,2,3番ピンを入力にする ほかは出力 MOVLW 0H ;0000 0000 MOVWF GPIO ;出力をすべてLoにする main MOVF GPIO,0 CALL get_fa movwf GPIO goto main get_fa ANDLW B'00000111' ;3ビットだけマスク ADDWF PCL,F ;PCレジスタに数字を加えてジャンプ RETLW B'00000000' ;000 RETLW B'00001000' ;001  RETLW B'00001000' ;010  RETLW B'00010000' ;011 RETLW B'00001000' ;100 RETLW B'00010000' ;101 RETLW B'00010000' ;110 RETLW B'00011000' ;111 END 1,2,3ピンから入力して結果を4ピンにS 5ピンにCを出力するはずなんですがどこが間違ってるのでしょう?

  • 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); } }

  • 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;   } } ----------------------------------------------------------------

  • 抵抗とコンデンサの役割(ラズパイで電子回路)

    GPIO17は入力モード,GPIO22とGPIO27は出力モードになっています。 GPIO17がHIGHになったときにLED1が点灯、GPIO17がLOWになったときにLED2が点灯する回路です。 switch3が接続されるとGPIO17がHIGHに、switch1が接続されるとGPIO17がLOWになることはなんとなく分かります。 この回路で、0.1μFのコンデンサと10kΩの抵抗の役割とそれぞれの値を選定した理由を教えてください。(できるだけ分かりやすい言葉でお願いします) ただいま、ラズベリーパイ4で電子回路の勉強をしているのですが、入門キットを購入したのに、ある程度知識のある方には常識的であろう部分の説明が省略されているので大変困っています。

  • PIC16F84Aで出力が反転してしまう

    PIC16F84Aを用いて、矩形波を出そうとしています。 下記のようなプログラムを動かそうとしているのですが、 PORTA,1をONした時、出力がすべて反転してしまいます。 原因はどのような事が考えられますでしょうか? PORTA,0:矩形波の波長 PORTA,1:入力トリガが立ち上がりか立ち下がりか? PORTA,2:矩形波を立ち上がりにするか、立ち下がりにするか? PORTA,3:LED用出力 PORTA,4:手動トリガスイッチ PORTB,4~7:出力 で行っています。 ラベルL_Hの所で、出力はBCFで0になっているはずですが、 すべて1出力になります。 トリガを入れた時の出力も反転された状態になります。 ----------------------- LIST P=PIC16F84A ; LIST宣言で使用するPICを16F84Aと定義する。 INCLUDE P16F84A.INC ; 設定ファイルp16f84a.incを読み込む。 __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF ; ;変数の設定(タイマ用カウンタ)********************* CNT1 EQU 0CH CNT2 EQU 0DH CNT3 EQU 0EH CNT4 EQU 0FH CNT5 EQU 10H CNT6 EQU 11H ;リセット************** ORG 0 ;リセット ;初期設定************* CLRF PORTB ;PORT-Bをオール0 BSF STATUS,RP0 ;バンク1へ MOVLW B'00001111' ;00001111 MOVWF TRISB ;PORT Bを0-3を入力、4-7を出力として設定 MOVLW B'10111' ;00010111 MOVWF TRISA ;PORT Aを0-3を入力、4を出力として設定 NOP BCF PORTB,4 ;PORTB,4~7をオール0 BCF PORTB,5 ;PORTB,4~7をオール0 BCF PORTB,6 ;PORTB,4~7をオール0 BCF PORTB,7 ;PORTB,4~7をオール0 BSF PORTA,3 ;PORTA,3を1 CLRF CNT1 CLRF CNT2 CLRF CNT3 CLRF CNT4 CLRF CNT5 CLRF CNT6 ;入力が1か0か?************************ Trig_Direc NOP BTFSS PORTA,1 ;入力判定が立ち上がりの時 GOTO Diec_Hight GOTO Direc_Low ;入力立ち上がり、出力判定******************* Diec_Hight BTFSS PORTB,2 ;連続波出力の時 GOTO H_Comti BTFSS PORTA,2 ;出力判定が立ち上がりの時 GOTO H_H ;入力立ち上がり、出力立ち上がり GOTO H_L ;入力立ち上がり、出力立ち下がり ;入力立ち下がり、出力判定***************************************** Direc_Low BTFSS PORTB,2 ;連続波出力の時 GOTO L_Comti BTFSS PORTA,2 ;出力判定が立ち上がりの時 GOTO L_H ;入力立ち下がり、出力立ち上がり GOTO L_L ;入力立ち下がり、出力立ち下がり ;入力立ち上下がり、出力立ち上がり トリガ入力判定と出力************ H_H BCF PORTB,4 ;Trig出力1 OFF BCF PORTB,5 ;Trig出力2 OFF BCF PORTB,6 ;Trig出力3 OFF BCF PORTB,7 ;Trig出力4 OFF BSF PORTA,4 ;LED点灯 off ~正常出力 ・ ・ ・ ;入力立ち上下がり、出力立ち上がり トリガ入力判定と出力*************** L_H BCF PORTB,4 ;Trig出力1 OFF BCF PORTB,5 ;Trig出力2 OFF BCF PORTB,6 ;Trig出力3 OFF BCF PORTB,7 ;Trig出力4 OFF BSF PORTA,3 ;LED点灯 off L_H_ON BTFSS PORTB,0 ;トリガ入力1に入力があった場合 GOTO L_H_Time BTFSS PORTB,1 ;トリガ入力2に入力があった場合 GOTO L_H_Time BTFSS PORTA,4 ;手動トリガ入力に入力があった場合 GOTO L_H_Time GOTO Trig_Direc ;トリガ入力がなかった場合、初期判定に戻る L_H_Time BCF PORTA,3 ;トリガ判定LED点灯 BTFSS PORTA,0 ;パルス幅が50ms指定の場合」 GOTO L_H_50 GOTO L_H_200 L_H_50 BSF PORTB,4 ;Trig出力1 ON BSF PORTB,5 ;Trig出力2 ON BSF PORTB,6 ;Trig出力3 ON BSF PORTB,7 ;Trig出力4 ON CALL Timer_50ms BCF PORTB,4 ;Trig出力1 OFF BCF PORTB,5 ;Trig出力2 OFF BCF PORTB,6 ;Trig出力3 OFF BCF PORTB,7 ;Trig出力4 OFF CALL Timer_50ms GOTO L_H_Loop L_H_200 BSF PORTB,4 ;Trig出力1 ON BSF PORTB,5 ;Trig出力2 ON BSF PORTB,6 ;Trig出力3 ON BSF PORTB,7 ;Trig出力4 ON CALL Timer_200ms BCF PORTB,4 ;Trig出力1 OFF BCF PORTB,5 ;Trig出力2 OFF BCF PORTB,6 ;Trig出力3 OFF BCF PORTB,7 ;Trig出力4 OFF CALL Timer_200ms GOTO L_H_Loop L_H_Loop BTFSC PORTB,0 ;トリガ入力1が出力状態だった場合 GOTO L_H_Loop BTFSC PORTB,1 ;トリガ入力2が出力状態だった場合 GOTO L_H_Loop BTFSS PORTA,4 ;手動トリガ入力に入力があった場合 GOTO L_H_Loop BSF PORTA,3 ;トリガ判定LED消灯 GOTO Trig_Direc ;初期へ戻る ・ ・ ・ 以下略

  • picとHブリッジ回路

    電子回路初心者で、今picを用いて 5相ステッピングモーターを駆動させる回路を 製作しているものですが、 N-MOS-FETとP-MOS-FET各5個使用し Hブリッジ回路を製作するところまでは出来たのですが、 各々のゲートにpicからの出力を入れたのですが、 picとゲートを全部繋ぐと、picの出力がおかしくなります。 一つだけだと思うとおりに出力してくれるのですが、何が原因なのでしょうか? picは16F628A N-MOS-FETは2SK3510 P-MOS-FETは2SJ554を使用しています。どうか御指導よろしくお願いします。 また以下のサイトを参考にしています。 http://www2s.biglobe.ne.jp/~NAOTO/acs/lab/

  • PIC12F675 ウォッチドッグタイマーの使い方

    最近趣味でPICアセンブラを初めた者です。 WDTの実験をするため以下のプログラムでリセットのかかるまでの時間を比べてみました。 私の考え違いかもしれませんが、WDTポストスケーラの値によってリセットするまでの時間は違うと思ったからです。 675のGP0~GP3の入力をOPTION_REG のbit0~bit3に割り当てました。 GP3はHに固定してあるのでOPTION_REG bit3(PSA)は常にHです。 プログラムは一秒間のLED点灯後消灯し、WDTリセットのかかるまでループします。 WDTリセットからのリスタートはLEDを点滅後、同じことを繰り返します。 このときGP0~GP2の端子を切り替えることにより、OPTION_REGのWDT分周比を変え、 LED消灯後、リスタートし、点滅するまでの時間が変わると思ったのですが、変化しません。 正確な時間はわかりませんが、GP0~GP2を変えても、リスタートまでの時間は三秒程度一定です。 OPTION_REGのbit0~bit2がすべて立ってるのではと思われるのですが、 私のWDTの設定に対する考え方が間違ってるのか、テスト用のプログラムにミスがあるのかわかりません。 お暇な時で結構ですので、お教えくださるよう、どうぞよろしくお願いいたします。 title WDT list p=12f675 #include <p12f675.inc> errorlevel -302 __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT org 20h work RES 1 ; ワーク counter RES 1 ; 回数カウンター cnt10m RES 1 ; 10ms時間稼ぎ用ワーク cnt500u RES 1 org 0 goto start start bsf STATUS, RP0 ; レジスタバンク1を選択 call h'3ff' movwf OSCCAL ; 書き込む movlw b'00001111' ; GP0~GP3を入力設定 movwf TRISIO clrf ANSEL ; すべてデジタルI/O bcf OPTION_REG, NOT_GPPU ; プルアップ使用する bcf STATUS,RP0 ; バンクゼロ btfsc STATUS,NOT_TO goto start2 movlw d'5' ; LED 点滅回数を5回にして call led_on_off start2 bsf GPIO,GP5 ; 一秒間LEDを点灯し call tm1000 movf GPIO,w ; 入出力ピンを読んで b3は一番ピンに直結し常時 H andlw b'00001111' ; 下位4ビットだけ選び bsf STATUS,RP0 ; バンク 1 選択 iorwf OPTION_REG,f ; ウォッチドッグの分周比とする bcf STATUS,RP0 ; バンク 0 loop bcf GPIO,GP5 ; LED消灯し goto loop ; リセットがかかるまでループ ; LED を0.1秒ごとにWレジスタの回数点滅 led_on_off movwf work led_loop decfsz work goto led_loop2 return led_loop2 bsf GPIO,GP5 call tm100 bcf GPIO,GP5 call tm100 goto led_loop ;-------------- 1000ms,100ms 遅延ルーチン tm1000 movlw D'100' goto lp200 tm500 movlw D'50' goto lp200 tm100 movlw D'10' ;10ms遅延を10回で100ms lp200 movwf counter ;カウンターをセットし lp201 decfsz counter,f ;カウンターはゼロ ? goto lp202 ;いいや return lp202 call t10m goto lp201 ; 10msec 遅延ルーチン for 4Mz t10m movlw d'8' movwf cnt10m tm10lp1 movlw d'249' movwf cnt500u tm10lp2 clrwdt ; ウォッチドッグタイマーをクリア nop decfsz cnt500u,f goto tm10lp2 decfsz cnt10m,f goto tm10lp1 return END

  • uPD78F0730 P12端子がローのならない不具合

    uPD78F0730 P12端子がローのならない不具合 uPD78F0730 P12端子をLowに使用と思い下のプログラムにしましたが、 ローになりませんでした。(1.83V)マイコンが壊れているのでしょうか。 #pragma SFR void main(void){ P1.2 = 0; //P12をLOWへ設定 PM1.2 = 0; //P12を出力モードへ } VDD=5V,ハイにはなります。

  • PIC12F675、HC-SR04のプログラム

    PIC12F675にプログラムをMPLABX IPEで書き込んで、超音波センサ HC-SR04の距離が5cm以下の時にブザーが鳴る(出力が5Vになる)ようにしたいです。 以下のプログラムで出力は、距離に関わらず5Vか0Vで一定になっています。 プログラムに間違いがあれば、教えていただけないでしょうか。 #include <xc.h> #include <stdio.h> //12F675 #include <stdlib.h> #pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = ON // Power-Up Timer Enable bit (PWRT enabled) #pragma config MCLRE = OFF // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD) #pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled) #pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled) #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled) #define _XTAL_FREQ 32000000 #define TX_UART_SIZE 3 #define SONIC_TRIG GPIO5 #define SONIC_ECHO GPIO4 #define SONIC_TEMP GPIO2 #define SONIC_BUZZ GPIO1 #define IO_OFF 0 #define IO_ON 1 #define TIME_OFF -1 #define TIME_UP 0 #define TIME_START_H 0xD8 #define TIME_START_L 0xF0 #define TIME_LED_CNT_MAX 5 #define TIME_LED_CNT2_MAX 15 unsigned char cnt10ms; char TimerLed1; char TimerLed2; int main(int argc, char** argv) { long echo_time; long dist; OSCCAL = 0b00110000 ; // 内部クロック8MHz ANSEL = 0x00 ; // AN未使用、デジタルI/Oに割当てる CMCON = 0x07; // コンパレータ未使用 TRISIO = 0b00011100 ; // RA2,3,4を入力にし、他は出力に割当てる GPIO = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) T1CON = 0b01110000 ; // ゲート有効、Hiでカウント、単一パルス、T1Gピン TMR1ON = 1; // タイマー1開始 while(1) { // タイマ1のカウンタ準備 TMR1 = 0; // カウンタの初期化TMR1 = 0; // トリガ送信 SONIC_TRIG = IO_ON; __delay_us( 10 ); SONIC_TRIG = IO_OFF; // エコー信号のON待ち while( SONIC_ECHO == IO_OFF ) { } // エコー信号のOFF待ち while( SONIC_ECHO == IO_ON ) { } // 超音波の往復時間を取得 echo_time = TMR1; // 往復時間から片道の時間にする echo_time /= 2; // パルス時間から距離(cm)に変更 dist = echo_time * 34 / 1000; if( dist <= 5 ) //距離5cm以下でブザー出力 { (SONIC_BUZZ = 1); } else { (SONIC_BUZZ = 0); } __delay_ms( 1000 ); } return (EXIT_SUCCESS); }

専門家に質問してみよう