過去ログ [ 0002 ]
過去ログ:
ワード検索: 条件: 表示:
Page: | 1 | 2 | 3 | 4 | 5 | 6 |
マルチボード 例題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!
Arduino Multi-function Shield 投稿者:猛牛ロック 投稿日:2018/10/14(Sun) 14:20 No.1082

Arduino Multi-function Shieldについての注意点です。
内容はおいおい書いていきますけど、使用上の注意点がありますので、
商品到着前?に書いておきます。

この商品は、Arduino Leonardoを元に開発されています。
※殆どのモジュールのベースモデルはUNOです。ですがこれは違います。

で、添付図を見てもらうと、モジュールを嵌めた際に、UNOのUSB口がモジュールの
7セグ部の半田部に干渉します。USB口が金属なので、当たるとショートしてしまいます。
なので、そのどちらか、或は両方にビニールテープ等で絶縁処理をしておいてください。
※Leonardoの場合は、ミニB端子なので、干渉しません。

また、それに伴うものですけど、基板上のシルクが「〜13」となっています。
「〜」印は「PWM=アナログ出力可能なピン」という意味合いですけど、
UNOの場合は、13番はPWM出力出来ません。(UNOボードのほうは正しく「13」です)

それと、回路に関してですけど、LED、ブザー、スイッチは全てアクディブローです。
なので、ロー出力で初期化すると、ブザーが鳴り続けることになるので注意して下さい。

Re: Arduino Multi-function Shield
回路図です。

あと、主要なリンクを書いておきます。

ARDUINO本家 IDEダウンロード
https://www.arduino.cc/en/Main/Software
 ↓
「Windows Installer, for Windows XP and up」
 ↓
「JUST DOWNLOAD」

USBドライバ(CH340ドライバ(メーカーサイト)。必要な場合)
http://www.wch.cn/download/CH341SER_EXE.html
 ↓
下載

Arduino日本語リファレンス
http://www.musashinodenpa.com/arduino/ref/
http://garretlab.web.fc2.com/arduino_reference/index.html


AVRマイコン日本語データシート
https://avr.jp/
 ↓
「データシート」
 ↓
「mega328P.pdf」


AVRWiki
http://avrwiki.osdn.jp/cgi-bin/wiki.cgi?page=AVRWiki



Arduino Multi-function Shield系リンク

Using an Arduino Multi-function Shield
https://www.mpja.com/download/hackatronics-arduino-multi-function-shield.pdf

ライブラリサイトの1つ
http://www.cohesivecomputing.co.uk/hackatronics/arduino-multi-function-shield/
猛牛ロック   2018/10/14(Sun) 16:12 !email! No.1083 !ico_edit!
Re: Arduino Multi-function Shield
猛牛ロックさん今晩は。
荷の到着はまだ大分時間が掛かりそうです。

2枚のボードですが、写真の様に重ねるのですか?
2枚のボードは、ピンを差し込んで固定するのでしょうか・
そんな感じに見えますが、如何でしょうか?

なお、Arduino IDEは、PCにダウンロードは済ませました。
TR   2018/10/14(Sun) 20:36 !email! No.1084 !ico_edit!
Re: Arduino Multi-function Shield
多分、今週中は来ないでしょうね。
大体忘れたころに届きます。

TRさんの画像で手前のピンヘッダが緩んでいますよね?それをもっと差し込むと
USB口にぶつかってしまいます。(>_<)
これはUNO純正品でも同じです。

どうやらこれはホビー用というよりも、(中国の)学生の教材として開発されたようです。
アクディブブザーでは無く、パッシブブザー
多回転の半固定抵抗では無く、回しやすいつまみの普通のタイプ
だと良かったのですけど。
(値段的には後者も同等以下になると思うのですけど)

そうすれば、メロディーも作れて面白かったんですけどね。
猛牛ロック   2018/10/14(Sun) 21:21 !email! No.1085 !ico_edit!
Re: Arduino Multi-function Shield
自分が買った品は、
猛牛ロックさんお勧めのページから入り購入しました。
https://ja.aliexpress.com/item/Free-shipping-1pcs-Multifunctional-expansion-board-kit-based-learning-for-arduin-UNO-r3-LENARDO-mega-2560/32730415337.html
https://ja.aliexpress.com/item/1-uno-r3-mega328p-ch340g/32836264665.html

写真は、適当な物が無かったので、
単に、「ボードを重ねる」といった行為を
分かって貰うための写真です。
TR   2018/10/15(Mon) 06:50 !email! No.1086 !ico_edit!
PICとAVR
今週あたりに来そうなので、適当に進めておきます。

PICが8ビットのオシレータ無しの物から、32ビットの高性能なものまで、様々な品種があるのに対して、
AVRは8ビットのみで、どれも似通った性能です。
周辺機能も、PICは多種多様(貧弱なものから)で、AVRは変わったもの(というか、ベーシックなものしか)は付いていません。
簡単に言えば、AVRは汎用機、PICは専用機と言えると思います。
PICは、熟知した人が、用途に適した機種を選び、その機能を生かした作り方をする、という感じです。
AVRは、ピン数やメモリが足りていれば、どれも同じもので済ませちゃう感じですかね。
変えても、機能や使い方はそれほど変わりません。

また、AVRの場合は殆どのレジスタはデフォルトで0になっています。そして、周辺機能は無効状態です。
なので、GPIO操作をしたい場合はそのまま始められます。周辺機能は使いたい時に、使いたい周辺機能の
レジスタを操作すれば良いです。周辺機能のレジスタは大抵、その部門ごとにまとまっています。

CONFIG-ヒューズ

