過去ログ [ 0002 ]
過去ログ:
ワード検索: 条件: 表示:
Page: | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
config 投稿者:TR 投稿日:2018/11/01(Thu) 20:10 No.1175

https://tool-lab.com/make/pic-basic-21/
このサイトを良く見たいと思います。

Re: config
16F88のコンフィグの設定方法ですが、↓のサイトから、下記のとおりにしました。
http://rikei60.web.fc2.com/toybox/sokkyo/16F88conf.htm


間欠プログラムでの制御として間欠をLEDでモニターしているのですが、
下記のように変更の結果結果、物凄くLEDが点滅するようになりました。
点滅の速度を16F627と同じようにするにはどうしたらよいか教えて頂けませんか?
宜しくお願いします。

   記
88の場合、内部クロックが627Aと違って、内部クロックを8MHzにしました。
それと、
627Aの時 OSCF=1;//内蔵発振器 4MHz使用に設定 したのを
88 用に、OSCCON = 0x70;  このようにしました。


写真ですが、
IDXの設定ですが、627Aから、簡単に88に出来ました。
TR   2018/11/01(Thu) 22:23 !email! No.1176 !ico_edit!
Re: config
駆動速度の分(2倍)だけ早くなっているのか、「物凄くLEDが点滅」では
判断できません。

通常、delay関数を用いた時間軸なら_XTAL_FREQの値を変えれば
コンパイラがその時間に変えてくれます。

それ以外の調整法なら、駆動周波数を4MHzにすることで解消するかもしれません。
ただし、周辺機能を使っている場合は、レジスタの内容が違いますから確認する必要があります。
(勿論、8MHz駆動で、それに合わせて書き換えても良いです)

「物凄く」と言う事なら、もしかしたら、再起動を繰り返してるのかもしれません。
まずは、まっさらものにdelayを使った点滅プログラムを書いて、期待した周波数で
起動しているか確認した方が良いです。
猛牛ロック   2018/11/02(Fri) 03:49 !email! No.1177 !ico_edit!
Re: config
以下のとおりに再度、コンパイルしたら、
上手くいきました。
猛牛ロックさんの言われた意味かどうか分かりませんが、
IDXのプログラム書き込み画面を一度クリアーにして、
コピペし直しました。
#include <xc.h>
#pragma config WDTE=OFF,PWRTE=OFF,CP=OFF,BOREN=OFF,DEBUG=OFF
#pragma config LVP=OFF,MCLRE=ON,CPD=OFF,WRT=OFF,FOSC=INTOSCIO
#pragma config FCMEN=ON,IESO=OFF
#define _XTAL_FREQ 8000000 // delay用
char Second(unsigned int sec);
#define On 1
#define Off 0
#define MACH_sig RA6 //machからの信号入力プルダウン
#define burowa RA2=RA7 //RA2:ブロワ出力 RA7:LED出力
#define vacuum RA3 //掃除機出力
unsigned char PORTB_save; //ポートBの保存用。(変更に対応するため)
unsigned char MODE; //セレクタ保存用
// メイン関数
void main (void){
OSCCON = 0x70; // 内蔵 8MHz
ANSEL = 0; // 全アナログOFF
unsigned int DousaTime,KanketuTime; //宣言。#defineからこちらに変更
char change;
PORTA=0;//出力のピンを初期設定。
// 入出力設定
TRISA = 0b01000011;
TRISB = 0b11111111;//負論理ロータリースイッチ2個。RB0-3が動作時間、RB4-7が間欠時間
OPTION_REG=0b00000000;//ポートBプルアップ
unsigned int TIME[]={60,100,150,200,300,600,900,1200,1800,2400,3000,6000,9000,12000,15000,180};//unsigned intで65000まで
// 永久ループ
while(1){
MODE=PORTA&0b11;
__delay_ms(50);
while(MODE!=(PORTA&0b11)){ //変化があればウェイト、無ければ確定
MODE=PORTA&0b11;
__delay_ms(50);
}
if(MODE==0||(MODE==3&&MACH_sig==0)){//OFF
burowa=Off;
vacuum=Off;
}
else if(MODE==1){//掃除機のみオン
burowa=Off;
vacuum=On;
}
else if(MODE==2||(MODE==3&&MACH_sig==1)){ //間欠
PORTB_save=PORTB;
DousaTime=TIME[PORTB_save&0b1111];
KanketuTime=TIME[PORTB_save>>4];
vacuum=On;__delay_ms(700);burowa=On;
change=Second(DousaTime); //動作時間分ウェイト
if(change==0){
burowa=Off;__delay_ms(500);vacuum=Off;
change=Second(KanketuTime); //間欠時間分ウェイト
}
}
}
}

// 待ち時間関数
char Second(unsigned int sec){//1S→0.1Sに変更。int secに1を入れると0.01秒ウェイト
while(sec >0){
if((MODE!=(PORTA&0b11))||(MODE==3&&MACH_sig==0)||(PORTB_save!=PORTB)) return 1;
//セレクタスイッチが変更された場合とMACH制御でのオフ信号、間欠時間の変更があった場合はwhileから抜ける
sec--;
__delay_ms(10); //この部分を1000→10に書き換えたので1s→0.01s
}
return 0;
}

これで、88でも動作したので、嬉しいです。
configもちょっとは分かりました。
C言語の場合
#pragma これがPICに仕事をさせるうえで、仕事のやり方を決めるようなものなんですね。
TR   2018/11/02(Fri) 07:14 !email! No.1179 !ico_edit!
Re: config
私が指摘したこととは、全く別の要因があったようです。

動いたという事は、それで大丈夫だと思います。

config自体は、プログラムとは無関係です。configの内容とプログラムの内容の整合性はチェックしません。(多分)
使う用途にあわせて、スイッチを設定するだけです。但し、マイコン毎に持っている機能が違うのでconfigの内容は異なります。
それはレジスタも同じです。
どのマイコン(PIC16F)でも
OSCCON = 0x70;
で内蔵8MHzを意味するのでもありませんし、
ANSEL = 0;
で、全アナログOFFを意味するのでもありません。

PICの仕様として、configはプログラムに記述して、プログラムの書き込み時に両方とも書き込みます。
#pragmaは、コンパイラの特別指令、という意味合いです。
猛牛ロック   2018/11/02(Fri) 12:31 !email! No.1180 !ico_edit!
Re: config
connfig設定の
#pragma config FOSC=INTOSCIO
この意味がやっと分かりました。

それと、C言語の場合、main関数の中でOSCCON = 0x70; // 内蔵 8MHz と書き込みますが
これとの関係もあるんですね。

クロック設定は、#pragmaで、PIC内部のクロックを使うと指示し、

main関数で、内部クロックの周波数を設定する、
といった具合に2段階で設定されているんですよね。

そして、OSCCON = 0x70;
これの意味ですが、
OSCCONは1バイト、つまり8ビットのレジスタで、写真の様に構成されているんですね。
つまり、OSCCONの8bitを設定してやらないと駄目。

具体的には、8MHzの場合は、
ビットを 01110000 このように設定する
16進数なら0x70となるわけですよね。


後の、ANSEL これは、PICをアナログ運転にするか、それともデジタル運転するかを決めるためのものです。
今回の間欠運転は、デジタル運転です。半固定抵抗を使うときにA/Dのアナログということなんでしょうね。

設定方法は、やはり、OSCCONとおなじで、
8ビットのレジスタに0と1を書き込んでやるようになります。
ANSEL = 0x00;

でなんですが、main関数内で、
OSCCONやANSELは、PICの初期化ということで、main関数内の最初に設定するようですね。


追記
分からいのが、猛牛ロックさんは、ANSELを627Aでは使わなかったけど88で使いましたよね
また、キットで遊ぼうの教本でもANSELを使っていません。
どのようにして使い分けの判断をするのでしょうか?
データシートなのでしょうか?
若しそうであれば、、、
TR   2018/11/03(Sat) 15:56 !email! No.1181 !ico_edit!
Re: config
ANSELの設定の方法が分かりました。 
データシートに有りました。
88は、デフォルトで1
627Aはデータシートに記載なし。
TR   2018/11/04(Sun) 13:54 !email! No.1182 !ico_edit!
Re: config
configのみで決まるもの、プログラミング出来るもの、或いは両者の組み合わせで決まるもの、と
色々な場合があります。

No.1181の添付画像はF88のものでもF627Aの物でもないですよね?
違うデバイスのデータシートは意味がありません。
偶然一致して、動作する事はあるでしょうけど。
OSCCONはおおよそ、オシレータ関係制御レジスタを纏めたもの、というだけの意味で、
多くのデバイスにありますけど、内容は異なります。

627A自体にアナログ・デジタルコンバータ(ADC)はありません。
なので、ANSELというレジスタは存在しません。

ADCはアナログ出力のセンサーだったり、ボリュームの読み取り等で使います。
間欠で、コードスイッチを使って、16ch?を読み取ったと思うのですけど、
その位なら、ADC1ピンで済ませることが出来ます。

PICの場合は通常、アナログ入力になっています。
GPIOとして使う場合はその処理が必要になります。
猛牛ロック   2018/11/04(Sun) 18:03 !email! No.1183 !ico_edit!
Re: config
OSCCONですが、16F88のデータシートを見ていたら、
恐らく写真の奴ではないでしょうか?
デフォルトで -000 000 となっていました。
IRCS2というところでビット4〜6bitを
100とすれば、1Mhzになると思います。
TR   2018/11/05(Mon) 07:22 !email! No.1186 !ico_edit!
Re: config
それは当然F88のデータシートに載っているものなのでF88用です。

そこよりも、P40のOSCCONの説明ページを見てください。
そこに説明してある通りです。

凡そ、内部クロックの設定はIRCFとPLLの組み合わせで決まります。
ただし、OSCCONの中に、IRCFが3ビットで構成されているとか、4〜6bitの位置にあるとか、100にすれば1MHzになるとか、
そういった決まりはありません。

場合によってはOSCCONではない所にIRCFでは無い名前で内蔵クロックの設定が存在するかもしれません。
猛牛ロック   2018/11/05(Mon) 09:59 !email! No.1187 !ico_edit!
Re: config
>P40のOSCCONの説明ページを見てください。


中程に bit6-4 とあって
赤矢印に100=1MHz
この事から、6〜4ビットを100とすれば、1MHzの設定となるわけですか?

自分の資料としているコピーが増えてきました。
TR   2018/11/05(Mon) 15:26 !email! No.1188 !ico_edit!
Re: config
そうです。そのあたりの項目をよく読む必要があります。
特にNoteと書いてある欄にも重要事項が書かれていたりもします。

