• ベストアンサー

PIC12F683のソフトウェアUARTはタイマ割り込みとか使っている?

PIC12F683で、 http://www.picfun.com/P12F/p12f02.html このサイトにあるように、PIC12F683にはハードウェアUARTモジュール機能がないので、ソフトウェアでこれを実現するために #use RS232(BAUD=9600, XMIT=PIN_A2, PCV=PIN_A3)というのを やればprintf関数でUARTデータを出力できるとのことですが、 この機能を宣言した場合にはPIC12F683のタイマ割り込み機能はどれか1つ占有されたりするのでしょうか? その場合、開けておかなければならないタイマは0,1,2のどれになるのでしょうか?

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

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

こっちに説明があります。 http://www.picfun.com/c09.html CCSは使った事が無いですが、割り込みは使っていないそうですから、タイマも使っていないでしょう。使っていたら注意書きがあると思います。

techhouse
質問者

お礼

回答頂きありがとうございました。 タイマを使ってないんですね。今のプログラムがタイマ割り込みの0,1どちらも使っている状態なので助かりました。

その他の回答 (1)

  • bug_bug
  • ベストアンサー率78% (36/46)
回答No.2

CCSは使ったことありませんが, ヒマ潰しに取説を拾って読んでみました. useディレクティブでオプション指定してコンパイラの持ってるライブラリを呼んでる様ですが, UARTを持ってないPICの場合はCPUを占有してBusy_Waitしている様ですね. タイマリソースの使用は無い様です. p.132に注意書きがあります. The #USE DELAY directive must appear before this directive can be used. RS232のオプション指定する以前にDELAY(クロック数)指定せよとのコト. 使用に関して特に問題はないかと思いますが, 斜め読みしただけなのでご自身でマニュアル読まれた方が早いかも. "rs232"のキーワードでpdf内を検索すれば, 必要な情報はあらかたピックアップできると思います.

参考URL:
http://www.ccsinfo.com/downloads/ccs_c_manual.pdf
techhouse
質問者

お礼

回答頂きありがとうございました。 今PIC12F683でタイマ0,1両方とも使用している状態だったので、それでもソフトウェアUARTが使えるということで助かりました。 マニュアルは英語だったのですが、いろいろな機能とかも紹介されているようだったので必ず確認してみます。

