• 締切済み

PIC16F1827

プログラムの一部ですが、ここだけを見ると TRISB=0x00; RB0=0; RB1=0; RB2=0; RB3=0; PORTB=0b00000001; RB0から1、RB1から0、RB2から0、RB3から0が出力されると考えてもよいのでしょうか お手数おかけしますがよろしくお願いします。

noname#226941
noname#226941

みんなの回答

  • tadys
  • ベストアンサー率40% (856/2135)
回答No.3

最後にPORTB=0b00000001;が実行されるのでRB0=1、RB0~RB7=0になります。 RB0=0;からRB3=0;は必要ないです。 PICのIOポートの1ビットだけを変更するときに RB0=0 などの命令を使うのは不適切です。 RB1=1;を実行した後にRB0=0 ;を実行した場合、RB0に関係ないRB1が0になってしまうことが有ります。 これはNop()命令を挿入しても防げない場合が有ります。 それは、RB0=0; RB0=1;命令の仕組みによります。 RB0=命令では最初にPORTBの全ビットを読み込んでbit0のみを書き換えてPORTBに出力します。 ところが、RB1にLEDを直接つけたりコンデンサがついているとRB1に1を出力しているのに電圧レベルが0を示す電圧になっていることが有ります。 その場合、RB0=命令でPORTBに出力するときにRB1=1だったものをRB1=0として出力してしまいます。 これを防ぐには、RB0=0;命令の代わりにLATB0=0;命令を使用します。 ただし、LATBとPORTBは異なるバンクに有るので命令を実行する前にBNAKSEL命令でバンクを切り替えておく必要が有ります。 また次の処理に進むときにはバンクを元に戻しておくことも忘れないようにしましょう。

noname#226941
質問者

お礼

お礼が遅くなり申し訳ないです。 これからもよろしくお願いします。

noname#226941
質問者

補足

回答ありがとうございます。 >これを防ぐには、RB0=0;命令の代わりにLATB0=0;命令を使用します。 ただし、LATBとPORTBは異なるバンクに有るので命令を実行する前にBNAKSEL命令でバンクを切り替えておく必要が有ります。 また次の処理に進むときにはバンクを元に戻しておくことも忘れないようにしましょう。 ということはどうやってかけばよろしかったでしょうか また、このプログラムは PORTB=0b00000001; delayを挟む PORTB=0b00000010; のように続いているプログラムです

  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.2

No.1 補足 NOP(); は、アセンブラの NOP 命令と同じです 単なる時間稼ぎです PIC16F1827 8MHz ならば、 NOP(); // 500nS = 0.5μS = 0.0005mS です __delay_ms(1); // 1mS の違いがあります RB0=0; NOP(); RB1=0; NOP(); RB2=0; NOP(); RB3=0; で十分です、初期のPICでは、LATBレジスタが無い為 NOP で対処しました。

noname#226941
質問者

お礼

お礼が遅くなり申し訳ないです。 これからもよろしくお願いします。

  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.1

基本そうですが RB0=0; // BCF PORTB,RB0 アセンブラ表記 RB1=0; // BCF PORTB,RB1 RB2=0; // BCF PORTB,RB2 RB3=0; // BCF PORTB,RB3 と read-modify-write を行う命令を続ける場合は、間にNOP(); を挟むか LATB0~LATB3 を使用しないと負荷により誤作動します PORTB=0b00000001; があるので RB0~RB3の設定は不要では?

noname#226941
質問者

お礼

お礼が遅くなり申し訳ないです。 これからもよろしくお願いします。

noname#226941
質問者

補足

回答ありがとうございます。 >read-modify-write を行う命令を続ける場合は、間にNOP(); を挟むか LATB0~LATB3 を使用しないと負荷により誤作動します これは__delay_ms( ); で代用しても構わないでしょうか。 >PORTB=0b00000001; があるので RB0~RB3の設定は不要では? そうですね、うっかりしていました。申し訳ないです。