PICではヒューズ設定(CONFIG)もプログラムに記述して、書き込み時に同時に書き込まれます。
一方、AVRではヒューズは全く別に処理します。つまり、プログラムには記述しません。
通常、AVRの初期状態のヒューズの状態は、内部クロック最大の8分周有効の状態です。
なので、多くは、1MHzか1.2MHzになっています。

クロック、オシレータ

AVRには全て内蔵オシレータがあります。ただし、通常外付け可能な最大速度の半分程度の速度です。
なので、精度の要らない、また、高速処理の要らないものは内蔵オシレータを使う事になります。
PIC16等では、駆動周波数にたいして、駆動サイクルが1/4になっています。つまり、32Mhzで駆動させても、
命令のサイクルは8MHzになります。
一方、AVRはそのまま1命令サイクルになります。つまり8MHz駆動なら8MHzサイクル、8MIPSです。

ピン

VDD(PIC)とVCC(AVR)、VSS(PIC)とGND(AVR)に違いはありません。呼び方だけの違いです。
MCLRとRESETピンもほぼ同じですけど、MCLRピンはGPIOとして使う事も可能ですけど、RESETピンは
RESET専用と思ってください。それを変えてしまうと、専用の書き込み器が必要になります。
※つまり、高電圧の書き込み器がある場合や、2度と書き込みをしない場合はGPIOに変えるのも自由です。
GPIOは入力部はシュミットトリガ入力で、個別に内部プルアップを指定する事が可能です。
出力部はCMOS出力です。つまり、オープンドレイン出力端子はありません。また、入力専用という端子もありません。

出力特性

PICの通常ピンは内部抵抗が高い為、それほど多くの電流を流すことはありませんけど、AVRの場合はそれよりも特性が良い為に、
より多くの電流を流します。つまり、PICの場合、抵抗を付けずにLEDを駆動させることも可能ですけど、AVRは高い確率でLEDを壊します。
※PICの通常ピンはHIGH出力でGNDに繋いでも30mA程度しか流れません。AVRは70mA以上出て壊れる危険があります。

割り込み

PICでは割り込み要因は全てAND回路でまとめられた上で、GIE(PEIE)の状態で、割り込みがかかります。つまり、最終的に1つの場所に
飛び、自分で要因を判断して、フラグ処理します。
AVRでは、それぞれの割り込み要因とGIEの状態で判断され、それぞれの割り込み関数に飛びます。割り込み関数に飛んだ瞬間に
自動的にその割り込みフラグは解除され、全割り込み禁止(GIEが0)になります。そして、割り込み関数が終了して、割り込み元に戻る時に
自動で、GIEが1に戻ります。複数の割り込み要因が同時に起こっている場合は、割り込みベクタ番号の小さい方が優先されます。
猛牛ロック   2018/10/21(Sun) 11:24 !email! No.1097 !ico_edit!
AVRのGPIO操作
GPIO操作

・方向レジスタ(入出力切り替えレジスタ)
PICのTRISレジスタに相当するのがDDRレジスタです。
但し、PICでは、0で出力、1で入力ですけど、AVRでは0で入力、1で出力です。

・出力レジスタ(HIGH/LOW出力切り替え)
PICのLATレジスタ(場合によってはPORTレジスタ)に相当するものが、PORTレジスタです。
勿論、0がLOWレベル、1がHIGHレベルです。

・入力レジスタ(ピンのH/Lの状態を読み込み)
PICのPORTレジスタに相当するのが、PINレジスタです。0がLOW、1がHIGH

上記の3つのレジスタを操作するのですけど、更に内蔵プルアップも指定します。※AVRのピンは全て内部プルアップがあります。
出力設定=DDRレジスタを入力(0)にして、PORTレジスタを1にすると、内部プルアップが有効、0にすると無効です。

つまり、
DDRD=0b1100;
PORTD=0b1010;
と書くと、
PD0は内部プルアップ無し入力
PD1は内部プルアップ入力
PD2はLOW出力
PD3はHIGH出力
になります。※PICではピンをRD0と最初にRを付けますけど、AVRではPです。

それともう一点、これはハードでは無く、コンパイラの仕様の問題ですけど、
PICでは
RD2=1;
のように、ピンに直接数値を入れるような仕組みが用意されています。
一方、AVR(GCC)では、そのようなものは用意されていません。
なので、AVRのビット操作はビット演算子を用いて行うのが基本です。

但し、レジスタビット名にはそのレジスタのビット位置が付いています。
つまり、PB2もPC2もPD2も2と定義(define)されています。
これは、他のレジスタでも同様です。

そして、多くの場合は自分でマクロを書いて、使い易くします。

マクロ例1(レジスタ、変数共通)
#define bis(addr,bit) (1&(addr>>bit))
#define bic(addr,bit) (!(1&(addr>>bit)))
#define cbi(addr,bit) addr &= ~(1<<bit)
#define sbi(addr,bit) addr |= (1<<bit)

使用例
sbi(PORTD,5);//PD5を1(セット)にする
cbi(data,2); //変数dataの第2ビットを0(クリア)にする
if(bis(PINC,3)) //もしPC3が1(HIGHレベル)なら
if(bic(data,6))//もし、変数dataの第6ビットが0なら

マクロ例2(ピン操作のみ)

//メインマクロ
#define _SET(type,name,bit) type ## name |= (1<<bit)
#define _CLEAR(type,name,bit) type ## name &= ~ (1<<bit)
#define _TGL(type,name,bit) type ## name ^= (1<<bit)
#define _GET(type,name,bit) ((type ## name >> bit) & 1)
#define _PUT(type,name,bit,value) type ## name = ( type ## name & ( ~ (1<<bit)) ) | ( ( 1 & (unsigned char)value ) << bit )

