トピック関連記事
48時間以内の記事は New Mark で表示されます
無題
初めてのプログラム

皆さんこんばんは。

初めてプログラムを作ってみました。
タイマー0割り込みをつかって、
RB3を常時点燈、RA6に信号が入ったら、RB3を消灯

しかし、RB3がSW ONでいきなりつきません。
どこが悪いのかご指摘願います。
宜しくお願いします。

RA6はプルアップ、RB3はプルダウンです。




/*タッチプローブ*/
// PIC16F1827 Configuration Bit Settings
//RA6 マッハからの信号
// 'C' source line config statements
#include <xc.h>
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = HI // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
// __delay_ms(), __delay_us()関数が使用する
#define _XTAL_FREQ 8000000
#define On 1
#define Off 0

//プロトタイプ宣言
void InitInterTimer0 (void);
void interrupt isr ( void )
{//TMR0の割り込み処理
if(RA6==Off )
{

RB3=Off;
INTCONbits.TMR0IF=0;//タイマ0割り込みが入った際、TMR0IFが1になるので、0で初期化
INTCONbits.TMR0IE=1;//タイマー0を有効化
}
}
// メイン関数
void main (void){
OSCCON = 0b01101001;//内蔵発振器 8MHz使用に設定
PORTA = 0x00;// 電圧レベルの初期設定
PORTB = 0x00;
// 入出力設定
TRISA = 0b00110000;//RA5は入力専用・RA6は入力,他は出力
TRISB = 0b00000000;//RB3はLED用出力
//初期設定
RB3=On;
RA6=On;

InitInterTimer0 ();
INTCONbits.GIE=1;

while(1){

RB3=On;
}
}
//タイマ0割込み設定関数
void InitInterTimer0 (void)
{//割り込み設定
OPTION_REG=0b100000000;//プリスケラ000  5ビット=0内部クロック使用 WDTは使わない
TMR0=0x00;
INTCONbits.TMR0IF=0; //TMR0フラグクリアー
INTCONbits.TMR0IE=1;//TMR0割り込み許可
INTCONbits.GIE=1;//全体割り込み許可
}

TR 2018/11/29(Thu) 21:41 No.1261
Re: 無題
プログラムの方はまだちゃんと見ていませんけど、回路図をみると、RB3は
・LOW出力で点灯
・HIGH出力で消灯
・入力時(プルアップ無)で弱点灯
という回路になっています。

※LEDを光らせるのにプルする必要はありません。
猛牛ロック   2018/11/29(Thu) 22:30 No.1262
Re: 無題
TRさん,猛牛ロックさん,こんばんは。

TRさん,頑張ってますね。
私の環境でも通りますので,シンタックスエラーはないようです。

これが一番やっかいなんです。

ここからは,自分のやりたいことが表現?されているか,
一つ一つつぶす作業だと思います。

回路については,ちょと私は,分からないところがあるのですが,正しいものとしてプログラムだけ見ました。

忘れてしまっている部分も多いので,なんともいえないのですが,

TRさんのプログラムだと,

  RA6=On

の時の処理が割り込み処理に書かれてないように思います。次のようにしてはどうでしょうか。

void interrupt isr ( void ){//TMR0の割り込み処理
if(RA6==Off ){
RB3=Off;
}
if(RA6==On ){
RB3=On;
}
INTCONbits.TMR0IF=0;//タイマ0割り込みが入った際、    TMR0IFが1になるので、0で初期化
INTCONbits.TMR0IE=1;//タイマー0を有効化
}

こうした上で,main の

while(1){
RB3=On;
}


while(1){
} 

のようにしてみてはどうでしょうか。実際にやってみないので,動くかはは分かりません。

それと,このままだとLEDがちらつくかも。

スイッチが押された時に,一度だけLEDをONにする,

それと,LEDをOffにするのは,LEDがOnの時だけにする,

等の判断をいれないと,同じ処理を何度も繰り返すことに

なると思います。
mabo   2018/11/29(Thu) 22:31 No.1263
Re: 無題
猛牛ロックさんへ

>・LOW出力で点灯  → これは分かります。
・HIGH出力で消灯   → これも分かります。
・入力時(プルアップ無)で弱点灯  これがわかりませんので、教えてください。
という回路になっています。