F88の場合はIRCF以外にも、OSCCONのbit 1-0 SCSの所でもちゃんと選択している必要があり、
更にCONFIGのFOSCの設定も必要です。
その3つがちゃんと選ばれて、内蔵1MHzになります。
猛牛ロック   2018/11/05(Mon) 17:40 !email! No.1189 !ico_edit!
Re: config
40頁の以下については分かりませんでした。

00 = Oscillator mode defined by FOSC<2:0>
01 = T1OSC is used for system clock
10 = Internal RC is used for system clock
11 = Reserved

参りました。
TR   2018/11/05(Mon) 20:58 !email! No.1190 !ico_edit!
Re: config
そこに書いてある事も当然重要なのですけど、P39の説明がまた重要です。
つまり、P40の部分だけを見ても失敗しがちです。(例外とかが書いてあったりします)

PICを使いこなすにはデータシートを熟読する必要があります。
私の印象ではAVRはどちらかというと、ユーザーが使いやすい形に仕上げてありますけど、
PICは、全て操作できるように出しておくから、後は勝手にやってくれ、という感じです。

その説明自体は簡単です。
00だとFOSC(config)で設定した通りに起動します。
01だとT1OSCがシステムクロックとして使われます。
10だと内蔵RCがシステムクロックとして使われます。
11はリザーブ(ここは使わない)
です。
猛牛ロック   2018/11/06(Tue) 09:36 !email! No.1191 !ico_edit!
マルチボード 例題3 投稿者:猛牛ロック 投稿日:2018/10/27(Sat) 13:10 No.1149

ここまで、ポート操作の方が優れているように書いてきましたけど、
実際にはビット操作の方が安全です。

というのはポート操作はちゃんとマスク処理をしないと、「その他のピン」にも影響を及ぼします。
その点、ビット操作の方は、既に関数自体に、「その他のピン」には影響を及ぼさない様になっているので、
初心者向け、と言えると思います。

で、今回の例題ですけど、似たようなものを3つ考えました。
回答はまだ考え中(1つ2つなら、直ぐにできるのですけど)です。
今回はLEDのバラバラな制御です。まぁ、通常、課題1や2のように4つを同じ様に
点滅させることなんてありませんから、こちらがより普通の制御になります。

8つ位LEDがあればもっと面白い例があるのでしょうけど、思いつきませんでした。
「こんな形をプログラムしたい」というのがあれば言ってください。
重要な事は、頭に浮かんだものをプログラム出来るようになることです。


例題
3-1
添付図左のように、1方向にスクロールさせる。

3-2
添付図中のように、往復させる。

3-3
添付図右のように、2進法で、0→15のカウント(繰り返し)

です。間隔は0.5sにして下さい。

Re: マルチボード 例題3
本当にすみませんが、自分はarduinoはやりません。
PICとarduinoは自分にとって違いすぎます。
買ってみてそれが分かりました。
PICの理解を深めたいと思います。

プログラムもそうだし。
PIC自体も良く分かっていません。
出力端子や入力端子です。

例として、
つい最近分かりました。
SEC基板の出力端子 1番、
これに間欠プログラムのPICのRA6を繋いでいますが、
これは出力端子の設定です。

素人的に考えると、
出力端子と出力端子が繋がっていること自体、不思議な感じです。

CMOSのトーテムポールというそうですが。
PICの端子の構造は、NチャンPチャンは繋がっているそうですね。
TR   2018/10/27(Sat) 19:14 !email! No.1150 !ico_edit!
Re: マルチボード 例題3
3−1の回答です。

// PIC16F627A Configuration Bit Settings
// 'C' source line config statements
#include <xc.h>
#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = ON
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config CP = OFF
#define _XTAL_FREQ 4000000 //delay用

void main(void) {
CMCON = 0x07;//コンパレータ不使用

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

// 入出力設定
TRISA = 0x20;
TRISB = 0x00;

// 永久ループ
while(1) {
PORTB = 0b11111110; //LED1のみ点灯
__delay_ms(1000);
PORTB = 0b11111101; //LED2のみ点灯
__delay_ms(1000);
PORTB = 0b11111011; //LED3のみ点灯
__delay_ms(1000);
PORTB = 0b11110111; //LED4のみ点灯
__delay_ms(1000);
}
}


回答に当たっては、教科書を参考にしました。
TR   2018/10/27(Sat) 20:26 !email! No.1151 !ico_edit!
Re: マルチボード 例題3
そうですか。それは残念です。

本質的には、PICもArduinoもAVRもSTMも同じなので、PICを使えるようになれば
Arduinoも使えるようになると思います。

で、回答ですけど、ほぼ合ってはいますけど、修正点もあります。

1.接続ピンが違います。その学習ボードのRA2〜RA5にLEDを付けて試してください。

2.↑のNo.1149でも書いたように、その書き方だと今回使用していないピンまで、
 変更してしまいます。なので、ちゃんとマスク処理をした方が良いです。

3.使わないピンは入力にしておくべきです。何か不慮の事、つまり、
 他のラインとの短絡があった時に PICを守ります。
猛牛ロック   2018/10/27(Sat) 21:10 !email! No.1152 !ico_edit!
Re: マルチボード 例題3
回答3-1-@ TRさんの修正版

#include <xc.h>
#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = ON
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config CP = OFF
#define _XTAL_FREQ 4000000 //delay用

void main(void) {
CMCON = 0x07;//コンパレータ不使用

PORTB = 0xFF;
TRISA = 0xFF;
TRISB = 0xC3;

while(1) {
PORTB = (PORTB&0xC3)|(0b1110<<2); //LED1のみ点灯
__delay_ms(500);
PORTB = (PORTB&0xC3)|(0b1101<<2); //LED2のみ点灯
__delay_ms(500);
PORTB = (PORTB&0xC3)|(0b1011<<2); //LED3のみ点灯
__delay_ms(500);
PORTB = (PORTB&0xC3)|(0b0111<<2); //LED4のみ点灯
__delay_ms(500);
}
}



回答3-1-A @を纏めたもの。ノーマル?

//config略
unsigned char fig[4]={0b1110,0b1101,0b1011,0b0111};
void main(void) {
CMCON = 0x07;//コンパレータ不使用

PORTB = 0xFF;
TRISA = 0xFF
TRISB = 0xC3;

while(1) {
for(char i=0,i<4;i++){
PORTB = (PORTB&0xC3)|(fig[i]<<2); //LED1のみ点灯
__delay_ms(500);
}
}
}


回答3-1-B 初心者用

//config略

void main(void) {
CMCON = 0x07;//コンパレータ不使用

PORTB = 0xFF;
TRISA = 0xFF
TRISB = 0xC3;

while(1) {
RB5=1;
RB2=0;
__delay_ms(500);
RB2=1;
RB3=0;
__delay_ms(500);
RB3=1;
RB4=0;
__delay_ms(500);
RB4=1;
RB5=0;
__delay_ms(500);

}
}


解説
@
ディレイ時間も0.5sだったので修正しました。
ピンの初期設定は、出力設定にするのものはちゃんと入れておきます。
ポートAは全て入力なので、接続状態により自由に変化するレジスタに何を入れても意味がありません。
PORTB&0xC3は0b□□0000□□となります。※□部はPORTBの元の値です。つまり、代入する部分を0でくり抜いています。
0b1110<<2は0b00「1110」00です。つまり、表示形を当てはめる位置に移動させています。
それを「|」をする事で、0b□□1110□□が完成します。
このマスク処理も初心者には難しい所でしょうけど、覚えなければ、1.ポート全部を犠牲にするか、2.ビット操作のみでやり過ごすか、の
2択になります。※ビット操作のみの回答が3-1-Bになります。


A
@を纏めたもの。勿論4つ位ではそのまま書いても気になる範囲ではありませんけど、
これが8個、16個となると、並べるのも恥ずかしくなります。
点灯形を別に用意すると、見やすくなります。


B
これが最も初心者用のプログラムです。
ビット操作にしているので、マスク処理は必要ありません。
この程度のプログラムなら、こちらも判りやすいですね。
猛牛ロック   2018/10/27(Sat) 22:15 !email! No.1153 !ico_edit!
Re: マルチボード 例題3
0b1110とはRB=00001110ということですか??



回答3-1-@はエラーが出ます。

追記
エラーの理由が分かりました。
TRISA = 0xFF の後に「;」がありませんでした。

ボードのLEDは、中4個のLED]がずれながら、点灯していきます。
TR   2018/10/28(Sun) 11:45 !email! No.1155 !ico_edit!
Re: マルチボード 例題3
3-2の回答案です。
// CONFIG 省略

#define _XTAL_FREQ 4000000 //delay用
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>

// メイン関数
void main (void)
{
unsigned char fig[7]={0b1110,0b1101,0b1011,0b0111,0b1011,0b1101,0b1110};
unsigned char i = 0;// 点灯パターン配列の添え字用変数の初期値

// 1,2,17,18端子を入出力端子に設定
CMCON = 0x07;

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

// 入出力設定
TRISA = 0xFF;
TRISB = 0xc3;

// 永久ループ
while(1)
{
PORTB = (PORTB&0xC3)|(fig[i]<<2);//LED1のみ点灯
__delay_ms(500);

// 添え字が6よりも小さい場合
if(i < 6)
{
// 添え字に1プラスする
i++;
}
// その他の場合(添え字が7の場合)
else
{
// 添え字を0にする
i = 0;
}
}
}
TR   2018/10/28(Sun) 15:44 !email! No.1156 !ico_edit!
Re: マルチボード 例題3
番の問題はお手上げです。
マスク処理という意味を調べました。

意味は、
必要なビット以外をOFF(0)にする処理(マスクといいます)に使用されます。

わざわざ演算子を使って「0」にしなければならないので、
3番はお手上げです。

ただ、ループの関数ですが、便利なのを見つけました。

従来
cnt ii;//変数の定義
cnt =00//初期値の設定
処理
if(ii<3){
ii++;
else(
i=0
)
}


for文の利用
for(ii=0;ii<3;ii++){
処理
}
TR   2018/10/29(Mon) 07:07 !email! No.1157 !ico_edit!
Re: マルチボード 例題3
> TRISA = 0xFF の後に「;」がありませんでした。 No.1156

あっ、忘れていました。
後で修正しておきます。

> No.1157

おぉ、いい感じじゃないですか。