関連するQ&A

  • PIC16F874Aについて

    16F874Aを使用して回路をつくっているのですが、I/Oピンの出力(LEDを接続)はちゃんと動作してくれるのに、入力(スイッチを接続)が全く動作してくれません。動作確認のために、 void main(){ PORTB=0x01; TRISB=0x01; while(1){ if(PORTB.F0==0){ PORTB.F1=1;     } }        } という簡単なプログラムでも動作しません。 また、AN0~AN7をデジタルで使用したいため、A/D変換のプログラムとして、 setup_adc_ports(0b00000000); をプログラム中に入れてビルドすると、エラーが出てしまいます。 PIC素人のため初歩的な質問かとは思いますが、回答よろしくお願いします。

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

  • PIC16f88でLEDの点灯をしたいのですが、

    PIC16f88でLEDの点灯をしたいのですが、 9番ピン(RB3)だけLEDが点灯しません。 #include<htc.h> __CONFIG(UNPROTECT & DEBUGEN & MCLRDIS & PWRTEN & WDTDIS & HS); void main() { PORTB = 0xff; TRISB = 0x00; } 上記のプログラムでBポートをすべて出力にしてLEDを光らせているつもりです。 書き込みを行い試してみたところ、6,7,8番は点灯してくれました。 いろいろと調べてみたのですが、PWM設定(CCP1)と関係があるのでしょうか? また何かしらの設定が必要でしたら、教えていただけると助かります。

  • picマイコンのプログラムについて

    上位4bitと下位4bitを取り出してそれぞれを足して出力するプログラム #include<pic.h> void main(){ int x,y,z; TRISA=0x00; TRISB=0xFF; for(;;){ x=(0b11110000 & PORTB)>>4; y=(0b00001111 & PORTB)>>0; z=x+y; PORTA=z; } } pulseを読み取り、カウントするプログラム portaの第0bitからpulseを読み込んで信号が変化したとき、数を数えて、現在のカウントをportbに出力する #include <pic.h> main() { unsigned char before,after; TRISA=0xFF; TRISB=0x00; before=PORTA&1; PORTB=0; for(;;) { after=(PORTA &8)>>3; if(before==0&&after==1) { PORTB=1; } else { PORTB=0; } before=after; } } どのように変更・付け加えをしたらいいでしょうか?どなたかわかる方はお願いします。

  • PICマイコン 動作せず、教えて下さい。

    PICマイコン初心者です。 PICマイコン(PIC16F877)をHI-TEC社のPICCでコンパイルして、Buildしたものを 焼き込んで電源印可しますが全然動作せず。  出力に設定しているピン(PORTB)の電圧をみると全て3.8Vぐらいになっています。(不定??)  ちなみに出力PinはVdd(5V) => 発光D => 抵抗 => PORTBと接続されています。  どこが悪いか教えて頂きたく。  *** ソース ファイル ****   #include"pic.h"   void main(void){ unsigned long i; TRISA = 0x00; TRISB = 0x00;   while(1){ PORTB = 0b11111111; //RB0をLowに設定 for(i=0;i<20000000;i++); PORTB = 0b11111110; //RB1をLowに設定 for(i=0;i<40000000;i++); PORTB = 0b11111101; //RB2をLowに設定 for(i=0;i<15000000;i++);          }        }

  • PIC24FのPortBレジスタが書き込めません↓

    おはようございます。 PIC24FJ254GB106のTRISBを出力設定の0x0000に設定しPortBをたたくとLATBのレジスタ値は変化するのですがPortBのレジスタ値変化しません。↓ 何か単純な理由で上記の症状がおきるのでしょうか? 知ってる方いましたらヨロシクお願いします。

  • 【pic】ビットを取り出して、足し算、出力

    問 PORTB に信号を入力する。この信号のうち、上位4ビットと下位4ビットを取り出し、それぞれを足し算して、PORTAに出力するプログラムを作成せよ。以下を参考にせよ。 参考 #include <pic.h> void main(void) { int x, y, z; TRISA = 0x00; TRISB = 0xFF; for(;;) { x = (0b11000000 & PORTB) >> 6; y = (0b00111000 & PORTB) >> 3; PORTA = x; } } ということで、実際に作っては見たのですが、あっているかどうかも不明です。特に苦手な分野ですので詳しい解説の方よろしくお願い致します。 自身で書いてみたプログラム↓ #include <pic.h> void main(void) { int x, y, z; TRISA = 0x00; TRISB = 0xFF; for(;;) { x = (0b11000000 & PORTB) >> 4; y = (0b00111000 & PORTB) << 0; z = x + y; PORTA = z; } }

  • PICのプログラミングについて

    16F88をC言語でプログラムしています。 HI-TECH cでコンパイルしたところ、delay関数がうまく動作しません。 delay関数の直前までは動作するのですが、そこでストップしてしまいます。 どうもincludeの設定のところに問題があると思うのですが、 初心者なもので原因がいまひとつ掴めません。 とりあえず、delayが動作しているか確かめるために作った下記のプログラムでいろいろと試しているのですが、おかしいところがあればご指摘お願いします。 **************************** //RB0~RB4にはLEDを接続 #include <pic.h> #include <htc.h> #define _XTAL_FREQ 8000000 // 8Mhz __CONFIG(0x3F22); void main(){ TRISA = 0b00000100; TRISB = 0b00000000; PORTB = 0b00000101; __delay_ms(500); PORTB = 0b00000111; }

  • プログラムについて pic

    第3bit目がマスクし取り出した信号で、この信号を第0bit目に移す場合 x=(0b00001000)〉〉3 これで合っていますか? pulseを読み取り、カウントするプログラム portaの第0bitからpulseを読み込んで信号が変化したとき、数を数えて、現在のカウントをportbに出力する #include <pic.h> main() { unsigned char before,after; TRISA=0xFF; TRISB=0x00; before=PORTA&1; PORTB=0; for(;;) { after=(PORTA &8)>>3; if(before==0&&after==1) { PORTB=1; } else { PORTB=0; } before=after; } } どのように変更・付け加えをしたらいいでしょうか?どなたかわかる方はお願いします。

  • PICのプログラミングについて

    PIC16F819のプログラムをC言語で行っています。 PORTAは全てアナログ入力、PORTBは全てディジタル出力に設定しています。 試しにRB0に接続してある振動モータを動かそうと思い、RB0をHighにするだけのプログラムを作ったのですが動作しません。 A/D変換などは二の次で、単純にRB0から5V出力されるプログラムを組みたいだけなんですが、どうすればいいのでしょうか?ぜひご教授よろしくお願いします。 ---抜粋--- /***Sample code to set up the A2D module********/ void init_a2d(void){ ADCON0=0x00; ADCON1=0x00; ADON=1; } /***Return an 8 bit result**********************/ unsigned char read_a2d(unsigned char channel){ channel&=0x07; ADCON0&=0xC5; ADCON0|=(channel<<3); ADCON0|=0x04; while(ADCON0&0x04)continue; return(ADRESH); } /***Main関数*************************************/ void main(void){   TRISB=0x00; RB0=1; }