//呼び出し関数マクロ
#define OUT(pin) _SET(DDR,pin)
#define IN(pin) _CLEAR(DDR,pin)
#define HIGH(pin) _SET(PORT,pin)
#define LOW(pin) _CLEAR(PORT,pin)
#define TGL(pin) _TGL(PORT,pin)
#define READ(pin) _GET(PIN,pin)


//引数マクロ例※この部分は書き換えて使う
#define LED B,5
#define clk D,0
#define dat D,1
#define cs D,2

使用例
HIGH(LED);//LEDのピン=PB5をHIGHにする。
TGL(LED);//LEDのピン=PB5をを反転させる。
OUT(clk);//clkピンを出力に設定
if(READ(cs))//もしcsピンが1(HIGH)なら
猛牛ロック   2018/10/21(Sun) 11:26 !email! No.1098 !ico_edit!
ArduinoとAVR
基本はAVR+GCCなので、素のAVRと全く同じわけなのですけど、実際にはそれに手が加わっているので、
だいぶ異なります。

まず、書き込み方法が、従来のSPIでは無く、シリアル通信による自己書き込みになります。
自己書き込みとは、ブートローダという領域で起動して、シリアル通信があるか待ちます。
あった場合はその内容をフラッシュに書き込みます。通信が無ければフラッシュから起動します。

で、書き込み方法は兎も角、それにより、標準でPCとシリアル通信が出来る状態にあります。
なので、変数の値やプログラムの場所をシリアル通信で送る事により、どのような経路でプログラムが走っているかを
簡単に知ることが出来ます(PCデバッグ)

そして、2つ目は、Arduinoといっても、主力はATMEGA328Pを使っているUNO、他が大多数です。
なので、サンプルは異常に多く見つかります。クロック周波数も同じなので、そのままで同じ動作です。

3つ目には、センサーや表示器などの対応したモジュールが多く、低価格で販売されています。
そのモジュールもやはり、UNOを対象として開発されているものが多数です。
そうなってくると、対応ライブラリも充実していて、多くのモジュールはそのライブラリがあります。
なので、そのモジュールを知らなくても、家電感覚で使いこなすことが出来ます。

話が戻りますけど、Arduino言語とはAVRと基本的に変わりません。けれども、仕掛けがしてあります。
本来、というか、別の場所に↓のようにメイン関数があります。
そして、ユーザにはsetup関数と、loop関数を書かせて、コンパイル時に合体させてコンパイルします。
ここでは単純にinit()となっていますけど、この中で、幾かの事をしています。
また、デフォルトで、幾つかのライブラリを取り込んでいます。
その一つがmillis関数に代表される、起動時からの累積時間の取得です。
つまり、タイマー0を利用して、タイマー0割り込みを使い(=割り込み有効になっている)、
起動からの時間を計測しています。
周波数の情報もまた、ボード情報として既に入っています。

int main(void)
{
init();
setup();
for (;;) {
loop();
}
return 0;
}

で、↑の内容から判るように、setup関数には最初に1度だけ行われる、という特性を持っています。
loop関数は永遠に繰り返されます。この2つの関数をユーザーは利用することになります。

まぁ、事前説明はこんなところで、後は、実際にプログラムを組みながら進めたいと思います。
猛牛ロック   2018/10/21(Sun) 11:28 !email! No.1099 !ico_edit!
Arduino 1st
もう既に、Arduino IDEはインストール済みのようですから、USBで、PCと繋いでください。
※まずは、マルチモジュールは使わずに、UNO単体です。

そして、「ツール」→「シリアルポート」を見ると、繋いだArduinoのポートが通常あります。
確認の為に一度USBケーブルを抜き、マウスのフォーカスを「ツール」から外して、もう一度
「シリアルポート」を見てください。
何も変化が無いのなら、ドライバのインストールが必要です。
前述のリンクから、ドライバをダウンロードして、入れてください。

で、シリアルポートをArduinoのポート(COM○)を選択して、その上にある「ボード:」から、
「Arduino/Geuino Uno」を選択します。

次に、サンプルスケッチを読み込みます。
「ファイル」→「スケッチ例」→「01.Basics」→「Blink」を開いてください。
(新規ファイル→下をコピペでも良いですけど)
色々書いてありますけど、コメントを外すと↓になります。

void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}

LED_BUILTINは、既に定義してあって、UNOの場合は13です。違うボードの場合でも、
そのボードに接続されているLEDの番号になるようにコンパイル時に処理されます。
で、上部の「⇒」アイコンをクリックしてコンパイル→書き込みをして下さい。
ウインドウ下に進捗が表示されます。
順調に点滅しましたか?というか、購入状態でも点滅プログラムが入っていたような・・・

で、つぎは4行デバッグの為のコードを追加します。

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

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

次が、Arduinoの特徴の1つである、millis(起動からの時間をミリ秒単位で返す関数)を使ったスケッチです。

void setup() {
Serial.begin(9600);
}

void loop() {
Serial.print(millis() / 60000);
Serial.print(':');
Serial.println(millis() % 60000 / 1000);

delay(1000);
}

1秒置きに取得しているので、分:秒の表示になります。

大よそ、以上の事はデフォルトで用意されているので、PICやAVR単体と比べて、
準備やプログラムの上で、圧倒的に時間的節約になります。
猛牛ロック   2018/10/21(Sun) 11:31 !email! No.1100 !ico_edit!
ひょっとして、誤植では 投稿者:TR 投稿日:2018/10/17(Wed) 07:23 No.1088

おはようございます。

PIC3の故障は治っていません。
昨晩も、
念の為に、MPLABの最新版IDEをインストールしたり、
逆に古いIDEをインストールしましたが、
エラーのままです。

でも、以前教わった間欠動作のプログラムの理解を進めています。

その中、ひょっとして、誤植ではと思える部分が有ります。
というのも、//以降のプログラムの説明が、
C言語と食い違いがあるのではと思われるからです。