修正点としては
unsigned char fig[7]={0b1110,0b1101,0b1011,0b0111,0b1011,0b1101,0b1110};
としていますけど、実際は
unsigned char fig[6]={0b1110,0b1101,0b1011,0b0111,0b1011,0b1101};
と1つ少なくて良いです。

if(i < 6) i++;
else i = 0;

の部分は例えば
i++;
if(i==6)i=0;

とか、それよりもよく使われるのが

i=(i+1)%6;
です。

> No.1157

マスク処理は初心者には難しいです。それはビット演算子を使わないと出来ないからです。
AVR派は日常的にビット演算子を使います。PIC派はピン操作をRA=2;みたいに書けるので
ビット演算子に不慣れな人が多いような気がします。

マスク処理自体は重要です。ポートで弄る時には必須です。勿論、ポート全て使うなら必要ありませんけど。


> cnt ii;//変数の定義
> cnt =00//初期値の設定

これは
char ii=0;
という事ですよね?

ループ関数は正確には、その2つの意味が違います。

従来の方は
・処理を1回行います。
・次にif文で、iiが1になります。
それで終了です。

for文の方は
iiが0になり、比較文で真なので、処理が行われる。
iiが1になり、比較文で真なので、処理が行われる。
iiが2になり、比較文で真なので、処理が行われる。
iiが3になり、比較文で偽なので、for文を出る
と3回行われます。そして、出て来たときにはiiの内容は3です。
猛牛ロック   2018/10/29(Mon) 12:45 !email! No.1158 !ico_edit!
Re: マルチボード 例題3
>従来の方は
・処理を1回行います。
・次にif文で、iiが1になります。
それで終了です。

上記の意味は、下記の事ですよね。
   記
{
処理;
if(i < 6)
{
// 添え字に1プラスする
i++;
}
}

どうしてですか?
iは、最初が0
i++なので、0+1=1 つまり、配列の添え字が1
その1に対応する値で次の処理をし、
処理をしたら、
またI++なので、1+1=2 配列の添え字が2の値で処理をするので、
iは、どんどん増えて5まで増えるのではないでしょうか??
TR   2018/10/29(Mon) 14:48 !email! No.1159 !ico_edit!
Re: マルチボード 例題3
あぁ、それはwhileですね。
i=0;
while(i<6){
//処理
i++;
}


for(i=0;i<6;i++){
//処理
}

が同じ意味になります。

if文は「もし〜なら」、だけの一度だけの処理です。
繰り返しは多分、for文とwhile文、あとはdo 〜 while文の3つ位だと思います
猛牛ロック   2018/10/29(Mon) 14:57 !email! No.1160 !ico_edit!
Re: マルチボード 例題3
違う解き方を2つ。

//3-2方向の切り替え
//略
void main (void) {
PORTB = 0xFF;
TRISA = 0xFF;
TRISB = 0xc3;

char dir=1;//方向
char fig_num=0;//何番目が光るか(0-3)
while(1) {
PORTB=(PORTB&0xC3)|(~(1<<fig_num)&0x3C);
fig_num+=dir;
if(fig_num==0)dir=1;//下まで来たら+
else if(fig_num==3)dir=-1;//上まで来たら-
__delay_ms(500);
}
}

※より多くのLEDの場合はこのように方向を切り替えてやる方式の方が適しています。
8個ぐらいあればこっちの方にするかな?



//3-2PIC初心者向
//略
unsigned char fig[6][4]= {
{0,1,1,1},
{1,0,1,1},
{1,1,0,1},
{1,1,1,0},
{1,1,0,1},
{1,0,1,1}
};

void main (void) {
PORTB = 0xFF;
TRISA = 0xFF;
TRISB = 0xc3;

char num=0;
while(1) {
RB2=fig[num][0];
RB3=fig[num][1];
RB4=fig[num][2];
RB5=fig[num][3];
num=(num+1)%6;
__delay_ms(500);
}
}

※Arduinoでも、この書き方がベーシックだと思います。
RB○にchar型を入れるので、場合によってはエラー、若しくは警告が付くかもしれません。
その場合は
RB2=!!fig[num][0];
RB3=!!fig[num][1];
RB4=!!fig[num][2];
RB5=!!fig[num][3];
とすれば、間違いなく通る筈です。
マスク処理が要らないので、初心者にも判りやすいです。
(とはいえ、2次元配列になってしまいましたけど)
猛牛ロック   2018/10/29(Mon) 16:29 !email! No.1162 !ico_edit!
Re: マルチボード 例題3
これは難しいので無理です。
どうも、縦方向に発光するLEDを選んでいるようですが。
猛牛ロックさん、素晴らしいです。

自分は、それより、
今日は、以前、教わった事を自分流に出来たので、良かったです。
それは、SWによって、永久ループから、抜け出る方法です。

unsigned char MODE; //スイッチ保存用

// メイン関数
void main (void){
OSCF=1;//内蔵発振器 4MHz使用に設定
CMCON = 0x07;// 1,2,17,18端子を入出力端子に設定すること
//宣言
PORTA=0;//出力のピンを初期設定。
// 入出力設定
TRISA = 0b00000001;//RA0スイッチ RA7LED
TRISB = 0b11111111;//タイマースイッチ
OPTION_REG=0b00000000;//ポートBプルアップ

// 永久ループ
while(1){
MODE=RA0;
__delay_ms(50);
while(MODE!=RA0){ //変化なければそのまま
MODE=RA0;
__delay_ms(50);
}
if(MODE==1){//RA0スイッチOFF
RA7=1;//LED8ロー
}
else if(MODE==0){//RA0スイッチオン
RA7=1;__delay_ms(700);
RA7=0;__delay_ms(700);
}
}
}
TR   2018/10/29(Mon) 17:40 !email! No.1164 !ico_edit!
Re: マルチボード 例題3
永久ループ(無限ループ)とは条件が無条件=常に真になっているループを指します。
つまり、
while(1)

for(;;)
です。勿論、for(;1;)でも同じです。

で、ここから出るのは、break,return,gotoの3つ位しか方法は無いと思います。

TRさんの提示されたプログラムでは永久ループを抜けた形跡がありません。
※永久ループを抜けたら再起動するのかな?
猛牛ロック   2018/10/30(Tue) 09:35 !email! No.1167 !ico_edit!
Re: マルチボード 例題3
>TRさんの提示されたプログラムでは永久ループを抜けた形跡がありません。

そうでした。私の表現がまずかったです。
気持としては、
スイッチにより、動作を切り替えるでした。

MODO 1(RA0がスイッチOFFで、LED8がロー)
MODE==0でRA0スイッチオン となり、
RA7=が点滅する。


しかし、Windows10とMPLAB IDEV5.05と相性が悪い。
何度も、ファイルを作っては消しての繰り返しです。
TR   2018/10/30(Tue) 19:13 !email! No.1168 !ico_edit!
Re: マルチボード 例題3
一応、3-3の回答も書いておきます。
でも、重要な事は「その時に頭に浮かんだものをプログラミング出来る」ようになる事です。
その意味では、この課題はあまり現実的ではありません。
まぁ、軽く流しておいてください。

3-3はある意味一番簡単です。
 条件が変わって、LEDがアクティブハイ、LEDがRB0からRB3についている場合は
while(1){
PORTB++;
__delay_ms(500);
}
で、目的の動作になります。※勿論主要部のみの記述です。
これをアクティブローに変える事と、ピン位置を合わせる事、そして、マスク処理の3つが加わります。


回答3-3-@ 判りやすいやつ?
//前略
void main(void){
PORTB = 0xFF;
TRISA = 0xFF;
TRISB = 0xc3;

unsigned char num=0;
while(1){
RA2=!(num>>0&1);
RA3=!(num>>1&1);
RA4=!(num>>2&1);
RA5=!(num>>3&1);
}
num++;
__delay_ms(500);
}

※対応するビットを「!」を付ける事で反転=アクティブローにしています。
numはわざと、0〜3にしないで、num++;にしました。

回答3-3-A
//前略
void main(void){
PORTB = 0xFF;
TRISA = 0xFF;
TRISB = 0xc3;

unsigned char num=0;
while(1){
PORTB=(PORTB&0xc3)|((~num<<2)&0x3c);
num++;
__delay_ms(500);
}

※変わった所は、PORTB=(PORTB&0xc3)|((~num<<2)&0x3c);だけです。
 (PORTB&0xc3)は入れる場所を0でくりぬいた形。
 ((~num<<2)&0x3c)はnumを反転(~)させて、2ビット左シフトさせて位置合わせして(<<2)、最後に要らない部分を切り捨てています(&0x3c)。
猛牛ロック   2018/10/31(Wed) 02:31 !email! No.1169 !ico_edit!
Re: マルチボード 例題3
>、重要な事は「その時に頭に浮かんだものをプログラミング出来る」ようになる事です。


それはそうですよね。
なので、間欠タイマーを今でも解明する努力をしています。

ついでで申し訳ないのですが、間欠タイマーでまだ不明な点があるので教えて下さい。

抜粋になります。
// 永久ループ
while(1){
MODE=PORTA&0b11;



else if(MODE==2||(MODE==3&&MACH_sig==1)){ //間欠
PORTB_save=PORTB;
DousaTime=TIME[PORTB_save&0b1111];
KanketuTime=TIME[PORTB_save>>4];
vacuum=On;__delay_ms(700);burowa=On;
change=Second(DousaTime); //動作時間分ウェイト
if文A if(change==0){
burowa=Off;__delay_ms(500);vacuum=Off;
change=Second(KanketuTime); //間欠時間分ウェイト
}
}
}
}
// 待ち時間関数
char Second(unsigned int sec){
while(sec >0){
1f文@→if((MODE!=(PORTA&0b11))||(MODE==3&&MACH_sig==0)||(PORTB_save!=PORTB)) return 1;
sec--;
__delay_ms(10);
}
return 0;
}


※ 永久ループwhileと待ち時間関数char Secondの関係です。

