• 締切済み

プログラムについて 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; } } どのように変更・付け加えをしたらいいでしょうか?どなたかわかる方はお願いします。

noname#182209
noname#182209

みんなの回答

  • kngj1740
  • ベストアンサー率18% (197/1052)
回答No.1

前提条件が不明確です。port Aを読み取る関数の仕様、port Bへ出力する関数の仕様。 port Aへのパルス発生の仕様。例えばスイッチを手で押したりする場合はチャタリングが不可避です。チャタリング除去はハードウェア回路でされているのか、それともソフトで対応しなければならないのか。ソフトで対応する場合はチャタリング除去処理が必要です。(キーボードなどでは必ず行ってます)。

関連するQ&A

  • 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】ビットを取り出して、足し算、出力

    問 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マイコンのプログラム

    仮に3bit目を取り出す場合は a=(0b00000100)&3 でいいのでしょうか? 第3bit目を第0bit目に移す場合の命令の例としては a=(0b00001000)>>3; でいいでしょうか? 矩形波のプログラムで1と0の比率が1:10となるプログラムについて #include <pic.h> main() { unsigned char lp1,lp2; TRISA=255; TRISB=0; for(;;) { for(lp1=0;lp1<2;lp1++){ PORTB=1; } for(lp2=0;lp2<5;lp2++){ PORTB=0; } } } で1:10の比率になっているでしょうか?

  • PIC 初歩プログラムについて

    PICの初めてのプログラムを書いたのですがテキストのように動きません。 ORG 0 ; MAIN  BSF STATUS,RP0 MOVLW B'00000000' ;ポートB 出力 MOVWF TRISB ; MOVLW B'00001111' ;ポートA 0,1,2,3入力 MOVWF TRISA ; BCF STATUS,RP0 SW BTFSS PORTA,0 GOTO  LED1 BTFSS PORTA,1 GOTO LED2 GOTO SW LED1 MOVLW B'00000010' MOVWF PORTB GOTO SW LED2 MOVLW B'00000001' MOVWF PORTB GOTO SW END 入力SWを押していないときがHIです。したがって何もしなければSWのループになると思うのですが、LED2に行ってしまいます。BTFSC POARTA,1とすればSWループ状態ですがテキストとは違います。 何かおかしいのでしょうか?

  • PICのスイッチのプログラムについて

    基本的な事なのですが、よろしくお願いします。 以下のアセンブラのソースでPICを作ってみました。プログラムを変えてみたり、回路を変えてみたりしましたが、改善されませんでした。回路の構成は、LED(仮に、A・Bとします)2個、スイッチ1個、PIC、抵抗器など・・・これを交互にスイッチのオンオフで切り替える。としています。現状の問題点は、スイッチ入力で、LEDAは光るときは綺麗に光りますし、消えるときは綺麗に消えます。問題は、LEDBのほうで、光るときに高速で点滅します。理由と対策が解りません。どなたか教えてください。よろしくお願いします。 list p=16f628a #include<p16f628a.inc> __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF ORG 0x000 goto main ORG 0x004 main bcf STATUS,RP0 bcf STATUS,RP1 clrf INTCON clrf PORTA movlw 0x07 movwf CMCON bsf STATUS,RP0 bsf PCON,OSCF clrf TRISB movlw 0x03 movwf TRISA bcf STATUS,RP0 clrf PORTA clrf PORTB main_loop btfsc PORTA,0;この辺りがよくわかりません。 goto loop2 bsf PORTB,0 bcf PORTB,1 goto main_loop loop2 bcf PORTB,0 bsf PORTB,1 goto main_loop END

  • PIC16F627Aを低電圧で動かすには

    PIC16F627Aです 電池で駆動するプログラムを書いていてうまく動かないので 5V安定化電源につないだら動きました。 確かめるために BポーがをHIにするところでストップするようにして確かめました。 4.4Vでは動作しません。5Vでは動作します。 プログラムは下記です。 このPICは3Vから動作すると思いますが低電圧で 動かすために特別な設定が必要なのでしょうか。 あるいは小生の設定に問題があるのでしょうか。 ご教授ください。   TRISA = 0xFF;   TRISB = 0x01; CCP1CON = 0x0C; PR2 = 0x19; CCPR1L = 0x0C; CCP1CON = PWM_STOP;   T2CON = 0x0C; T1CON = 0x01; TMR1L = 0; TMR1H = 0; TMR1IF = 0; TMR1IE = 1; PORTA = 0x00; PORTB = 0xFF;   ここで4.4V(電池)ではPORTB がHIになりません。   5V電源ではHIになります。   電圧チェックおよびダイオード発光で確認しました while(1) {;}; 以下省略

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

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

  • PIC間通信

    http://kuri6005.sakura.ne.jp/pic/pukiwiki.php?PIC-PIC%A4%CE%C4%CC%BF%AE%28USART%29 現在上記のサイトを利用してPICの勉強中です。 上記サイトでは、'A'という文字を転送していますが、数字や'AA'など複数文字ではうまく動作しません。 なにか良い方法があるのでしょうか? 下記 Usart_Write(1); の1の部分を'A'にするとうまく動作します。 (もちろん、送信・受信両方のPICは書き換えています。) できれば、変数にして受信側に送りたいのですが、可能でしょうか? よきアドバイスをお願い致します。 void main() { Kmode=0; PORTA=0b00000000; //PORTAの中身をきれいにする PORTB=0b00000000; //PORTBの中身をきれいにする CMCON=0b00000111; //PORTAをデジタル入出力使用に設定 TRISA=0b00000001; //RA0を1:入力に、他を0:出力に設定 TRISB=0b00000010; //PORTB RB1:入力、他7ヶは出力設定 Usart_Init(2400); //通信速度を2400 band rateに設定 do { if(Button(&PORTA, 0, 1, 0)) { //スイッチONの場合 Usart_Write(1); }else{ Usart_Write(0) } while(1); }

  • c言語でpicにDelay関数を使いたい

    pic16f84a用にLED点滅のソースコードを書きましたがエラー出て前に進めません。 コードは次の様になっています。 (前段略) #use delay(clock=20000000) void main(void) { TRISA = 0x00; PORTA = 0x03; TRISB = 0x00; PORTB = 0x00; while (1) { PORTA = 0x02; Delay_ms(1000); PORTA = 0x01; Delay_(1000); } } コード書き込み中にすでにDelayの箇所が2か所ともエラーの表示になってしまいます。 一応下記の様にdelya箇所をコメント化してビルドと,picに書き込みを行えます、そしてLEDも点滅できます。 while (1) { PORTA = 0x02; //Delay_ms(1000); PORTA = 0x01; //Delay_(1000); } } 参考のコードを正確に書き込みましたがこのような状況でしたので、   #use delay(clock=20000000) は自分が勝手に追加してみましたが結果はやはり同じでした。 何が原因なのでしょうか。 何方か教えて頂けませんか。お願いいたします。 自分の環境は、Windows8 MPLABX IDE2.10  XC8  PIC16F84A pickit3 です。

専門家に質問してみよう