※LEDを光らせるのにプルする必要はありません。   ここも教えてください。


追記
PICのI/Oってよくわからないのですが、
ひょっとして、RB3のプルダウン抵抗は、RB3に何もつながっていない場合は、10kオームの抵抗は必要だけど、
LEDをつける場合は、逆に、電圧が、180kオームとLEDと10キロΩによって分圧されるということですか?
TR   2018/11/29(Thu) 22:49 No.1264
Re: 無題
maboさんへ


>同じ処理を何度も繰り返すことに


なるほど〜。
タイマー0割り込みって奥が深い。

フラグを使えばいいのかも!
TR   2018/11/29(Thu) 23:11 No.1265
Re: 無題
プログラムを一通り見ました。

> #define On 1
> #define Off 0

回路的にはSWもLEDもアクティブローです。

あと、通常のPICは
PORTレジスタは読み取り用、
LATレジスタは出力用
となります。使い分けた方が良いです。


> while(1){
>
> RB3=On;
> }
これだと、仮にタイマー割り込みで消灯したとしても気が付きません。
すぐに点灯します。

タイマー割り込みをするなら、割り込みがかかる周期を把握した方が良いです。
普通は、キッチリとした時間が欲しいからタイマー割り込みを使うのです。

> PORTA = 0x00;// 電圧レベルの初期設定
> PORTB = 0x00;

> //初期設定
> RB3=On;
> RA6=On;

2回初期設定しても意味がありません。
また、RA6=Onと入力ピンに代入しても意味がありません。

> 入力時(プルアップ無)で弱点灯
入力時(プルアップ無)はハイインピーダンスです。
つまり、PICとは繋がっていないのと同じ状態です。
5V---150Ω---LED---10kΩ---GND
という回路ですから、0.3mA程度流れる筈です。
部屋を暗くすれば十分に光っているのが判る筈ですけど。


> ※LEDを光らせるのにプルする必要はありません。
入力時にプルをするのは、未接続時には、いろんな電圧値を示す為です。
例えば、SW-5Vと繋ぐなら、SWオンのときはHIGHレベルになります。でも
未接続だと、SWオフの時はHIGHの時もあればLOWになる時もあります。
なので、押していない時の識別の為に、押した時と逆側にプルします。

出力時は、HIGH/LOWいずれにしても、どちらかをを出力します。
LEDの場合は直接的に駆動させるだけです。プル抵抗は無駄な電気を使うだけです。
ただし、トランジスタを使う場合はPICが駆動されない(電源が入っていない)時や入力の場合に
つまり、上記で言う未接続相当の時に、トランジスタのゲート或いはベースがトランジスタをオンにしてしまう電圧に
なる場合があります。そういった誤動作を防ぐためにプルします。

追記します。

MABOさんのが正しい処理です。LEDがちらつくこともありません。

ただし、main関数で
while(1){
}
として、タイマー割り込みで
if(RA6==Off ){
RB3=Off;
}
if(RA6==On ){
RB3=On;
}
とするなら、最初からmain関数で
while(1){
if(RA6==On ) RB3=On;
else RB3=Off;
}
とすれば良いです。タイマー割り込みを使う意義がありません。


更に追記します。

押す度にオンとオフを繰り返すようなプログラムなら、フラグ処理が必要です。
また、チャタリング現象の考慮も必要になります。

あと、
if(RA6==Off ){
RB3=Off;
}
if(RA6==On ){
RB3=On;
}
は、短くすると
RB3=RA6;
でも良いはずです。
猛牛ロック   2018/11/29(Thu) 23:38 No.1266
Re: 無題
猛牛ロックさん,TRさん,こんにちは。

猛牛ロックさん,適切なアドバイス,ありがとうございます。

いつものことながら見識の深さにおどろかされます。



TRさん,書き込みいただいたプログラム,うまく動いたでしょうか。

私も,割り込み処理等の動作確認で,TRさんの書かれたようなLEDチカのプログラムよくつかいました。

X IDEには,シュミレーターもついていて,それを動かせば,各値等の確認できるようですが,実際にLED等で,確かめた方が私にはてっとりばやいです。

タイマーフラグのクリアーやらレジスターの再設定等,TRさんが書かれたプログラムのように書いて,