永久ループ内の「change=Second(DousaTime); //動作時間分ウェイト」
上記のカギかっこの指令によりSecond関数が呼び出されて、
while(sec >0){
if((MODE!=(PORTA&0b11))||(MODE==3&&MACH_sig==0)||(PORTB_save!=PORTB)) return 1;
ここへ来ると、
secは0以上なら、
処理if文@をしますよね。
if文@は、MODEが変わった、または、MODE 3且つMach信号無し 又は、PORTBの間欠時間が変わった場合にreturn 1を
change=Second(DousaTime); //動作時間分ウェイ   左のchangeに1を返しますよね。
でも、if文@がNOの場合(MODE等変化なし)は、
if文@{}内の、sec--;に移り、
PORTBの値をマイナスする。しかも、secが0より大きい間中は、マイナス1の計算をすると思います。
次に、
sec--;の計算を終えたら、
return 0; これにより、changeに0が入るので、if文A に移り、
間欠時間の動作をする。
つまり、burowaをOff、vacuumをOFF そして、そのOFFの時間は、
change=Second(KanketuTime); //間欠時間分ウェイト  左により、またまた、待ち時間関数が呼び出されて
PORTBで読み取った時間として、待ち時間関数のsec--;をするわけですよね。
この動作時間と間欠時間の繰り返しを繰り返しになる。


で、
if文@は、MODEが変わった、または、MODE 3且つMach信号無し 又は、PORTBの間欠時間が変わった場合にreturn 1を
change=Second(DousaTime); //動作時間分ウェイ   左のchangeに1を返しますよね。
次の動作は、if文Aになる。
つまり、停止時間をし、次に、MODE等変化なければ、運転時間に移る


以上の解釈で宜しいでしょうか?
TR   2018/10/31(Wed) 15:35 !email! No.1170 !ico_edit!
Re: マルチボード 例題3
質問の最後4行が?です。

Sedond関数で、異常、若しくは変化があった時は、戻り値1です。つまり、changeは1になります。(そこまでは良いです)
で、次の動作はif文Aですけど、if(change==0)は「偽」になるので、その後の{}内は実行されません。
なので、上にある「else if」文のカッコも終わって、while(1)の次の行に戻ります。
猛牛ロック   2018/10/31(Wed) 18:00 !email! No.1171 !ico_edit!
Re: マルチボード 例題3
>なので、上にある「else if」文のカッコも終わって、while(1)の次の行に戻ります。

次の行とは下記のBの行ですか?

   記
// 永久ループ
while(1){
B MODE=PORTA&0b11;



else if(MODE==2||(MODE==3&&MACH_sig==1)){ //間欠
PORTB_save=PORTB;
DousaTime=TIME[PORTB_save&0b1111];
KanketuTime=TIME[PORTB_save>>4];
vacuum=On;__delay_ms(700);burowa=On;
change=Second(DousaTime); //動作時間分ウェイト
if文A if(change==0){
burowa=Off;__delay_ms(500);vacuum=Off;
change=Second(KanketuTime); //間欠時間分ウェイト
}
}
}
}
// 待ち時間関数
char Second(unsigned int sec){
while(sec >0){
1f文@→if((MODE!=(PORTA&0b11))||(MODE==3&&MACH_sig==0)||(PORTB_save!=PORTB)) return 1;
sec--;
__delay_ms(10);
}
return 0;
}
TR   2018/10/31(Wed) 19:17 !email! No.1172 !ico_edit!
Re: マルチボード 例題3
そうです。永久ループの先頭です。
猛牛ロック   2018/10/31(Wed) 21:54 !email! No.1173 !ico_edit!
Re: マルチボード 例題3
レス、遅くなってすみません。
間欠プログラムを契機にC言語を色々と学べて良かったです。
 cnfigはまだよくわかりません。
手元に16F88が有りますので、教えて頂けませんか?
TR   2018/11/01(Thu) 14:34 !email! No.1174 !ico_edit!
TVチューナー内蔵デスクトップパソコン 投稿者:TR 投稿日:2018/10/29(Mon) 15:22 No.1161

最近、PCが遅くなってきて寿命かなと思います。
4年経過しました。
何処な安価なショップ通販で、教えて頂けませんか?
宜しくお願いします。

Re: TVチューナー内蔵デスクトップパソコン
大昔に1度だけTVチューナー付きPCを買いました。
ほぼ、TVを見ずに寿命になったので、それ以降は対象外です。
尤も、WIN98ぐらいからはデスクトップの自作です。

今のマシンはCore i5 2500Kですから、もう7年ですね。

なので、お薦めできるものは判りません。
猛牛ロック   2018/10/29(Mon) 17:39 !email! No.1163 !ico_edit!
Re: TVチューナー内蔵デスクトップパソコン
TRさん,猛牛ロックさん,こんばんは。

高いか安いかはわかりませんが,何度か,利用したことありまmす。

http://www.fujitsu-webmart.com/pc/index0?A=18102921364913437869&cyc=45220&cyc=213630

http://club.express.nec.co.jp/store/tokka/index.html


しばらく前に,本体だけ,2万円ぐらいで,購入したこととあります。

NECの特選街でした。

http://mabo52.sakura.ne.jp/index.php?e=164

サーバー機でした。
mabo   2018/10/29(Mon) 21:49 !email! No.1165 !ico_edit!
Re: TVチューナー内蔵デスクトップパソコン
情報ありがとうございます。
今すぐではないので、注視していきたいと思います。
TR   2018/10/30(Tue) 06:32 !email! No.1166 !ico_edit!
場違いかもしれませんけど 投稿者:TR 投稿日:2018/10/26(Fri) 14:41 No.1146

つい最近ですけど、東北は、宮古市の浄土ヶ浜と秋田県の田沢湖並びに
男鹿半島の寒風山展望台を巡ってきました。
千葉から約1500km弱走りました。
東北はもう冬でした。

写真は浄土ヶ浜ですが、正に極楽浄土の景観でしたよ。
旅日記です。 ↓
http://vfr800.web.fc2.com/trip/2018/oudan.html

Re: 場違いかもしれませんけど
TRさん,猛牛ロックさん,こんばんは。

浄土ヶ浜いいですねえ。私も昔,職場の旅行で行った記憶あります。


ところで,原因判明,などど,大げさにスレをたてて,
PICKIT4まで購入してしまいましたが,

原因は,USBポートの電力不足でした。

お恥ずかしい限りです。

USBの電源を計ったところ,外部電源をつながないと,
4.61Vかでていませんでした。

これで,PICKITから電源を供給すると,
電圧不足と怒られました。

WINDOWS10でも動作しました。

   PICKIT3→USBボートに電源供給が必要
   PICKIT4→そのまま可能

の結果でした。

PICKIT4は,低い電圧でもOKで,PICKIT4からの電源供給で,プログラムが動きました。
mabo   2018/10/26(Fri) 20:37 !email! No.1147 !ico_edit!
Re: 場違いかもしれませんけど
あれ?MABOさんの方も調子が悪かったんですか。

安定して書き込みしてくれないと困りますね。

AVRの方(USBASP)も書き込み失敗はちょいちょいあります。
こちらの方は書き込み時に進捗バーが進んでいくのですけど、
その途中で、「ピーン」という音と共に途中で終わります。
なので、書き込み時は音が出ないように祈っています。

でも、音が出て弾かれても、続けてすぐに[WRITE BOTH]ボタンを押すと
今度は大丈夫だったりします。
ちょいちょい失敗するのは半ば仕様だと思って使っています。
猛牛ロック   2018/10/27(Sat) 12:37 !email! No.1148 !ico_edit!
マルチボード 例題1 投稿者:猛牛ロック 投稿日:2018/10/25(Thu) 22:52 No.1137

マルチボート編を始めますけど、その前に、以前話したように、ビニールテープ等で
絶縁をちゃんとしてからにして下さい。

これからは、例題→回答→解説という感じで進めたいと思います。
勿論、基本的な事から始めますから、判らない箇所は聞いてください。

最初の数回はLEDチカです。ちょっとしょぼいですけど、右側にある4つのLEDです。

回路図は添付図のようになっています。つまり、GPIOをLレベルにすると光ります。
510Ωが付いているようなので、おおよそ、6mA程度流れるようです。
何故か、並び(D1〜D4)もピン番号と逆並びになっていますね。

では最初の例題です。


<例題1>
4つのLEDを全点灯させる
(つまり、対応ピンをLOW出力にする)

<回答>
//@ATMEL STUDIO用(AVR流)
#include <avr/io.h>
void main(void){
DDRB=0b00111100;
while(1);
}


//AArduino IDE用(AVR流)
void setup() {
DDRB=0b00111100;
}
void loop() {
}


//BArduino IDE用(Arduino流)
void setup() {
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
}
void loop() {
}

//CArduino流模範解答?
const byte D[4]={13,12,11,10};
void setup(){
for(byte i=0;i<4;i++) pinMode(D[i],OUTPUT);
}

void loop(){
}