以下にその内容を記載しますので、見て頂けませんか。
宜しくお願いします。

この部分です。
while(sec >0){
if((MODE!=(PORTA&0b11))||(MODE==3&&MACH_sig==0)||(PORTB_save!=PORTB)) return 1;
//セレクタスイッチが変更された場合とMACH制御でのオフ信号、間欠時間の変更があった場合はwhileから抜ける

正しくは、
while(sec >0){
if((MODE!=(PORTA&0b11))||(MODE==3&&MACH_sig==0)||(PORTB_save!=PORTB))
{ return 1;

If文の{ }が抜けていると思います。

如何でしょうか?

Re: ひょっとして、誤植では
いいえ、if文やwhile文などの対象はその次に書かれた命令(1つ)です。
{}はそれを広げる(複数の命令を対象にする)為にあります。1つならそのままで良いです。

なので、
while(1); //ここで停止させて、そのまま維持する。
のようなものも成り立ちます。
猛牛ロック   2018/10/17(Wed) 15:17 !email! No.1089 !ico_edit!
Re: ひょっとして、誤植では
>いいえ、if文やwhile文などの対象はその次に書かれた命令(1つ)です。

ということは、
//セレクタスイッチが変更された場合とMACH制御でのオフ信号、間欠時間の変更があった場合はwhileから抜ける
となっているので、
戻り値を1として、

change=Second(DousaTime); //動作時間分ウェイト
上記のchangeに1が戻ることになり、
すなわち、
DousaTimeが1ということですか?
TR   2018/10/17(Wed) 17:02 !email! No.1090 !ico_edit!
Re: ひょっとして、誤植では
<そういった異変があったら>戻り値を1として、関数Secondを終えます。whileを抜けるだけならbreak;です。
つまり、異常があったらすぐに動作を止める、という事です。

で、changeに1が代入されます。DousaTimeはここでは何もしていません。つまり、元々あった値のままです。
DousaTimeの値を変更するのは代入演算子(=,+=,/=,|=,等)があった場合です。
猛牛ロック   2018/10/17(Wed) 17:48 !email! No.1091 !ico_edit!
Re: ひょっとして、誤植では
>で、changeに1が代入されます。DousaTimeはここでは何もしていません。

関数というのは、
この場合で言うと、

changeに1が代入されるから、
change=Second(DousaTime); //動作時間分ウェイト
上記の式のchangeに返される、
つまり、
1=Second(DousaTime); //動作時間分ウェイト
Second(DousaTime)が1ということではないのですか?
TR   2018/10/17(Wed) 19:09 !email! No.1092 !ico_edit!
Re: ひょっとして、誤植では
「=」はプログラミングの世界では、一般の「イコール(等しい)」とは意味が違います。
「右辺(の計算結果)を左辺に代入する」です。なので、左辺はただ一つの変数で受ける形になります。
従来のイコール(等しい)は「==」です。

戻り値がある関数は変数に代入する形が主ですけど、変数に代入しなくても構いません。
猛牛ロック   2018/10/18(Thu) 00:57 !email! No.1093 !ico_edit!
Re: ひょっとして、誤植では
>戻り値がある関数は変数に代入する形が主ですけど、変数に代入しなくても構いません。

若し、変数に代入したとすれば、下記の事柄は成り立ちますか?

RA7=change   //changeに戻り値1が帰ったのを利用して、RA7をHiにする。
TR   2018/10/18(Thu) 06:56 !email! No.1094 !ico_edit!
Re: ひょっとして、誤植では
RA7の型によっては警告が出るかもしれませんけど、変数の型と戻り値の型があっていれば問題ありません。
(コンパイル時に何も言われなければ問題ないし、警告されても、必ず1か0しか戻さなければ問題無いと思います。)
猛牛ロック   2018/10/18(Thu) 10:42 !email! No.1095 !ico_edit!
Re: ひょっとして、誤植では
猛牛ロックさんへ
配列を使いSecond関数により時間制御に種類を持たせた内容ですね。
ようやく分かりました。
有り難うございます。
しかし、よく考えたと思います。
TR   2018/10/18(Thu) 12:49 !email! No.1096 !ico_edit!
No1053について 投稿者:TR 投稿日:2018/10/10(Wed) 14:32 No.1069


>}else if(cnt<255)cnt++;//前回と同じだったらカウントアップ

255というのは、タイマー0割り込みにでてくるTMROレジスタ
に出てきて、
タイマ0の場合、TMROレジスタにクロックが与えられると有ります。
でTMROでジスタは、8ビットレジスタので、0〜255の値を入れられるとある。
00000000=0
11111111=255

>}else if(cnt<255)cnt++;//前回と同じだったらカウントアップ
これは、タイマー0割り込みを使おうとしているのですか?

Re: No1053について
この前後の数行(7行)自体がタイマー割り込みでの(セレクタ)スイッチの読み取り方です。
if(cnt<255)は今回は無くても良いかもしれません。
けれどもスイッチを押した回数の処理では重要です。

今回の方法は連続して○回同じデータが続いたら採用する、という読み取り方です。
で、そのカウンタ変数cntが100になったら採用なのですけど、cnt++はある値で止めないとまた0に戻ります。
つまり、cnt=255+1;は0になります。
そうすると、2回目、3回目…と100に回ってくるので、2回押した、3回押した…と誤検知をしない為の処理です。
このようなカウントする処理だと、delayやループを使う事無く、長押し等の検知も出来ます。
また、LEDの点灯やブローの時間などもカウントして処理します。
猛牛ロック   2018/10/10(Wed) 18:01 !email! No.1070 !ico_edit!
Re: No1053について
>今回の方法は連続して○回同じデータが続いたら採用する、という読み取り方です

この解釈ですが、
TMROレジスタ8ビットを使うという事ですか?
レジスタが、0〜1111111となり、さらに1プラスされると1回目から2回目とカウントするという事ですか?
若しそうなら、
そもそも、このTMROレジスタを使うには、
タイマー0割り込みの機能を使う時だけに限定されるのでは?
単に、TMROレジスタのみをカウント用に使う方法はあるのでしょうか?
TR   2018/10/11(Thu) 07:00 !email! No.1071 !ico_edit!
Re: No1053について
メイン関数で、ループを作り、delay関数で調整しても、必ずずれていってしまいます。
また、delay関数を使うとその間は他の事が出来ません。

一方、タイマー割り込みは決まった間隔で、割り込み関数に飛ぶ、という機能です。
そこで、自分で、タイマーの変数を用意して、割り込み関数に入った数を数えると、正確な、(といっても
動作クロックに対して正確な、ということです)時間で動作させることが可能です。

また、作るタイマーも、自分で幾つでも作ることが可能なので、幾つもストップウォッチ相当を作り、違ったタイミングで
動作させることが可能になります。(タイマーといっても、ループをカウントする普通の変数です)
※TMR0レジスタのことではありません。当然タイマー0割り込みを使えばTMR0レジスタの動作に合わせた割り込みになりますけど、
違う意味です。

タイマーはPWMやキャプチャー等でも使います。勿論、単にタイマーを回して、その値を見て処理する事も可能です。
猛牛ロック   2018/10/11(Thu) 11:15 !email! No.1072 !ico_edit!
Re: No1053について
TRさん,猛牛ロックさん,こんばんは。



猛牛ロックさんが説明してくださってるので,

私が書くこともないのですが,

私は,

>今回の方法は連続して○回同じデータが続いたら採用する、という読み取り方です。

このために(調べるため),タイマー0をトリガーに使っている,

そんな風に私は理解してます。

つまり,タイマー0の割り込みは,一定間隔で,

データを検証するためのトリガーとして理解してます。




それから話題からそれますが,,

TRさんは,FUSION360を継続して使うため,

なんかされたのですか。

なんか,「3年間は無料でつかえる」という記事もみかけたことがあり,

使い始めてから3年以上経過しているので,

半分あきらめてもいるのです。

別件で,「ハートビート信号」なるものくぐってたら,

偶然にも

 http://docs.autodesk.com/ACD/2011/JPN/filesLIC/WS1a9193826455f5ff-3859b43c1209703a838-46f1.htm

がヒットし,くしくもFUSIONののライセンスのページにたどり着きました。
mabo   2018/10/11(Thu) 21:30 !email! No.1073 !ico_edit!
Re: No1053について
FUSION360の継続使用について

もうだいぶ前なので詳しい事は忘れてしまいましたが、
余り迷うことなく利用期間の延長が出来た感があります。
一度下で聞いてみて下さい。誰か教えてくれると思います。
https://forums.autodesk.com/t5/fusion-360-ri-ben-yu/bd-p/707
それでもだめだったら、
下のページの上部にある「無料体験版」から再度申し込んでください。
https://forums.autodesk.com/t5/fusion-360-ri-ben-yu/bd-p/707
自分の時は、その様にしたような気がします。



>>今回の方法は連続して○回同じデータが続いたら採用する、という読み取り方です。

この文章を見て、何を言おうとしているのかはっきりとしました。
でも、その方法が不明。
TR   2018/10/12(Fri) 06:03 !email! No.1074 !ico_edit!
Re: No1053について
TRさん,おはようございます。

情報ありがとうございます。

無料体験版で後日試したいと思います。


猛牛ロックさんの方が詳しいと思いますが,

>>>今回の方法は連続して○回同じデータが続いたら採用する、という読み取り方です。

>この文章を見て、何を言おうとしているのかはっきりとしま>した。
>でも、その方法が不明。

これは,チャタリング防止の一つの方法で,

サンプリング方式?なんて呼ばれているようです。

考え方としては,

ループのなかや割り込み関数のなかで,

   スイッチの判定
    ↓
   押されていたらカウンターをプラス
    ↓
   カウンターが一定の回数になったかの判定
    ↓
   一定の回数になったら,スイッチが押されたと判断

みたいな感じで,コーディングすると,

 if(switch==osareta){counter++;}

 if(counter==kaisu){
     hontouniosareta=yes;
     counter=0;
 }

みたいな感じでしょうかね。

チャタリングの防止,サンプリング方式等でくぐると結構あります。

http://gurochoro.blogspot.com/2017/08/debounce-in-a-microcomputer.html

あたりにでてます。



それと煩雑なプログラムですが,以前,割り込み等を使って,

半田ごてタイマーをつくりました。

http://mabo52.sakura.ne.jp/index.php?c=7-11

このタイマーは,

  スイッチオン
   ↓
  動作時間の設定
   ↓
  カウントダウン開始
   ↓
  0になって,延長ボタンを押すと延長
   ↓
  何もしなければ一分後に電源を切る

この動作をさせるのに,サンプリングみたいなことやって,

二つのキーが同時におされたか,とか,長押しされたか,

等プログラムの中で判断してます。
mabo   2018/10/12(Fri) 11:06 !email! No.1075 !ico_edit!
Re: No1053について
> でも、その方法が不明。

そうでしたかorz
じゃあ、1つずつ?説明します。

マイコンのタイマーは、マイコンの機能の一つ、とは言っても、マイコン制御の外にあります。
つまり、外付けに近い存在です。
マイコンをどんなに酷使させても、タイマーは設定どおりに動き続けます。遅れがありません。
つまり、アラーム付きの時計のように回り続けます。1分と設定すると、1分毎に「ピピッ」と鳴ります。
なので、それを10回数えると10分経ったことが解ります。
一方、delayは「10分休憩」とするようなものです。10分は正確なのですけど、休んでいる間には何が起きても
対応できません。また、何度も休憩していると、現在の時刻が判らなくなります。
なので、正確な時間を測りたい時や、色々な作業をしたいときにはタイマーを使います。

で、タイマーで割り込みを設定すれば、その設定間隔で、(タイマー)割り込み関数が実行されます。
なので、割り込み関数で、自分でタイマー変数を作って、何回入ったかをカウントします。
例えば、タイマー割り込みを1msに設定したとして、割り込み関数で、

static unsigned int timer_ms=0; //time_msは自分で作った変数
timer_ms++; //timer_ms=timer_ms+1;

とすると、割り込み関数に入る度に、つまり、1ms経過するごとにtimer_msはカウントアップされます。
更に1秒毎にカウントアップさせる変数をつくります。

static unsigned int timer_s=0;
if(timer_ms==1000){//timer_msが1000になったら
timer_ms=0; //timer_msを0にして
timer_s++; //timer_sをカウントアップ
}

と書くと、秒を表す変数timer_sが1秒毎にカウントアップされます。
更に、同じ様に、
static unsigned char timer_m=0,timer_h=0;
if(timer_s==60){
timer_s=0;
timer_m++;
}
if(timer_m==60){
timer_m=0;
timer_h++;
}
if(timer_h==24)timer_h=0;

とすると、時計になります。
そうすると、朝の6時に目覚ましを10秒鳴らして
if(timer_h==6 && timer_m==0 &&timer_s<10) buzzer=on;
else buzzer=off;
とか、定時のタスク処理をする事が可能になります。

また、それと同時に自作タイマー(ストップウォッチ)を仕込むことが出来ます。
(外部変数)int timer1=-1;//-1はhome位置。timer1は単に作った名前

if(timer1>-1 && timer_ms==0)timer1--; //timer1がhome位置でなければ、1秒毎にカウントダウン
if(timer1==0)buzzer=on; 3分経ったらブザーを鳴らす

のように作っておいて、どこかで
timer1=180;
とカウント開始トリガを入れれば、3分後にブザーを鳴らすことが出来ます。
このような処理をいくつも仕込むことが可能です。いつでも自由にスタート信号を入れられ、
delayのような待ち時間はありません。
※実際にはブザーを止める処理も必要になります。
猛牛ロック   2018/10/13(Sat) 10:08 !email! No.1076 !ico_edit!
Re: No1053について
猛牛ロックさんへ
先に確認したい事が有ります。
no1040の猛牛ロックさんのプログラムですが、
Second関数の戻り値change は、char change=0 と記載して、初期化もしなくて良いのですか?
宜しくお願いします。
TR   2018/10/13(Sat) 15:51 !email! No.1077 !ico_edit!
Re: No1053について
あれって、私が書いたものだったんですか…

char change;
と宣言した時点で、変数changeの場所が割り当てられます。
で、外部変数(グローバル変数)だと、自動に0に初期化されます。
今回はローカル変数なので、割り当てられた場所に既に書き込まれたデータがあればそれが値になります。
で、実際に使われるのは
change=Second(DousaTime);
で、取得した値が入り、次行で
if(change==0){
となります。なので問題は無いです。
実際の所、取得した値を入れる変数なので、適正初期値もありません。
つまり、何も問題ないと思います。
※なにも入れていないで、その値の処理になってしまう場合は良くないです。
猛牛ロック   2018/10/13(Sat) 18:18 !email! No.1078 !ico_edit!
Re: No1053について
changeは、Second関数の戻り値ですよね?
若しそうであれば、main関数内で、Second関数が呼び出されるたびに
changeに数値が足されていってしまうのかと思いましたが、間違いでしょうか?

ようやく、関数が分かりかけています。


タイマーの方は概念だけは分かりました。
有難うございました。
タイマーについて、ここから先は、実践が出来ないと無理だと思います。
TR   2018/10/13(Sat) 18:45 !email! No.1079 !ico_edit!
Re: No1053について
> change=Second(DousaTime);
なので、戻り値がそのままchangeに代入されます。

足されるというのは
change+=Second(DousaTime);

change=change+Second(DousaTime);
と書かれている時です。

「=」(や「+=」)は代入演算子と呼ばれ、右辺の(計算)結果を左辺に代入します。
ほかにも、「-=」「|=」「&=」「*=」など複合したものがいろいろありますけど、
どれも
a$=b;
なら、('$'は+,-,/等の演算子)
a=a$b;
の形になります。
猛牛ロック   2018/10/13(Sat) 19:10 !email! No.1080 !ico_edit!
Re: No1053について
TRさん,猛牛ロックさん,おはようございます。

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

>タイマーについて、ここから先は、実践が出来ないと無理だと思います。

タイマー関連のもの制作なさるといいかもしれませんね。

材料費もそれほどかかりません。7セグLED等を使えば,

ダイナミック表示等の,練習になると思います。

私は,

http://nonchansoft.my.coocan.jp/pic/timer1.htm

の回路図を参考に,自分なりにアレンジして,

件の半田ゴテタイマーを作りました。

残念ながら,このHPにでているプログラムは,

アセンブリーなので,

細かいところは,わからなかったのですが,

エッセンス?を C に移植しましたものを,

改変いたしました。

完成するまで,自己保持回路までいれると,5年以上かかりました。

途中中断してたこともありますが,猛牛ロックさんのように,

プログラム・PIC等に,くわしければ,もっと短縮できたと思います。

これで,結構勉強になりました。
mabo   2018/10/14(Sun) 11:38 !email! No.1081 !ico_edit!
Re: No1053について
> MABOさん
半田ごてタイマーを見ていて、ふと、マルチファンクションボードと似ている事に気づきました。
3つのスイッチ、4桁の7セグ、ブザーと、偶然にも同じ構成です。
LEDをはんだ(SSR)出力と見立てて、テスト出来そうです。

あっ、マルチボードの7セグもダイナミック点灯ですよ。
74HC595で出力ピンを増やしただけです。なので逆にプログラムは面倒です。

あと、SSRモジュールhttps://www.aliexpress.com/item//32852838446.html
があればかなり近づきますね。

で、SSRの自己保持回路を見ていたのですけど、
「あれ?これってHIGH出力しなくてもSSR動いちゃうんじゃない?」なんて思って
よくよく見たら、切る時の為にフォトカプラ動かすんですね。
省エネでよく考えられていますね。(SSRの自己保持も見たのはココしかない気がします)
私なら、精々、GNDラインをトランジスタで止めて、並列にスイッチかなぁ?
猛牛ロック   2018/10/16(Tue) 23:21 !email! No.1087 !ico_edit!
アルディーノ 投稿者:TR 投稿日:2018/10/08(Mon) 21:00 No.1059

アルディーノについて、巷の記事を読んでみました。 ↓
https://n.mtng.org/ele/arduino/tutorial001.html
C言語なんですね。
PIC初心者としては、とっつきやすいと感じました。
アルディーノってマイコンボードと呼ぶそうですね。
アマゾンで見つけましたが、如何でしょうか?
https://www.amazon.co.jp/keyestudio-UNO-%E9%96%8B%E7%99%BA%E3%83%9C%E3%83%BC%E3%83%89-USB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-Arduino%E4%BA%92%E6%8F%9B/dp/B01JRFS1QI/ref=cm_wl_huc_item

本は、これがいいと思いましたが如何でしょうか?
https://www.amazon.co.jp/Arduino%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86-%E7%AC%AC2%E7%89%88-Make-Massimo-Banzi/dp/487311537X/ref=pd_sbs_14_5?_encoding=UTF8&pd_rd_i=487311537X&pd_rd_r=6d98aebc-caee-11e8-a689-293274f80a62&pd_rd_w=NcGFc&pd_rd_wg=3cFrB&pf_rd_i=desktop-dp-sims&pf_rd_m=AN1VRQENFRJN5&pf_rd_p=cda7018a-662b-401f-9c16-bd4ec317039e&pf_rd_r=YGH2QWXBVV3WBKD23079&pf_rd_s=desktop-dp-sims&pf_rd_t=40701&psc=1&refRID=YGH2QWXBVV3WBKD23079

Re: アルディーノ
Arduinoの日本語リファレンスはこのページです。
http://www.musashinodenpa.com/arduino/ref/

また、このページにある早見表を手元に置いておくといいです。
http://www.musashinodenpa.com/wiki/?quickrefsheet


本に関しては、私はこの類の本は買いません。webで検索します。
この本も有名な本ですけど、全くの初心者用です。
例えば、https://www.elegoo.com/download/
で、「Elegoo UNO R3 Super Starter Kit」や他のキットの説明書を読めば充分だと思います。
実際に動かすスケッチやライブラリも入っています。


モノは、UNOなら、どれも違いは殆どありません。
純正/互換品か、DIP/SMDか、という位です。
回路図は公開されているので回路的にはどれも同じです。
DIP品は外して使う事も可能ですけど、殆どしないでしょうから、SMDでも良いです。

取りあえずは
UNO
https://www.aliexpress.com/store/product//2444008_32836264665.html

マルチボード
https://www.aliexpress.com/item//32730415337.html

の2つがあれば充分始められます。勿論、アマゾンやAITENDOでも売っています

マルチボードは
3つのスイッチ、4つのLED、4桁の7セグ、ブザー、ボリュームが付いたものです。
実際は、しょぼいものですけど、キッチンタイマー相当のものまで作れます。

また、この方がケーブル/配線が無い分、間違いが無く、準備/片付けの時間が要らず、
勉強には適したボードです。unoに差し込めば良いだけです。
※私も、このボードを持っています。聞かれた時に簡単に試せた方が都合が良いです。
猛牛ロック   2018/10/09(Tue) 00:23 !email! No.1060 !ico_edit!
Re: アルディーノ
No.1053
変数宣言について

static unsigned char cnt=0,MODE_temp,MODE_new;

この変数宣言ですが、
変数cntに対する値 → 0、MODE_temp 、MODE_new
以上3個ある、こういった使い方があるんですね!


static宣言
これも初めて目に留まりました。
呼び出された回数を値とする といった事でしょうか?
cntに代入する値を増やそうとしているのでしょうか?
ハッキリとしません。


商品の方、有難うございました。
安くて助かります。
先ずは、今やっているピログラムの確認を
Pic3でやってからアルディーノの購入を考えます。
TR   2018/10/09(Tue) 07:46 !email! No.1061 !ico_edit!
Re: アルディーノ
void f(void){
char a=0,b=5,c;
a++;
b++;
c=a+b;
PORTA=c;
}

void main(void){
while(1){
f();
delay(1000);
}
}

例えばこんな関数fがあったとします。
メイン関数からf関数が呼ばれると、
char a=0,b=5,c;
※カンマで、複数作っても良いです。1つずつ初期化するのと同じです。
で、変数a,b,cが作られますけど、aには0、bには5が入ります。
そして、cは変数を作る=その変数の場所を確保しただけで、内容は書き換えません。
つまり、その前の状態のまま使われます。つまり、内容は不定です。

で、次に、a++とb++するのでaは1、bは6になります。そして、最期のPORTA=cをしてこの関数は終わります。
メイン関数のループで、次にf関数が呼ばれた時にも、さいしょのa=0、b=5から始まります。

次に、
static char a=0,b=5,c;
の場合の動作です。1回目は全く同じ動作です。
でも、最期にPORTA=cをした後もstaticが付くと変数(の値)が残ります。
つまり、2回目にf関数に来たときにはaは1、bは6です。
「static char a=0,b=5,c;」
の初期化作業は最初に入った1回目しかされません。
つまり、入る度にa++、b++されている分増えていきます。

そういった違いです。外部変数に近い動作になります。
猛牛ロック   2018/10/09(Tue) 08:38 !email! No.1062 !ico_edit!
Re: アルディーノ
あ、ループ中とかでも同じです。
while(1){
int i=0;
i++;
//…
}
だとループ先頭で、iは毎回0になります。
staticを付けると、最初の1回だけ0で、2周目以降はそのまま値が引き継がれます。
猛牛ロック   2018/10/09(Tue) 09:04 !email! No.1063 !ico_edit!
Re: アルディーノ
猛牛ロックさんとやり取りをしていると、単に、教科書だけ見ていたら気付かない点を教えて下さい助かります。


タイマー0割り込みのif(T0IF==1) { //割り込みがあったら
TOIF==1は不要かと思っていました。

また、変数への値代入方法
int c=100 といった風に、一度に1個だけしか変数に代入できないと思っていました。

それと、装飾語のstatic これに至っては、キトで遊ぼう電子回路09には記載ありませんから。

static unsigned char cnt=0,MODE_temp,MODE_new;
TR   2018/10/09(Tue) 20:44 !email! No.1064 !ico_edit!
Re: アルディーノ
猛牛ロックさん,ご無沙汰しております。

TRさん今晩は。

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

私も,猛牛ロックさんのお書きになってるのみると,

なるほどと思うことが沢山です。



ところで,話題がそれますが,

Fusion360期限切れで使えなくなりました。

引き続き使うには,有料版の購入か,新しくアカウント作って

再登録なんでしょうかね。


それから,PICのプログラムが,

古いWINDOWS7で作っていたので,

今の環境には,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ですが,私も,時々TRさんと同じ症状になったこと
ありました。

私の場合,USBのコードの問題やら,
PIC3から書き込みアダプターとの結線の接続の問題やら

いじったら,解決してました。

もちろん,TRさんのようにOPTIONもいじったように
記憶してます。

記事をさがしたのですが,このことは,ブログには,
載せていなかったようです。

このブログ,備忘録も兼ねているので,失敗でした。


−−追記−−

 staticの宣言については,猛牛ロックさんのおっしゃるとおりかと思います。

 私は,変数の有効範囲というこことで理解しています。

 static宣言してある変数は,その関数からでも書き換えできますが,

 サブ関数で宣言してる変数は,その関数ないでしか書き換えできない,と私は理解してました。

 正確宣言するには,多分サブ関数の変数(ローカル変数)は,

きっと,autoの宣言するんでしょうかね。


https://www.grapecity.com/developer/support/powernews/column/clang/034/page03.htm

のHPに下記のような記述がありました。
>変数には、

>  宣言された処理単位(関数)内でのみ存在する自動変数
>  処理を終えても存在して値を保持し続ける静的変数

>の2種類があります。これは、変数の『通用期間』に関する違いです。

>さらに

>  宣言された処理単位(関数)内でのみ参照できる局所変>数
>  処理単位の外からでも参照できる広域変数

>の2種類があります。これは、変数の『通用範囲』に関する違いです。

   静的変数→static
   自動変数→auto


プログラムを作るとき変数の受け渡しどうするかいつも悩みます。

サブ関数に引数として渡して,戻り値として受け取る方法もありますが,

私の場合,プログラムの視認性が悪くなるのでしょうが,

static宣言をするなどして,グローバル変数として,

操作する方が,手っ取り早いと思ってます。
 
mabo   2018/10/09(Tue) 21:32 !email! No.1065 !ico_edit!
Re: アルディーノ
maboさん、こんばんは。
自分も以前、切れてしまいました。
でも今は使えています。
TR   2018/10/09(Tue) 22:19 !email! No.1066 !ico_edit!
Re: アルディーノ
MABOさん。お久しぶりです。
っといっても、こっちはずっとチェックしてますよ(^^)/

で、ちょっと追記の所で誤解があるようです。(私の誤解かも)
ローカル変数は普通の宣言でauto変数です。つまり、
char i=0;
でauto変数になります。その関数というか、スコープが終わった時点で無くなります。
static char i=0;
とすると、この値、つまり、メモリの番地自体は生き残ります。
でも、スコープ範囲はauto変数も、static変数も変わらないと思います。
あくまでローカル変数として宣言していたらローカルだと思います。
つまり、別の関数からはそのiは呼び出せないし、そこで新たに
int i=0;
とか、前と違う意味のiを作っても全く問題ないと思います。

勿論、全ての関数外に書いたグローバル変数は常に有効です。

そんな風に捉えています。

※たまにグローバル変数なのにstaticが付いているのを見かけます。
意味があるのかどうか、判りません。私の理解では意味ないのですけど。
猛牛ロック   2018/10/09(Tue) 23:45 !email! No.1067 !ico_edit!
Re: アルディーノ
猛牛ロックさんへ
アルディーノとマルチボードをポチットしました。
Pic3は、現在運用しているCNCフライスがあるので、必須ですが、
アルディーノは、自分はどうかな〜と思っていますが、
安価だし、折角 猛牛ロックさんに教えて頂いたので、
買いました。

来たら、今までの間欠などを入れてみます。
また楽しみましょうね。

maboさんは、今更になるかもしれませんが、
未だ購入していないようでしたら、
ポチット行きませんか?
TR   2018/10/10(Wed) 10:29 !email! No.1068 !ico_edit!
Page: | 1 | 2 | 3 | 4 | 5 | 6 |

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