思った動作をしないで,悩んだことも多々あります。

この辺は,きっと,場数なんでしょうかね。
mabo   2018/11/30(Fri) 12:19 No.1267
Re: 無題
みなさんこんばんは。

猛牛ロックさんいつもありがとうございます。
maboさんも、いろいろとご指導に感謝します。


タイマー0割込みですが、キットで遊ぼうの域からは脱していません。
今のところ、以下のプログラムです。


最初は、入力SWから、出力端子の操作ができるかと思ったのですが、ダメでした。
外部割込みなら行けそうですが、
外部割込みをやってみます。


それと、入力端子を使っての出力端子の操作は、1827で出来るのでしょうか、
というのも、ツールラボさんの記事を見ていたら、IOCAN3 = 1;
IOCANレジスタなんですね、これは、PORTA3番ピンに機能があって、この機能を使えば
簡単に入力端子のHiでプログラムを組めるようです。
ツールラボさんは、1823でしたっけ、、、。


それとハイインピーダンスの件、ありがとうございます。
I/Oピンの仕組みはまだよくわかっていないです。
でも想像した通り、180オーム-LED-10kオームで分圧されてしまうようですね。


常時RB3を点灯させ、
タイマー0割込みで、RB4を点滅させています。

// PIC16F1827 Configuration Bit Settings

// 'C' source line config statements
#include <xc.h>
// CONFIG1
省略
#pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
// __delay_ms(), __delay_us()関数が使用する
#define _XTAL_FREQ 1000000
#define On 1
#define Off 0
// プロトタイプ宣言
void InitInterTimer0 (void);

// メイン関数
void main (void)
{
OSCCON = 0b01011010; // 内部クロック周波数を1MHzに設定
// 電圧レベルの初期設定
PORTA = 0xFF;
PORTB = 0xFF;
// 入出力設定
TRISA = 0x20;
TRISB = 0x00;

// タイマ0割込み設定関数の呼び出し
InitInterTimer0();
// 割込み全体の許可
GIE = 1;
// 永久ループ
while(1)
{
RB3 =1;
}
}

// 割込みサービスルーチン
static void interrupt isr()
{
RB4 =1;
__delay_ms(3000);
RB4=0;
__delay_ms(3000);
// タイマ0割込みフラグをクリア
T0IF = 0;
}

// タイマ0割込み設定関数
void InitInterTimer0 (void)
{
OPTION_REG=0b000000000;//プリスケラ000  5ビット=0内部クロック使用 WDTは使わない
TMR0=0x00;
INTCONbits.TMR0IF=0; //TMR0フラグクリアー
INTCONbits.TMR0IE=1;//TMR0割り込み許可
INTCONbits.GIE=1;//全体割り込み許可
}
TR   2018/11/30(Fri) 22:45 No.1268
Re: 無題
> でも想像した通り、180オーム-LEDる-10kオームで分圧されてしまうようですね。

いいえ、単なる直列回路です。入力時は、
5V-10180オーム-LED-GND
と同じと言う事です。
HIGH出力時は、LEDは5Vと5V(HIGH)に挟まれているので、LEDには電気が流れませんけど、10kΩには電気が流れます。
つまり、無駄です。
LOW出力時には5V-LED-LOWと流れるのでLEDは光ります。10kΩの方には電気は流れません。
いずれにしても、10kΩは付ける意味がありません。

> 入力SWから、出力端子の操作ができるかと思ったのですが
言っている意味が解りません。
プログラムのどこからでも出力端子は操作できます。
RB3をLOWにしたいと言う事でしょうか?
それなら
RB3=0;
と書けばLOWになります。


> IOCANレジスタなんですね、
F1827の基本的な構成として、入力がポートB、出力がポートAに割り当てられています。
まぁ、絶対的なものではありませんけど。
で、同じもの(INT/IOC)は1827にもありますけど、ポートBです。


で、今回のプログラムですけど、悪い例です。
タイマー割り込みは正確な時間を作り出します。
しかし、このプログラムでは__delay_ms(3000);で、正確な時間の取得を壊しています。
なぜなら、タイマー割り込みの間隔を超えているからです。
また、タイマー割り込みを使う意味も全くありません。
タイマー割り込みを使うもう一つの利点はdelay関数を使わないプログラムにする、という点です。