解説
@
ATMEL STUDIO(PICのMPLABに相当)での記述法です。
まず、わずかな行数しか書いていない事に注目してください。これが初心者にAVRを薦める理由のひとつです。
よくわからない設定部(config等)がほとんどありません。と言っても他のものを体験しないと良さも判らないかも知れないですけど。
#include <avr/io.h>は、このコンパイラ=ATMEL STUDIOを使うときは必ず付けなければいけません。
ここにデバイス=ATMEGA328Pのピン情報とかが入っていて(リンクされていて)必ず利用するものです。
void main(void){は、始まる関数です。どこに書かれていても、プログラムの最初はメイン関数から始まります。
voidとは値が無い、と言う事です。最初のvoidで、メイン関数からの戻り値が無い、後のvoidはメイン関数内で使う引数が無い、
という意味です。
そして、DDRB=0b00111100;です。実質この1行だけが本文です。勿論、、DDRB=0x3C;でも良いです。
DDRBとは入出力レジスタです。最後のBはポートBを指しています。「=」は左辺に右辺を代入するという演算子です。
0b00111100は頭の0bで2進数の事を意味します。2進数を使ったのは10進数よりもピンの状態を表しやすいからです。
(とはいえ、0と1が多く並ぶので数え間違い、打ち間違いにもなりやすいです。)
一番下位の桁(最も右)の0がPB0の状態です。右から3つ目がPB2の状態で1、さらに4つ目、5つ目、6つ目も1です。
つまり、PB2〜PB5のDDRレジスタを1にしました。DDRレジスタは、1で出力、0で入力になります。
AVRでは殆どのレジスタの初期値は0でDDRも0です。つまり、DDRBが0b00000000だったものを0b00111100に変更したのです。
そして、ここには記述しなかったのですが、PORTレジスタというものがあります。これは出力時にはHレベルにするかLレベルにするかの
スイッチの役割があります。当然、出力の時はこのレジスタを操作するわけですが、今回の場合、初期値の0から何も変更しないので
記述する必要はありません。もし記述するなら、PORTB=0;もしくはPORTB=0b00000000;となります。
つまり、「全て入力」→「LEDの付いている4つのピンをL出力」という切り替えを行っています。

ここで、重要な事はHレベルがオンで、Lレベルがオフ、と言う事ではない、と言う事を理解して下さい。
Hレベルはマイコンの中を通り、VCC(マイコンの電源+側)と繋がる事で、LレベルはGND(マイコンの電源の-側)と繋がる事です。
つまり、上の図でいうとPB2〜PB5の下(先)でGNDと繋げた、と言う事で、アノード→カソードと電気が流れ、LEDは点灯します。

当然ながら、DDRB=0b100;とすれば対応するD4だけが光り、DDRB=0b101000;とすれば、対応するD1とD3が光ります。
このあたりは「数字の表記」の項を踏まえて、変更してみたください。

A
これがArduino IDEでの記述法です。既に裏で幾らかの事が書かれているので、
実質的に1行書くだけで終わります。内容は@と全く同じです。
今回、全ての回答に言えますけど、その1行は繰り返しの場所、つまり、loop関数の方に書いても結果は同じです。

B
こちらがArduino流の表記です。つまり、通常ポート操作は使いません。全てボード上に書いてあるピン番号で操作します。
対応するピンをそれぞれ出力に設定すれば、LOW出力です。

C
きちっと書くとこんな感じになります。回路図(ボード上のシルク)のD1〜D4がD[0]〜D[3]に相当します。
constは固定値の場合は付けたりします。付けた場合は、値を変えるとコンパイラに怒られます。
付けなくても結果は変わりません。
凝ったものになると、最初に接続ピンの記述をします。配列にしておくと、後で操作がしやすくなります。
つまり、setup関数でfor文で初期化出来たのは配列にしたからです。
※今回は同じポートの並びですけど、バラバラなピンでも、
D[4]={8,2,16,4};
みたいに、順番やポートの違いも無くなった記述(操作)が可能になります。

Re: マルチボード 例題1
//@ATMEL STUDIO用(AVR流)

この流儀が、今までのPIC学習と同じなので、
分かり易いと思います。

#include <avr/io.h>から始まるところとか。
TR   2018/10/26(Fri) 12:25 !email! No.1142 !ico_edit!
Re: マルチボード 例題1
ここではまだ、@の方が簡単かもしれませんね。
でもAもそれほど変わらないでしょ?

今回は必要なヘッダファイルが
#include <avr/io.h>
だけだったけど、delayをつかうなら
#include <util/delay.h>と#define F_CPU 16000000UL

RAMにロードさせないなら
#include <avr/pgmspace.h>

割り込みを使うなら
#include <avr/interrupt.h>

と必要な事前に必要な事項が増えていきます。
(これは本来、PICもAVRもArduinoも同じです)
だけども、Arduinoは既にある程度裏で走っているので、
もう書かれているのです。=ユーザが書く必要はありません。

けど、書いても問題ありませんよ。
猛牛ロック   2018/10/26(Fri) 13:42 !email! No.1145 !ico_edit!
マルチボード 例題2 投稿者:猛牛ロック 投稿日:2018/10/26(Fri) 13:31 No.1144

同じスレに書こうとも思ったのですけど、途切れる可能性があるので、
別スレにしました。

例題2. 4つのLEDを0.5Sごとに全点滅を繰り返すプログラム

<回答>
//@ATMEL STUDIO用(AVR流)
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
void main(void){
while(1){
DDRB=0b00111100;
_delay_ms(500);
DDRB=0;
_delay_ms(500);
}
}


//AArduino IDE用(Arduino流)
void setup() {
}
void loop() {
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
delay(500);
pinMode(13, INPUT);
pinMode(12, INPUT);
pinMode(11, INPUT);
pinMode(10, INPUT);
delay(500);
}


//BArduino流(スタンダード)
const byte led[4]={13,12,11,10};
void setup(){
for(byte i=0;i<4;i++){
digitalWrite(led[i],HIGH);
pinMode(led[i],OUTPUT);
}
}

void loop(){
for(byte i=0;i<4;i++)digitalWrite(led[i],LOW);
delay(500);
for(byte i=0;i<4;i++)digitalWrite(led[i],HIGH);
delay(500);
}


//CArduino IDE用(AVR流)
void setup() {
PORTB=0b00111100;
DDRB=0b00111100;
}
void loop() {
PORTB=0;
delay(500);
PORTB=0b00111100;
delay(500);
}


//DArduino IDE用(AVR流 マスク処理)
void setup() {
PORTB=0b00111100;
DDRB=0b00111100;
}
void loop() {
PORTB&=~0b111100;
delay(500);
PORTB|=0b111100;
delay(500);
}


//EArduino IDE用(AVR流 「^」演算子)
void setup() {
}
void loop() {
DDRB^=0x3C;//0b00111100
delay(500);
}


//FArduino IDE用(AVR流 PINレジスタ操作)
void setup() {
DDRB=0b00111100;
}
void loop() {
PINB|=0x3C;
delay(500);
}




解説
出力のHとLで点滅させるのが普通ですが、入力と出力Lとの切り替えでも可能です。
この方法も立派な点滅の方法で、何ら問題ありません。
「#include <util/delay.h>」は_delay_ms関数を使う時には必要です。この関数はマイコンのクロックから、何もしない命令NOPを
何回繰り返せばいいか計算して、コンパイル時に書き込みます。なのでこのマイコンの駆動クロックが無いと計算できません。
それ故に、「#define F_CPU 16000000UL」と使用周波数を書かなければいけません。
一方、Arduino流にも、同じようなdelay関数が使われています。しかし、周波数は書いていません。
これはUnoは16Mhz動作と決められているので、既に裏で登録されているからです。
#include <util/delay.h>もまた、既にリンクされているので記述する必要はありません。

_delay_ms系の関数の注意点としては変数をカッコ内に入れないことです。実数を入れてください。
変数で処理したい場合も_delay_ms(10)をn回繰り返す、というような記述にします。
delay関数は、Arduinoの関数で、こちらの場合は変数でも構いません。(多分)

Arduinoは基本的にあまりポート操作はしないようです。(勿論できますよ!)なので緑字はピン1本ずつ操作しました。
PICやArduinoは1ピン毎の操作がライブラリで用意されています。なので、比較的、このような記述が多いです。
けれども、1ピンずつ4回操作すると言う事はその回数分時間を消費します。8ビットマイコンはポート毎に8ビットアクセスして
読み書きします。なので、この4回は全て、同じ変数(レジスタ)を読み込み、計算して、書き戻す、と言う事を繰り返しています。
この程度なら爪の垢ほども問題ないですが、繰り返しが多いものなどはやはりポート操作にした方が良いです。
勿論、PICやArduinoもポート操作は当たり前に出来ます。

思いつくままに幾つもかきましたけど、どれも条件を満たした動作をします。
※点滅の開始がどちらから、までは気にしないで書きました。

@
ATMEL STUDIO用です。入力⇔LOW出力の切り替えです。

A
同じ事をArduino IDEで行った例。初心者用スケッチ。

B
setup関数でHIGH出力(消灯)した上で、loop関数でHIGH出力⇔LOW出力の切り替え。
これが普通の処理です。
書き方としては最もArduino的な回答です。

C
Bをポート操作したものです。ただし、これにはちょっとした落とし穴もあります。(Dで説明します)
Bと比べてより少なく表記出来ます。見た目でもすぐに判ります。
Arduinoではポート操作はあまり見かけませんけど、必要に応じて使った方が良いです。
表記以外にも、実行速度は全く違います。

D
Cでも、今回の場合は結果は同じです。けれども、例えばPB0やPB1を入出力に使っていた場合、
PORTB=0;のように書くと、そのピンの状態も変更されてしまいます。
そういった事を防ぐ為にマスク処理をします。

PORTB&=~0b111100;は、PORTB=PORTB&~0b111100; → PORTB=PORTB&0b11000011;と同じ意味です。
「&」の処理は1だともう一方の値になります。片側0だと0になります。つまり、&0b11000011の「0」の場所だけ0に変えます。
同じ様に、PORTB|=0b111100;はPORTB=PORTB|0b111100;のことですけど、こちらは「1」の場所を1」に変えます。
0の場所はそのままです。

E
一番短く書くとこんな感じになります。
「^」演算子はトグル動作の際に有効です。1を書くとトグル動作、0なら何もしません。なので、既にマスク処理もされています。


F
マニアックな方法です。
実はREAD(入力)の時に使うPINレジスタには、出力設定の時に「1を書き込むとトグル動作(出力)をさせる」という隠れ機能があります。
その機能をつかって、LEDピンに1を書き込んでいます。
実際にはまず見かけないし使いません。

No1100について 投稿者:TR 投稿日:2018/10/25(Thu) 21:37 No.1134

猛牛ロックさん

No1100について

>書き込み後に、ウィンドウ右上にある、虫眼鏡みたいなアイコン=シリアルモニタを
開いてください。sabab・・・と、表示されます。
このように、適当な場所で、文字や数値をPCに送って表示させることで実際に動いている
順番を確認することが出来ます。


シリアルモニタをクリックした直後の状態を写真で送りました。
sabab この表示が見えませんが。
その他の説明として、実際に動いている順番を確認できるとありますが、
添付の写真では、動いている順番とかが不明ですが。

Re: No1100について
Arduino来ましたか。
順調に書き込み出来ているようですね。
それじゃあそっちの方もちょっと進めておきます。

で、今回の質問ですが、それはスケッチが違うからです。
TRさんのスケッチでは
Serial.print('s');
がsetup関数で書かれています。
なので、そこを通過すると、シリアルモニタに「s」が表示されます。
つまり正しく動作しています。
つまり、そこを通過した証拠として、文字や或かカウントしている数字等を
表示させます。

なぜ、「sabab…」とならなかったかは、私のスケッチと見比べてください。
猛牛ロック   2018/10/25(Thu) 22:15 !email! No.1135 !ico_edit!
Re: No1100について
Serial.begin(9600);
とボーレートを指定するだけで、シリアル通信の準備が出来ます。
逆に言えば、D0,D1ピンはシリアル通信の為のピンになりますから、GPIOとしては使えません。
※書き込みにも使うピンなので、なるべく最後まで使わない方が良いです。→D0,D1ピン

送信するにはSerial.print関数を取りあえず覚えてください。
兄弟分のSerial.println関数も同時に覚えてください。「ln」が付くと、改行ありです。

使い方は
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=3319
を参考にして下さい。
猛牛ロック   2018/10/25(Thu) 22:28 !email! No.1136 !ico_edit!
Re: No1100について
猛牛ロックさんおはようございます。

No1100、分かりました。
写真の様になりました。
以下のように、コピペしなかったからです。

   記
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
Serial.print('s');

}

void loop() {
digitalWrite(LED_BUILTIN, HIGH);
Serial.print('a');
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
Serial.print('b');
delay(1000);
}