関連するQ&A

  • PIC18FのUART通信について

    こんにちは ただいまGPSとSDカードを使ったロガーをPIC18F2550で作成しております。 GPSとSDを使うため、UARTのピンが2つ必要ですがPIC18F2550にはTX/RXは一つずつしかありません。 そこで,ソフトUARTで解決したいのですが, CCS Cコンパイラではソフトウェアシリアル通信の機能があるみたいのですが 現在自分が使っているC18だといくら探しても見つかりませんでした。 C18もソフトUART機能はあるのでしょうか?

  • dspicからpicへのUARTでの信号送信

    現在,dspic33fj32mc202を使用して回路を作成しています。 ピンの都合から、UART機能を利用して、dspicのTXピンから,pic16f690のRXピンに信号を送りたいと考えています。 しかしdspic33fは3.3Vで、pic16f690は5Vです。 上記のようなことは可能なのでしょうか?

  • PICマイコンでのタイマの作成

    PICマイコン(16F84A)を勉強している初心者です。 タイマ0のオーバーフロー割込みを用いて約一秒のタイマを作成し、 このタイマを利用して10秒ごとに音が鳴るようにしたいのですが、 どうしたらよいのでしょうか?

  • PIC18f452 のtxとrxピンの使い方

    PIC18f452 には TX と RX の pin が一つずつしかないのですが、それらを別々の目的に使うことは可能でしょうか? たとえば、TX の pin を XBee の送信に使い、RX の pin を Rs232からの受信 に使うことは可能でしょうか? よろしくお願いします。

  • PICのA/D変換の入力が何故か0Vになってしまいます・・・

    現在、PIC12f675を用いて下記のようなことをしたいと検討しているのですが、 中々思った通りに動いてくれません。 どなたか分かる方がいらっっしゃいましたらアドバイスお願い出来ないでしょうか? 「開発環境」 ・CCSのCコンパイラを使用 ・PICは12f675 「内容」 アナログ入力端子に任意の電圧を加えて、RS232CでPC上にその電圧を表示する。 現在、アナログ入力端子(AN0)に電源電圧から分圧して0.5Vや1Vなどの電圧を加えているのですが、 何故か入力端子の電圧をテスターで測定すると0Vとなり、PC上でもやはり0Vと表示されてしまいます。 何故、任意の電圧を加えても全て0Vとなってしまうのかが分かりません。 おそらくプログラム上でのミスがあると思うのですが・・・ 検討中のプログラムを下記に書きます。 ***************************************************** ///// 初期設定 ///// #include <12f675.h> #device ADC=10 #fuses INTRC_IO, NOWDT, PUT, NOPROTECT, BROWNOUT /////RS232C使用宣言///// #use delay(CLOCK = 4000000) #use rs232(BAUD = 9600, XMIT = PIN_A2, RCV = PIN_A1) //GP1=受信 GP2=送信 //// メイン関数 void main() { // A/D初期設定 float data; setup_adc_ports(AN0_ANALOG); //AN0をアナログ設定 setup_adc(ADC_CLOCK_INTERNAL); //ADCのクロック設定(内部発振) set_tris_a(0); output_A(0); while(1) { set_adc_channel(0); delay_us(50); data = read_adc(); data = (data * 3.0) / 1024; printf("電圧 = %1.3fV\r\n",data); } } ***************************************************** 申し訳ありませんが、アドバイスお願いします。

  • PIC電子工作

    電子工作初心者です。 PIC16f627aを使ってタイマーを作っているのですが、SLEEPをするとタイマ1が止まってしまい困っています。 これはPICの仕様なのでしょうか? もしそうならタイマ1を動かしている間に消費電力を抑える方法はないのでしょうか? どなたかご教授願います。 <環境> MPLAB v8.15a + HITEC C Pro 9.60PL4

  • pic16f873to873Aの違いはナンですか?

    PIC16F873を用いたハードにPIC16F873Aを取り付けたところ、動作に不具合を生じます。 873のソースのINCLUDE、ProcessorをP16F873Aに変更するだけでは駄目なのでしょうか? 873から873Aに変更した場合共通でないものが存在するのでしょうか? manualを読んでもその部分は見つかりません達者な先生方教えてください。

  • 思い通りに動かせず、困っています

    ZIG100BeeモジュールとPIC12F675を2つずつ使って回路を作ろうとしているのですが、 ZIGBeeがどんなプログラムで動くのか、検索しても全く解りません。 送信側PIC 4ピン→1kΩ抵抗でプルアップ+スイッチ 7ピン→ZIGBeeTxDに接続 6ピン→ZIGBeeRxDに接続 受信側PIC 4ピン→ZIGBeeTxDに接続 5ピン→ZIGBeeRxDに接続 7ピン→LEDアノード側に接続 6ピン→ブザー+側に接続 このような回路で、送信側スイッチを押すと受信側LEDが点灯、ブザーが鳴るようにしたいのです。 送信側プログラム #include<12F675.h> #byte GPIO =0x09 #byte TRISTO =0x85 #byte CMCON = 0x19 #byte ANSEL =0x9F #fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR,NOBROWNOUT #use delay(clock=4000000) #use rs232(BAUD=9600,xmit=PIN_A1,rcv=PIN_A0,bits=8) #use fast_io(a) void main() { set_tris_a(0x09); delay_ms(50); while(1){ if(input(PIN_A3)==0x00){ putc(0x00); delay_ms(50); output_A(0x09); } } } 受信側プログラム #include<12f675.h> #byte GPIO =0x05 #byte TRISTO =0x85 #byte CMCON = 0x19 #byte ANSEL = 0x9F #fuses INTRC_IO, NOWDT, PUT, NOPROTECT,NOMCLR,NOBROWNOUT #use delay(clock = 4000000) #use rs232(BAUD = 9600, XMIT = PIN_A2, RCV = PIN_A3,bits = 8) #use fast_io(A) void main() { set_tris_A(0x08); delay_ms(50); while(1) { if(input(PIN_A3)== 0x00) { if(kbhit()) { delay_ms(500); output_high(PIN_A0); delay_ms(500); output_low(PIN_A1); } } } } このようなプログラムにしたのですが、受信側が送信側の操作に反応せず、 電源プラグを挿しただけで動作してしまいました。 すみませんが、誰か解る方がいたら教えてくれませんか?

  • PIC16F タイマ0使い方

    久しぶりにPICを引っ張り出して触っていたのですが、タイマ割込みの部分がうまくできていないようで、LED(led_green)を1秒で点滅させたいのですが2秒ぐらいの中途半端な点滅をしてしまいます。 内部クロックを4MHzに設定しているので、これをプリスケーラで8分周しTMR0の値を130に設定し、1msごとに割込みが発生する算段なのですが、どこか間違えてますでしょうか? マイコンは PIC16F886 を使用しています。 #include<pic.h> #include<stdio.h> #include <stdlib.h> #include <xc.h> #define _XTAL_FREQ 4000000 // 内部クロック 4MHz // CONFIG1 #pragma config FOSC = INTRC_NOCLKOUT// Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD) #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) #pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled) #pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled) #pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming) // CONFIG2 #pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V) #pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off) #define TMR_set 130 // TMR0初期値 #define led_green RB0 #define led_white RC3 volatile unsigned int count = 0; volatile unsigned int cnt = 0; // タイマー割込みの処理 void __interrupt() int_f (void){ // 割り込みハンドラ if(T0IF == 1){ // 1ms count++; cnt++; TMR0=TMR_set; T0IF = 0; // 割り込みフラグをクリア (オーバーフローフラグ) if(count>=1000){ // 1s count=0; led_green = ~led_green; } } } void init(){ OSCCON = 0b01100000; ANSEL = 0b00000000; ANSELH = 0b00000000; TRISA = 0b00000000; TRISB = 0b00000000; TRISC = 0b00000000; PORTA = 0; PORTB = 0; PORTC = 0; GIE = 1; // すべての割り込みを許可 (0:禁止, 1:許可) T0IE = 0; // タイマー割り込みを禁止 (0:禁止, 1:許可) T0CS = 0; // TIMAR0モジュールをタイマーとして使用 (0:通常のタイマーとして使用, 1:T0CK端子に入ってきた入力のカウンタ) PSA = 0; // プリスケーラをTIMER0モジュール用にセット OPTION_REG = 0x02; // プリスケーラ 1:8 TMR0 = TMR_set; T0IE = 1; // タイマー割り込みを許可 (0:禁止, 1:許可) T0IF = 0; // 割り込みフラグをクリア (オーバーフローフラグ) } void main(void){ init(); led_white = 1; while(1){ } return; }

  • PICマイコンを用いてのシリアル通信で、プログラムのループが2周目になると上手く動作しません。

    PIC16f88を用いて、パソコンとシリアル通信を行いたく、その確認の為以下のプログラムを作成しました。 #include<16f88.h> #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP #device ADC=10 #use delay(clock=20000000) #use fast_io(B) #use rs232(BAUD=9600,XMIT=PIN_B5,RCV=PIN_B2) #include <stdlib.h> void main() { int i; long data,data1,data2; long idata[10]; while(1) { printf("start!!\r\n"); gets(idata); data1 = atol(idata); data2 = data1 + (long)5; printf("入力値 %ld\r\n",data1); printf("計算後 %ld\r\n",data2); if ( 20 > data1){ printf("small\r\n"); } if ( 20 < data1){ printf("big\r\n"); } } } 入力した値、入力値に+5した値、また入力値をif文での条件で判別できるかを確認しています。実行結果は以下になりました(ハイパーターミナル上の結果を載せます)。 START!! 9     ←(これは入力した値です) 入力値9 計算後14 small START!! 15 入力値0 計算後5 small START!! 1 入力値0 計算後5 small ・ ・ ・ と、一回目のループは設計通りの動作が行えましたが、2回目のループ以降、何を入力しても”0”が返ってきてしまいます。問題点や改善点がわかる方、よろしくお願いします。

専門家に質問してみよう