まずは、タイマー割り込みの時間(間隔)を把握しましょう。
1msや10msにしても良いですし、中途半端な値でも駄目ではありません。
駆動周波数とプリスケーラ、タイマー値から、算出(設定)してください。
それがタイマー0の単位時間です。単位時間内に収まる処理にする必要があります。


※基本的には、周辺機能(タイマーや外部割り込み等)は使わずにGPIO操作を覚えた方が良いです。
まずはGPIO操作で、壁にぶつかるまで押し通した方が良いです。
今は分散してしまっていて、見通し悪いプログラムになっていて、自分で原因を見つけるのが困難になっています。
CONFIGやクロック設定などは、どっかからのコピーで良いですけど、ピン操作(初期設定)からは、
どう制御しているのか、100%自信をもって書いてください。
理解せずに動いても意味がありません。
逆に、理解していないものを書いてはいけません。
自分の理解と共に、出来る範囲を増やす事です。
特に動かないのを、何故そうなったか理解しようとせずに、他の機能に移るのは止めるべきです。
動かないのは、目の前に覚えるべきことがあるからです。
そこを乗り越えてはじめて、1つスキルが上がるのです。
猛牛ロック   2018/12/01(Sat) 00:30 No.1269
Re: 無題
猛牛ロックさん,TRさん,こんばんは。

猛牛ロックさん,今日もありがとうございます。

TRさん,新しいプログラムですね。

割り込みの中で,

__delay_ms(3000);

をお使いのようですが,好みからいったら,割り込みに入った回数をカウントして,LEDのOnとOffを交互にすればいいように思いますが,どうでしょうか。