つまり、
void setup でSerial.print('s') まで一度走ります。

次に
void loop()で ,次の{}内を繰り返すので、LEDちかちかとa,delay1000 ウエイト
そして、LEDちかちかとbを繰り返すので
写真の様に文字を表示するわけですね。

   記
{
digitalWrite・・・・
}
TR   2018/10/26(Fri) 07:55 !email! No.1138 !ico_edit!
Re: No1100について
digitalWriteはデジタル出力ピンの出力(H/L)命令です。
digitalWrite(<ピン番号>,<HIGH(1)/LOW(0)>);
で、出力ピンをHIGHかLOWにします。「1」「0」の指定でも良いです。

pinModeは入出力設定です。
pinMode(<ピン番号>,<INPUT(0)/OUTPUT(1)/INPUT_PULLUP(2)>);
で、そのピンをプルアップ無し入力、出力、内蔵プルアップ入力のいずれかに設定します。
数字で指定する事も可能です。

で、今回言いたかったのは、そのように(本来意味の無い)Serial.printを配置したのは
プログラムがどう進んでいるのかを見る為です。
つまり、「sababab…」となっているという事は
一番最初にsetup関数が一度行われて、次に、loop関数が繰り返し行われている、という事を読みだしたわけです。

勿論、今回は何の疑問もあるわけでは無いので、やっても無駄ですけど、if文やwhile文が複雑になっていくと
思った通りに動かない事も多々あります。
そういった時に、適当な場所に、Serial.printを配置して、どの順番で動作しているのか、或いはプログラムがどこで止まっているのかを
シリアルモニタで表示させてバグを見つけます。
猛牛ロック   2018/10/26(Fri) 09:27 !email! No.1139 !ico_edit!
Re: No1100について
猛牛ロックさん,

>そういった時に、適当な場所に、Serial.printを配置して、どの順番で動作しているのか、或いはプログラムがどこで止まっているのかを
シリアルモニタで表示させてバグを見つけます。


なるほど〜。分かりました。


※ 前段
以前教わった事で、
a=10;
がありました。
意味は、10をaに代入するでした。


で、
PICの出力端子がプルアップの場合で、
LEDの点灯させようとする場合、次のようにしますよね。
   記
RB0=0


数値を文字に代入させる事と、RB0=0の意味は少し違いますよね?

RB0の端子をローにせよ  という意味になりますか?
それとも、0をRB0端子に代入せよでしょうか?
なんかつまらない質問ですみません。
最近、分かってきたからかもしれません。


※ 後段
それと、
入力端子とは、
電位が、ハイとかローとかを認識すること。

出力端子は、PICのVinから供給されている電圧により出力端子へ流せば、ハイ。 流さなければ、ローに出来る。
若しくは、PIC外部からの電源を利用して出力端子をハイかローにすること、
ということかな??


追記
猛牛ロックさん,
No1140でお聞きした答えをno1137で述べていますね。
な〜んだ。


前文の答え

「=」は左辺に右辺を代入するという演算子です。




後段の答え

Hレベルはマイコンの中を通り、VCC(マイコンの電源+側)と繋がる事で、LレベルはGND(マイコンの電源の-側)と繋がる事です。
つまり、上の図でいうとPB2〜PB5の下(先)でGNDと繋げた、と言う事で、アノード→カソードと電気が流れ、LEDは点灯します。


PICでは、入出力端子の設定の際、TRISとしたことをDDR。
また、端子の電位をハイ、もしくはローに設定の際、PORTとしたのを、
AVRと言うんでしたっけ、AVRでも、PORT
TR   2018/10/26(Fri) 10:27 !email! No.1140 !ico_edit!
Re: No1100について
> RB0=0
> 数値を文字に代入させる事と、RB0=0の意味は少し違いますよね?

同じです。=は代入演算子です。「代入」ではなく、「書き込む」でも良いです。
で、RB0という変数が、PORTBの0番目のレジスタ、つまり、マイコン上の特定のアドレス相当するわけですが、
そこのビットに代入されます。代入されるというのはそこの値がLOWレベルになる、という事です。
そして、そのレジスタは実際のピン先の制御に直接関わっています。

つまり、違いは「そこ(RB0)はピン先と繋がっているレジスタ」、というだけで、使い方や意味は変わりません。
※特定のレジスタはREADだけしか出来なかったり、1を書き込む(代入する)と内容が0に初期化されるレジスタもあります。


入力端子(GPIO)に切り替えれば、通常はハイ・インピーダンス(HI-Z)です。
つまり、マイコンの外側の反応としては、マイコンと繋がっていないのと同じになります。
簡単に言えばマイコンが2択の電圧計になります。※電圧計で、回路の電流/電圧が変わったら困りますよね?
それに内部プルアップの状態が加わります。これはマイコンの内部ですけど、その電圧計よりも外側になります。


出力端子は通常はCMOSです。つまり、PICの中で、VDDかGNDかのどちらかに繋がったような状態です。
中に切り替えスイッチが入っているようなものです。。
ただし、PICだと、オープンドレインという、GNDに繋げるか、繋げないかの2択状態もあります。
その場合はHIGH出力は出来ません。
猛牛ロック   2018/10/26(Fri) 11:40 !email! No.1141 !ico_edit!
Re: No1100について
TRさん,猛牛ロックさん,こんにちは。

猛牛ロックさんの記事,読ませていただいています。

改めて,勉強になります。



オープンドレインは,二度ほどはまりました。

一度目は,目的の端子が,なかなか思い通りにならなくて,

原因も分からず,この端子は,使えないんだ。

もしかして故障かな,位の理解でした。

二度目は,PICの仕様書読んで,ネットであさって,

オープンドレインにたどり着きました。

本日,PICKIT4届きました。レポートは,後ほど。
mabo   2018/10/26(Fri) 12:27 !email! No.1143 !ico_edit!
原因判明です。 投稿者:mabo 投稿日:2018/10/24(Wed) 20:27 No.1123

TRさん,猛牛ロックさん,こんばんは。

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

不具合の原因がわかりましたので,スレ新しくします。



原因は,WINDOWS10のようです。

いろいろくぐってみると,関連の記事がいくつかありました。

もしやと思い,古い環境なのですが,

WINDOWS7で同じことをやると,

すんなり通りました。

WINDOWS10(64ビット)の環境は,

確かTRさんも一緒だったと思いますが・


WINDOES10での対処もありましたが,

レジストリーを書き換えるようです。

後でやってみたいと思います。

Re: 原因判明です。
追記です。


プロジェクトにプログラムファイルを追加するには,

よく分からないところあるのですが,

私は,添付の画像の,ように,

プログラムが保存される Source Filees を右クリック,

Add Existing Item

をクリックして,作成したファイルをえらべば大丈夫だと思います。



今まで私がやったことがあるのは,

同じような手順で,複数の Hedder File を読み込んだぐらいですかね。
mabo   2018/10/24(Wed) 21:20 !email! No.1124 !ico_edit!
Re: 原因判明です。
maboさん、続きをお願いします。

>プログラムが保存される Source Filees を右クリック,

Add Existing Item

をクリックして,作成したファイルをえらべば大丈夫だと思います。


選ぶファイルは、どれになりますか?


MPLABO IDE ソースファイルというのは、
コンパイルできるファイルが、main.cの一つで、
new fileで作ったファイルはプログラムの保存用に
使われるのでしょうか?
TR   2018/10/24(Wed) 21:54 !email! No.1125 !ico_edit!
Re: 原因判明です。
もしかして,TRさんの,手順違ってるかもしれません。

1109と1113の手順で,main.c ができますので,

この,main.c を編集すれば基本的に大丈夫です。


newfiles.c ができてしまうのは,

1109の画面で,

  C→C Source Files

選んでしまったからだと思います。

通常は,このC Source Files は使わなくで大丈夫だと思います。

リンカーファイルを作る時などに使うのかなと思います。

通常は,main.c のファイルがあれば大丈夫だと思います。


それと,main.cのある場所が違ってます。

 Linker Files

のホルダーに下に作ってありますので,

  main.c

を右クリックして,

 Remove From Project

をクリックして,一端,プロジェクトから削除してください。

そして,Source Files の下に, 1109 1113の手順で,

 main.c

を作ってください。

それから,main.c をクリックして,中身を編集してください。

 newfiles.c

のプログラムをコピペすればいいと思います。



すでにあるプログラムを main.c として取り込むことできるのかもしれませんが,

具体的な方法は,わかりませn。

既存のヘッダーファイルをプロジェクトに取り込む時に,

1124の方法でやりました。



>MPLABO IDE ソースファイルというのは、
>コンパイルできるファイルが、main.cの一つで、
>new fileで作ったファイルはプログラムの保存用に
>使われるのでしょうか?

よく分からないところですが,ソースファイルというのは,

 コンパイルするためのもとになるファイルだと思います。

 大きなプログラム(プロジェックト)になると

 main.c のプログラム他に複数のプログラム準備し,

 それぞれをコンパイルして,リンク(一つにする)するとい

 う作業をやります。

 newfiles.cですが,ソースファイルの一つで,

 保存用でないと思います。

 通常は,main.c があれば大丈夫で,newfiles.cは,

 作る必要がないと思います。
mabo   2018/10/24(Wed) 22:37 !email! No.1126 !ico_edit!
Re: 原因判明です。
maboさん、有難うございます。
写真のようになりました。
これで、OKですね?

それから、古いPIC3は壊れていました。
IPEの方でつながるか試しましたが、
繋がりませんでした。
amazomの評価にありましたが、やはり2年〜3年で壊れるかもしれません。
短命ですね。
TR   2018/10/24(Wed) 22:58 !email! No.1127 !ico_edit!
Re: 原因判明です。
TRさん,猛牛ロックさん,おはようございます。

1127で,プログラムにエラーがなければコンパイルできると思いますが,どうでしょう。

ところで,WINDOWS10での,PICKIT3の動作ですが,

32ビットだと,レジストリーの書き換えで大丈夫のようですが,私の64ビットの環境では,無理ぽいです。

デバイスマネージャーで,PICKIT3の動作みてみると,

添付のような動作になり,諸兄のHPのように,

https://neo-sahara.com/wp/2017/09/19/%E4%B8%8D%E8%AA%BF%E3%81%AEpickit3%E5%AF%BE%E7%AD%96%E3%81%A7%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA%E3%81%AE%E5%80%A4%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%A6%E9%9B%BB%E6%BA%90%E7%AE%A1/

デバイスが正確に構成されないようです。

PICKIT4が発売されているので,人柱になってみようかなと思います。
mabo   2018/10/25(Thu) 09:13 !email! No.1128 !ico_edit!
Re: 原因判明です。
> PICKIT4が発売されているので,人柱になってみようかなと思います。

チャレンジャーですね。私はどちらかというと枯れたものしか手を出しません。
ウィンドウズもまだ8.1なんですよね。10も触ったことはありますけど。

なので、このあたりの不具合はちょっと判りませんねぇ。

けど、PICに関しては、上級者にとっては有利になるけど、初心者にはあまり向いていないと感じます。
最近のものも、良いマイコンだとは思うのですけど、正常に動く段階まで来ても、「本当にこの設定でいいのか?」と
不安が付きまといます。

やはり、デフォルトで、GPIOを有効&周辺機能は無効にしてもらって、使う機能だけ、レジスタを有効にしたら動作してくれる、という感じじゃないと、
多機能になっても、より事前準備に時間がかかりますし、なかなかすべての機能を理解しきれません。
猛牛ロック   2018/10/25(Thu) 10:51 !email! No.1129 !ico_edit!
Re: 原因判明です。
maboさん、こんにちは。コンパイル成功、書き込みも出来ました。自分は、まだまだので、キットで遊ぼうの教科書を深読みします。 早く16F627Aを卒業したいです。PIC4 高価ですね。でも、maboさんなら、買う価値ありです。

猛牛ロックさんへ16F88のコンフィグは16F627Aと違いますね。設定の際、参考は、ないでしょうか?
TR   2018/10/25(Thu) 11:34 !email! No.1130 !ico_edit!
Re: 原因判明です。
一番基本的な情報は、そのマイコンのデータシートです。それがそのマイコンを扱う元です。
何処のレジスタを操作すると、どのようになるかが書かれています。

けれども、次にコンパイラの問題があります。つまり、同じことをするにも書式がコンパイラによって違います。
なので、コンパイラ=xc8のバージョン2.0の仕様も理解する必要があります。

で、結局の所、16F627Aや16F88とXC8の組み合わせの参考書や参考サイトを探す、若しくは自分でデータシートから考える、
という事になります。

※コンフィグ、つまり、ヒューズ設定は、PICだけじゃなく、全てのマイコンで、独自だと思ってください。
機種が違う=コンフィグも違います。

一応、Microchip(インストールフォルダ)\xc8\v1.35\docs\chipsに機種ごとのコンフィグの説明があります。
けれども、それを見ただけでは使えません。つまり、初期設定はプログラム本編にも及びます。
猛牛ロック   2018/10/25(Thu) 12:36 !email! No.1131 !ico_edit!
Re: 原因判明です。
猛牛ロックさん,TRさん,こんにちは。

>チャレンジャーですね。私はどちらかというと枯れたものしか手を出しません。
>ウィンドウズもまだ8.1なんですよね。10も触ったことはありますけど。

そうですね,基本私は,当たらし物好きなところがあるからかもしれません。

でも,PCに関しては,猛牛ロックさんと同じようなところもあります。

新しいOSは,周辺機器のドライバー等が安定するまで時間がかかるので,基本,古い物の方がいいですね。

いわずがな,MPLABも最新のものにしたら,手直しが必要でしたので,手間がかかりました。

私は,WindowsXPの後は,Windows7をしばらく使ってました。

なぜWindows10したかは忘れましたが,使いたいものがWindows10にしか対応していなかったからかなと思います。


TRさん,書き込み成功おめでとうございます。

よかったですね。


>自分は、まだまだので、キットで遊ぼうの教科書を深読みします。

これも,いいと思いますけど,なんか自作なさってもいいかと思います。

いろいろおもちゃの作成記事が下記にあります。

http://nonchansoft.my.coocan.jp/pic/index.htm
mabo   2018/10/25(Thu) 12:42 !email! No.1132 !ico_edit!
Re: 原因判明です。
こんばんは。
今日は仕事でした。
帰宅後、猛牛ロックさんの間欠プログラムを見ていました。

しかし、今回は、
自分のPIC3で書き込みが出来なくなったので、
PIC3が故障しているのか否かを判断する為に、MPLAB IDE V5.05をインストールした事から
苦闘が始まりました。 もう参りました。
挙句の果ては、IDEの古いバージョン(v3.26)がエラー表示「Limited code assistance( no associated project)」
が止まらなくなってしまい、不慣れなV5.05を使用せざるを得なくなりました。
しかも、IPEで元のPIC3が繋がり、amazom製のPIC3が繋がったので、
明らかに、元のPIC3が逝ってしまったことが確定!!
もう、踏んだり蹴ったり。

でもでも、考えようで、IPEの使い方も少しは分かったし、
PICにもコンフィグってあるんだとも認識しました。
しかも、キットで遊ぼうの教科書の内容も猛牛ロックさんの間欠プログラムを通じて
ある程度わかってきました。
そう思えば、発展してきている自分が見えます。
後は、間欠プログラムを反復学習します。

maboさん、ご紹介下さったURLにはびっくり。
ちょっと引いてしまいました。

それと、
中華製のarduinoが来たので、ちょっと気になってきました。
TR   2018/10/25(Thu) 20:36 !email! No.1133 !ico_edit!
今度は 投稿者:TR 投稿日:2018/10/24(Wed) 11:19 No.1114

色々と済みません。

コンパイルが出来たので、PICに書き込んだのですが、LED(RB0)が点滅しません。
キットで遊ぼうのボードが故障でしょうか?
ボードと書き込み成功の合成写真を送ります。

急ぎませんので、見て頂けませんか?

尚、
若しPIC 16F627Aが故障の場合、手持ちの16F627Aがありませんので、
16F88に書き込んでみようかと思います。
その場合、IDEのセット方法ですが、
projectを新しく作り、
その際、デバイスを16F88にする。
そして、新しいプロジェクトに新しいファイルを作り
その新しいファイルにNo1106のファイルの一部を修正し貼りつければいいのでしょうか?

修正後のファイルは 下を貼り付け、コンパイルする予定

#include <xc.h>

int main( ) {
// カウンタ値用変数
int cnt;

// 1,2,17,18端子を入出力端子に設定
CMCON = 0x07;

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

// 入出力設定
TRISA = 0x20;
TRISB = 0x00;

// 永久ループ
while(1){
// LED1点灯
RB0 = 0;

// 10000回繰り返し
cnt = 10000;

while(cnt > 0)
cnt--;

// LED1消灯
RB0 = 1;

// 10000回繰り返し
cnt = 10000;

while(cnt > 0)
cnt--;
}
}

Re: 今度は
何かおかしいです。
PICに書き込もうとしたら、赤矢印の表示が出ました。
やはり16F627Aが故障なのでしょうか?
TR   2018/10/24(Wed) 11:38 !email! No.1115 !ico_edit!
Re: 今度は
TRさん,,書き込みありがとうございます。

PIC3やらキットの基盤やら,

しまい込んでしまっていて,すぐには確認ないので,ちょっと,

お待ちください。


それから,PICを 16F88に交換すると,

前の手順で,

CONFIG

の設定を新たに作成した方がいいと思います。

同じかどうかわかりませんが,

細かい設定がちがっているかもしれません。



TRさんがアップしてくださったオリジナルのプログラム,

細かくみていないのですが,

もしかして,訂正が必要かも。


コンパイルできることと,正常に動くことは,

ちょっと違う次元だと思います。


基盤やPICの故障よりは,

  第1 細かい設定の間違い

  第2 プログラムの間違い

の方が多いような気がします。
mabo   2018/10/24(Wed) 12:54 !email! No.1116 !ico_edit!
Re: 今度は
不具合の原因は判りませんけど、テキストに載っている、

__CONFIG ( UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO );

に相当するものは

#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = ON
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config CP = OFF

です。こっちにした方が良いです。
※627Aです。88では違いますから。88を使う場合はちゃんとデータシートを見て決める必要があります。
ヒューズの構成が違いますから、627Aには無いものもあると思います。
プログラムも、通常、周波数の設定とアナログ機能のOFF(つまりGPIOとして機能させる)という事をします。

不具合の方は、ちゃんとPROG⇔RUNスイッチの切り替えをやってるかな?という位しか思い浮かびません。
XC8のバージョンを2に上げたようですけど、その辺りも関係するのかもしれませんね。
猛牛ロック   2018/10/24(Wed) 13:22 !email! No.1117 !ico_edit!
Re: 今度は
16F88を使うなら、↓に続けて(或いは付け足して)プログラムを書いてください。
MCLRはリセットピン、残りはGPIO設定です。

#include <xc.h>

#pragma config WDTE=OFF,PWRTE=OFF,CP=OFF,BOREN=OFF,DEBUG=OFF
#pragma config LVP=OFF,MCLRE=ON,CPD=OFF,WRT=OFF,FOSC=INTOSCIO
#pragma config FCMEN=ON,IESO=OFF

#define _XTAL_FREQ 8000000 // delay用