static void interrupt isr(){
 if(Count<一定数){Count++;}
 Else{ Count=0;RB4=RB4~;}

T0IF = 0;


間違ってるかもしれませんが,上記のようにすれば,いいかもですね。

それから,

 RB3

ですけど,1回だけOnにすれば,いいので,

RB3 =1;
while(1)
{
}

みたいにWhileの外にだした方いいと思います。
Whileの中にあると,RB3を1にする動作を繰り返すことになります。


今日は,ちょっと,下記を参考にシュミレートをいろいろやってみました

http://www.geocities.jp/zattouka/GarageHouse/micon/MPLABX/Simulator1.htm
mabo   2018/12/01(Sat) 01:09 No.1270
Re: 無題

>F1827の基本的な構成として、入力がポートB、出力がポートAに割り当てられています。
 ・・・・・・
で、同じもの(INT/IOC)は1827にもありますけど、ポートBです。


そうか!
データシートを見るとありました。
写真の赤枠!
1827の場合、ピンに入った信号を読み取る場合、読み取れる選択肢は、
bit0〜bit7までの全てですね! オー、沢山ある。

RB6に割り込み有効化
IOCIE = 1;
IOCBN3 = 1;
GIE = 1;

常時動作

RB6 割り込み無効化
GIE = 0;
IOCIE = 0;
IOCBN3 = 0;

割り込み処理プログラム
void interrupt isr(void)
{

}


これで、常時動作の最中にRB3にLo信号が入れば、割込みができると思いますが。



>単位時間内に収まる処理にする必要があります。


サブルーチンの作業時間は、タイマー割り込みの時間(間隔)内にするということですか?
今は、
サブルーチンは、割込みが始まって、RB4 =点灯〜3秒据え置き〜RB4消灯〜3秒据え置き
 そして、メイン関数内のRB3点灯させています。

サブルーチン内の割込み開始から割込み作業終了の間の時間(点灯3秒+消灯3秒)をタイマー割込み時間(間隔)内にするのですか?
タイマー割込み時間(間隔)内にする作業の種類にするということですか?

タイマー割込み時間(間隔)内にRA6がハイかローかの確認作業など


>※基本的には、周辺機能(タイマーや外部割り込み等)は使わずにGPIO操作を覚えた方が良いです。
まずはGPIO操作で、壁にぶつかるまで押し通した方が良いです。


自分は、進みます。
これからも宜しくご指導願います

TR   2018/12/01(Sat) 08:28 No.1271
Re: 無題
maboさん,こんにちは。


>割り込みの中で,

__delay_ms(3000);

をお使いのようですが,好みからいったら,割り込みに入った回数をカウントして,LEDのOnとOffを交互にすればいいように思いますが,どうでしょうか。

static void interrupt isr(){
 if(Count<一定数){Count++;}
 Else{ Count=0;RB4=RB4~;}

T0IF = 0;


プログラム全体を見させていただけませんか?




>それから,

 RB3

ですけど,1回だけOnにすれば,いいので,

RB3 =1;
while(1)
{
}

みたいにWhileの外にだした方いいと思います。
Whileの中にあると,RB3を1にする動作を繰り返すことになります。



分かりました。



>今日は,ちょっと,下記を参考にシュミレートをいろいろやってみました

http://www.geocities.jp/zattouka/GarageHouse/micon/MPLABX/Simulator1.htm


シュミレーターの使い方なんですね。
機会があったら、見ようかと思います。ありがとうございました。
TR   2018/12/01(Sat) 08:39 No.1272
Re: 無題
TRさん,猛牛ロックさんおはようございます。

TRさん,プログラムの全体ですが,

1268のTRさんのプログラムで,割り込みの部分だけを
入れ替えて,main の方で,RB3を外にだせばいいと思います。

割り込みのなかで,

 T0IF = 0;

を使ってますが,もしかして,コンパイル通らないかもですね。

 T0IF = 0→INTCONbits.TMR0IF=0

でしょうか。

カウントの定数は,オーバーフローしない範囲で,
好みでいいと思います。

定数を多くすれば,点滅の間隔が長くなります。

この間隔は,割り込みの時間等を考えれば,割り出せるのでしょうが,私は,適当なことが多かったです。

ただ,タイマーのプログラムで使った時は,だいたい正確な時間になるように,トライアンドエラーで調整しました。
mabo   2018/12/01(Sat) 09:29 No.1273
Re: 無題
皆さん方のご指摘を踏まえて、下記の通りプログラムを変えました。

常時は、フラグによりRB3をハイにしたりローにしたりの動作です。

割込み時には、エベントフラグが0なら、強制的に
イベントフラグを1にさせます。

しかし、XIDEのバージョンの関係かどうかわかりませんが
@にエラーが出ています。
以前のNo1268ではそんなことがなかったのに( 一一)
プログラムが悪いのでしょうか?


// PIC16F1827 Configuration Bit Settings
//RA6 マッハからの信号
// 'C' source line config statements
#include <xc.h>
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = HI // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
// __delay_ms(), __delay_us()関数が使用する
#define _XTAL_FREQ 1000000
#define On 1
#define Off 0
int event;
// プロトタイプ宣言
void InitInterTimer0 (void);
// メイン関数
void main (void)
{
OSCCON = 0b01011010; // 内部クロック周波数を1MHzに設定
// 電圧レベルの初期設定
PORTA = 0x00;
PORTB = 0x00;
// 入出力設定
TRISA = 0x00;
TRISB = 0x00;
// タイマ0割込み設定関数の呼び出し
InitInterTimer0();
// 割込み全体の許可
GIE = 1;
event=0;//初期値イベント無しRB3ロー
// 永久ループ
while(1)
{
if(event==1)
{
RB3=0;
}
if(event=1){
RB3=1;
}

// 割込みサービスルーチン
@static void interrupt isr()
{
if(RA6==0 && event==0){//もしRA6が押されていて、イベントが起きていなかったら
event=1;
}
// タイマ0割込みフラグをクリア
T0IF = 0;
}

// タイマ0割込み設定関数
void InitInterTimer0 (void)
{
OPTION_REG=0b000000000;//プリスケラ000  5ビット=0内部クロック使用 WDTは使わない
TMR0=0x00;
INTCONbits.TMR0IF=0; //TMR0フラグクリアー
INTCONbits.TMR0IE=1;//TMR0割り込み許可
INTCONbits.GIE=1;//全体割り込み許可
}
TR   2018/12/01(Sat) 10:20 No.1274
Re: 無題
maboさんへ

>1268のTRさんのプログラムで,割り込みの部分だけを
入れ替えて,main の方で,RB3を外にだせばいいと思います。


それでも、良いと思います。



>割り込みのなかで,

 T0IF = 0;

を使ってますが,もしかして,コンパイル通らないかもですね。

 T0IF = 0→INTCONbits.TMR0IF=0

でしょうか。

それは、XIDEのバージョンの関係でコンパイルできなくなります。
今自分は、コンパイルできなくなるのでV3.65を使っています。
V3.65なら、T0IF = 0 でとおります。


猛牛ロックさんが、割込み時間を気にしているのは、
SWによってLEDの操作を考えていると思います。
本来のタイマー0割込みの使い方をしろと言っていると思います。

自分はそう、解釈し新しいプログラムをNo1274に掲載しました。
TR   2018/12/01(Sat) 10:28 No.1275
Re: 無題
TRさん,猛牛ロックさん,こんにちは

TRさん,新しいプログラムですね。

今回は,スイッチ(RA6経由)でLED(RB3)をつける
というプログラムで,スイッチの判断を割り込みで検出するということでしょうか。

これを発展させば,チャタリングの除去等もできますね。

一カ所だけあきらかな間違いがあります。

while(1)
{
if(event==1)
{
RB3=0;
}
if(event=1){
RB3=1;
}

の if(event=1) の部分で,

 if(event==0)

でしょうかね。

@のエラーはちょっと不明です。
mabo   2018/12/01(Sat) 12:44 No.1276
Re: 無題
maboさんこんにちは。

ご指摘ありがとうございます。
早速直しました(笑い

エラー表示をグーグル翻訳すると ↓
main.c:62:警告:(2025)ローカル変数 "isr"の修飾子 "interrupt"は許可されておらず無視されています

しかし、No1268ではそんなことがなかったのに(参った
TR   2018/12/01(Sat) 14:40 No.1277
Re: 無題
TRさん,もしかして空白の問題かも。

isr()→isr ()

X IDEのディターでは,()と関数名の間に空白があるようです。
mabo   2018/12/01(Sat) 14:56 No.1278
Re: 無題
maboさんへ

>X IDEのディターでは,()と関数名の間に空白があるようです。

空白を入れても駄目です。
TR   2018/12/01(Sat) 16:56 No.1279
Re: 無題
ちょっと成形すれば、buildは出来ますよ。
「}」は付けましたか?

SOURCE→FORMATで成形してみた方が良いです。すぐに判ります。

ただし、実行しても何も変化はしない気がします。


<追記します。>

プログラム的には

> PORTA = 0x00;
> PORTB = 0x00;
> // 入出力設定
> TRISA = 0x00;
> TRISB = 0x00;

で、RA3はLOW出力です。※RA6もまたLOW出力です。

タイマー割り込みがかかると
> if (RA6 == 0 && event == 0) {//もしRA6が押されていて、イベントが起きていなかったら
> event = 1;
> }
で、eventが1になります。
※初期化はint event;ではなく、volatile int event;にした方が良いです。

そして、メイン関数の永久ループで、
if (event == 1) {
RB3 = 0;
}
と、元々LOW出力のピンをLOW出力にします。

ちょっと、どうしたいのか、プログラム以前に、目的とする動作が判りません。
どういったプログラムが書きたかったのでしょうか?

元々HIGH出力のRB3を、一度スイッチが押されたらLOW出力に固定したい、という事ですか?
それとも、毎回押す度にトグル動作、とかでしょうか?
猛牛ロック   2018/12/01(Sat) 17:01 No.1280
Re: 無題
猛牛ロックさんこんばんは。


>「}」は付けましたか?


つけ忘れていました。
つけたら、エラー表示がなくなりビルトもできました。

これなら、動作しますかね?

動作
SW On(プルアップRA6がLo)→ RB3がハイ
RB3は、プルアップもプルダウンもなしで、RB3からLED〜180Ω〜GND

SWは、押している時間だけSWが入るタイプです。



でなんですが、、、、

実は、PICの差し込みを間違えて自作の書き込み機が壊れたようです。




>SOURCE→FORMATで成形してみた方が良いです。すぐに判ります。

この方法を教えてください。

色々とすみません。宜しくお願いします。
TR   2018/12/01(Sat) 20:30 No.1282

処理 記事No 暗証キー

- JoyfulNote v6.02 -
++ Edited by Hamel ++