void main(void){
OSCCON = 0b01110010; // 内蔵 8MHz
ANSEL=0; // 全アナログOFF
猛牛ロック   2018/10/24(Wed) 14:50 !email! No.1118 !ico_edit!
Re: 今度は
もうそろそろ、delay関数を利用した普通の書き方を使った方が良いです。
その方が簡単ですし、世間では標準的です。
内容はそのcntを利用した時間つぶしと変わりません。
けれども、駆動周波数を元にして、何サイクル時間を潰せばいいかコンパイラが算出して、実行してくれます。

delayを使えば、本来1秒の筈が…、という具合に動作クロックがおかしい時も気が付きます。

で、通常どんなマイコンも一番最初にLEDのBLINKのコードになります。

PIC16F627A用

#include <xc.h>

#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = ON
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config CP = OFF

#define _XTAL_FREQ 4000000 //delay用

void main(void) {
CMCON = 0x07;//コンパレータ不使用

PORTA = 0xFF;
PORTB = 0xFF;
TRISA = 0x20;
TRISB = 0x00;

while(1) {
RB0 = 0; //LED1点灯
__delay_ms(1000);
RB0 = 1; //LED1消灯
__delay_ms(1000);
}
}



PIC16F88用

#include <xc.h>

#pragma config WDTE=OFF,PWRTE=OFF,CP=OFF,BOREN=OFF,DEBUG=OFF
#pragma config LVP=OFF,MCLRE=ON,CPD=OFF,WRT=OFF,FOSC=INTOSCIO
#pragma config FCMEN=ON,IESO=OFF

#define _XTAL_FREQ 8000000 // delay用

void main(void) {
OSCCON = 0b01110010; // 内蔵 8MHz
ANSEL = 0; // 全アナログOFF

PORTA = 0xFF;
PORTB = 0xFF;
TRISA = 0x20;
TRISB = 0x00;

while (1) {
RB0 = 0; //LED1点灯
__delay_ms(1000);
RB0 = 1; //LED1消灯
__delay_ms(1000);
}
}
猛牛ロック   2018/10/24(Wed) 16:46 !email! No.1119 !ico_edit!
Re: 今度は
復活しましたか。それは良かった。(^^)/

間欠の方ですけど、回路はその通りに組みましたか?
つまり、RA6はプルダウン入力です。キットの方はどのようになっているのかは判りませんけど、合わせる必要があります。
また、出力の方はHIGH駆動です。LEDはLOW駆動のようでしたよね?
そして、MODEピン?の方も、OFF/ON/間欠見たいになっていたと思います。その辺りも確認していますか?
それらが絡み合いますから、信号のH/Lを注意してください。
猛牛ロック   2018/10/24(Wed) 18:03 !email! No.1121 !ico_edit!
Re: 今度は
maboさん、一つのプロジェクトの中に、新しいファイルを追加する方法を教えて下さい。



猛牛ロックさん済みません。
No1120は削除しました。
問題は、猛ぐうロックさんのプログラムではないかも、かもです。

経過
猛牛ロックさんのプログラムを書き込むために新しくファイルを作りました。

そのファイルの作り方がおかしいのかもしれません。
というのも、 また次のエラーが出たのです。

エラー表示
Limited code assistance( no associated project)

写真の奴です。
TR   2018/10/24(Wed) 18:40 !email! No.1122 !ico_edit!
新しいPIC3でも 投稿者:TR 投稿日:2018/10/23(Tue) 07:20 No.1101

新しいPIC3が来たので、早速コンパイルしましたが、
やはり 、エラーが出ます。
MPRABから、再度インストール(IDEをダウンロード)
しても同じでした。
対処方法が分かりましたら、ご教授願います。

BUILD FAILED (exit value 2, total time: 6s)

Re: 新しいPIC3でも
猛牛ロックさん,TRさん,こんにちは。

書き込みありがとうございます。

猛牛ロックさん,沢山の資料ありがとうございます。

AVRいじるとき役に立つと思います。


>新しいPIC3が来たので、早速コンパイルしましたが、
>やはり 、エラーが出ます。

新しいMPLABだと,今まで通っていたソースで,

エラーがでるようです。

https://neo-sahara.com/wp/2018/08/25/mplab-xc8-compiler-v2-00-%E3%81%A8-mplab-code-configurator-v3-65-%E3%81%A7%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E5%87%A6%E7%90%86%E3%81%AB%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%82%A8%E3%83%A9/

http://tomio2480.hatenablog.com/entry/notfound_xch

あたり見てください。


PIC3の書き込み等ができないのは,

確かOMPLABのPIC3のOPTIONの電源関係の設定いじったような,

記憶があります。
mabo   2018/10/23(Tue) 15:56 !email! No.1102 !ico_edit!
Re: 新しいPIC3でも
maboさんレス有難うございます。

エラーですが、maboさんのお話とはてょっと違うのです。
勿論、IDXは、最新にしてあります。

エラー表示の写真です。
英文字の意味をグーグルで翻訳すると  ↓
The project"main" is empty.
You will need to add a file to the project before you can build it.
プロジェクト "main"は空です。 作成する前にプロジェクトにファイルを追加する必要があります。


X production.hex does npt exist or is not an executable.

X production.hexは存在しないか、実行可能ではありません。

翻訳で言っている事は分かるようになりましたが、
どうしたら良いのか分かりません。


追記
下のページをやってみましたが、やはり駄目でした。
http://tomio2480.hatenablog.com/entry/notfound_xch

エラー表示
BUILD FAILED (exit value 2, total time: 1s)
TR   2018/10/23(Tue) 21:16 !email! No.1103 !ico_edit!
Re: 新しいPIC3でも
TRさん,こんばんは。

見当違いのレスすみません。

もしよかったら,プログラムをコピペしてみてください。

私の環境で,コンパイルしてみます。
mabo   2018/10/23(Tue) 21:41 !email! No.1104 !ico_edit!
Re: 新しいPIC3でも
コンパイルしようとしているのは、教科書にあるものです。


/*****************************
STEP07_Successful.c
*****************************/

#define _LEGACY_HEADERS

// インクルードファイルの読み込み
#include <pic.h>

// コンフィギュレーションワードの設定
__CONFIG ( UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO );

// メイン関数
void main (void)
{
// カウンタ値用変数
int cnt;

// 1,2,17,18端子を入出力端子に設定
CMCON = 0x07;

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

// 入出力設定
TRISA = 0x20;
TRISB = 0x00;

// 永久ループ
while(1)
{
// LED1点灯
RB0 = 0;

// 10000回繰り返し
cnt = 10000;
while(cnt > 0)
cnt--;

// LED1消灯
RB0 = 1;

// 10000回繰り返し
cnt = 10000;
while(cnt > 0)
cnt--;
}
}
TR   2018/10/23(Tue) 21:51 !email! No.1105 !ico_edit!
Re: 新しいPIC3でも
TRさん,書き込みありがとうございます。

原因は,CONFIGファイルが古いままなので,

このままでは,だめです。

以下の部分をカットして,

#define _LEGACY_HEADERS

// インクルードファイルの読み込み
#include <pic.h>

// コンフィギュレーションワードの設定
__CONFIG ( UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO );



MPLABの,

  Production
   ↓
  Set Configration Bits

をクリックすると,添付のような画面が右下にでます。

この画面の下の

  Generate Source Code to Output

をクリックすると,

  Output

のタブで開く画面にConfigファイルが作成されてますので,

これをコピーして,先ほど削除した一番上に,貼り付けてください。

これで大丈夫だと思います。

細かい設定も必要になるかと思いますが,

自動生成される,Config Faile で取り合えず,大丈夫だと思います。

以下

修正したソースです。

/*
* File: main.c
* Author: mabo-2016
*
* Created on 2018/10/23, 22:48
*/


// PIC16F627A Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config FOSC = INTOSC // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is MCLR)
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = ON // Low-Voltage Programming Enable bit (RB4/PGM pin has PGM function, low-voltage programming enabled)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

#include <xc.h>

int main( ) {
// カウンタ値用変数
int cnt;

// 1,2,17,18端子を入出力端子に設定
CMCON = 0x07;

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

// 入出力設定
TRISA = 0x20;
TRISB = 0x00;

// 永久ループ
while(1){
// LED1点灯
RB0 = 0;

// 10000回繰り返し
cnt = 10000;

while(cnt > 0)
cnt--;

// LED1消灯
RB0 = 1;

// 10000回繰り返し
cnt = 10000;

while(cnt > 0)
cnt--;
}
}
mabo   2018/10/23(Tue) 23:15 !email! No.1106 !ico_edit!
Re: 新しいPIC3でも
追記です。

一カ所だけ,変更する必要がありました。

前掲の添付ファイルの,FOSCの脇の項目右を項目をクリックすると

いくつか選択の項目がでてきますので,そのかかから,

INTSOC

を選択しとかないとだめでした。

これをしておかないと動かないかな。
mabo   2018/10/24(Wed) 00:02 !email! No.1107 !ico_edit!
Re: 新しいPIC3でも
早速maboさんから頂いたプログラムでコンパイルしました。
追記部分も 写真の様に修正しましたが、
相変わらず、
The project"main" is empty.
You will need to add a file to the project before you can build it.

X production.hex does npt exist or is not an executable.
TR   2018/10/24(Wed) 06:42 !email! No.1108 !ico_edit!
Re: 新しいPIC3でも
TRさん,おはようございます。

多分,MPLABに,main が含まれているファイルが認識されて

ないからだと思います。

次のようにしてみてください。

file

 New File

添付の画面がでてくると思いますので,

左がわの

 C

選択して,右欄の

 C Main File

を選択する。

(画像が一枚しか添付できないので次ぎをみてください。)
mabo   2018/10/24(Wed) 07:55 !email! No.1109 !ico_edit!
Re: 新しいPIC3でも
気付きがあったので続けて失礼します。

おかしいと思うのは、写真の赤矢印の表示です。
Limited code assistance( no associated project)

どうも、プロジェクトが作られていないような?
TR   2018/10/24(Wed) 07:57 !email! No.1110 !ico_edit!
Re: 新しいPIC3でも
続きです。

前の添付ファイルの下の

 Next

で,添付の画面になりますので,

一番上にFile名がでてます。

多分  main になると思います。

このできたファイルの中身を削除して,

下記のファイルコピペして,

コンパイルしてみてください。


ちなみに,私は,main の含まれているファイルは,

いつも

  main.c

にしてます。

コンパイルできたファイル添付します。

/*
* File: main.c
* Author: mabo-2016
*
* Created on 2018/10/23, 22:48
*/


// PIC16F627A Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is MCLR)
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = ON // Low-Voltage Programming Enable bit (RB4/PGM pin has PGM function, low-voltage programming enabled)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>




int main( ) {
// カウンタ値用変数
int cnt;

// 1,2,17,18端子を入出力端子に設定
CMCON = 0x07;

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

// 入出力設定
TRISA = 0x20;
TRISB = 0x00;

// 永久ループ
while(1){
// LED1点灯
RB0 = 0;

// 10000回繰り返し
cnt = 10000;

while(cnt > 0)
cnt--;

// LED1消灯
RB0 = 1;

// 10000回繰り返し
cnt = 10000;

while(cnt > 0)
cnt--;
}
}
mabo   2018/10/24(Wed) 08:02 !email! No.1111 !ico_edit!
Re: 新しいPIC3でも
maboさん、やった〜!
コンパイル成功です。

しかし、今回は、どうしてこのようなエラーになってしまったのでしょうか??


追記
コンフィグが変わったのでしょうか?
TR   2018/10/24(Wed) 08:27 !email! No.1112 !ico_edit!
Re: 新しいPIC3でも
TRさん,成功,おめでとうございます。

多分,MPLABの仕様が変更になってるからだと思います。

自動で,CONFIGが作成できますので,

便利にはなりましたが,

ヴァージョンアップのたびに,

仕様が変わるのは,ちょっと,ですねえ。
mabo   2018/10/24(Wed) 09:21 !email! No.1113 !ico_edit!
Page: | 1 | 2 | 3 | 4 | 5 | 6 | 7 |

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