電子工作向けのプログラミングの勉強をしておりますが、SPI通信で気になることがあって質問させていただきました。

ArduinoやRaspberry Pi向けのOSに含まれるSPI関連のAPIを使うと、数バイトを一度に送受信することができます。

ただ、ウィキペディア英語版(https://en.wikipedia.org/wiki/Serial_Peripheral_ …)によると、SPI通信時は、1クロックで1ビットのデータの送信と受信が同時に行われていると解釈できます。また、ざっと調べる限り、PICマイコンで送受信を同時に実装する場合、1バイト送信したら、1バイトの受信を待たないと正しく動作しないようです。

上記のようなAPIを利用した送受信が機能しているのであれば、一方がマルチバイトデータを送信しているときは、同時に相手側の機器からもダミーのバイトデータを送信していると解釈してもよいのでしょうか。あるいは、一通りの受信が終わるまで相手側は待機状態に入っている、もしくは、対象の機器の挙動にたいしてケース・バイ・ケースで対応する必要があるのでしょうか。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

>SPI通信時は、1クロックで1ビットのデータの送信と受信が同時に行われていると解釈できます。


そうですね
>また、ざっと調べる限り、PICマイコンで送受信を同時に実装する場合、
>1バイト送信したら、1バイトの受信を待たないと正しく動作しないようです。
それはそのモジュールだかがそういう作りになってるだけです。

大概は8ビットを1文字として、意味ないヌルコードなら受け取っても捨てればいいし
それ以外のコードなら双方の約束に従って解釈し動作すればいい

>あるいは、一通りの受信が終わるまで相手側は待機状態に入っている、
>もしくは、対象の機器の挙動にたいしてケース・バイ・ケースで対応する必要があるのでしょうか。

SPI通信は「データ送受信」の信号形態を規定するものであり
データの中身とかは規定してません。
送受信双方の設計者が自由自在勝手気ままに決めればいいです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。一方の機器の方法に合わせてフルスクラッチでプログラムするなどいろいろ思考してみたいと思います。

お礼日時:2017/03/16 19:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QArduinoでターミナル等に触ると誤動作する

Arduino Unoで図のような回路を組んでいます。
なぜか矢印のターミナルに触るとその先のスイッチがONになったと勘違いした動作をします。
なぜこのようになってしまうかと対策など、ご存知の方に教えていただけたらとおもいます。

最初はこの回路でなく、内蔵プルアップにしました(その時は4.7kΩは無かった)。内臓プルアップでこれと同じ誤動作が起きたのでそれを止めてこの形になりました。

ターミナルに触ると言うのはドライバの先やテスターのプローブの片方だけが触れると言う意味です。それは手持ちで、身体やその物のどこか一部が別の場所に触れていると言う事はありません。

図は、実際の基板のレイアウトとほぼ同じです。ターミナルの列から上はユニバーサル基板に乗っていて半田付けされています。Arduinoの電源はUSB経由です。

Aベストアンサー

回答NO.2です。
 すみません、回路でLEDの抵抗3本の共通ラインはGNDにつながってたのを見落としてました。
回路図を書き直して添付しました。この回路でそういう現象が起きるという事はAC電源の誘導電圧が大きいとしか考えられませんので添付図のように電解コンデンサC1とC2(それぞれ10uF/10V)を追加すれば誤動作はなくなると思います。

Qarduino

arduinoに超音波センサと東芝のモータードライバを使ってセンサの値に応じてモーターを動くプログラムを書いているものなのですが

電源不足なのか知りませんがArduinoのーledが一瞬つくもののすぐ消えてしまいます。
しかしセンサを抜くとつくようになります。
電池を昇圧してDC給電してもpcからUSB給電しても同じです。
電池はものすごい暑くなります。
対処法はなんでしょうか

Aベストアンサー

症状から超音波センサを繋ぐと以上に大きな電流が流れて電池の電圧が下がりLEDが一瞬ついてすぐ消えてしまってるようです。

超音波センサの型番は?その超音波センサとaruduinoと電源の接続回路はどうなってますか?
可能性としては超音波センサの電源をプラスとマイナスを逆につないでしまってる。この場合はセンサーは壊れてしまってる可能性が大きいです。
それから全体の相互の接続が分かるような回路図も提示してもらった方がアドバイスしやすいです。

Qエネループ arduino

エネループで
SANYO製充電器KBC-E1S(単3eneloop2本を仲立ちにして充電するタイプ)
を買おうと思っていてそれをarduinoに繋ごうかなと思っています。
一応一ポートしかないのでUSBハブを使用して分割しようと思うのですが。

何個まで拡張できますか

Aベストアンサー

USB Hub のACアダプタの容量により、接続台数が変わります。
尚、バスパワーのUSB Hubは使用できません。
Hubを使うよりも、マルチ出力のUSB電源を使った方が良いと思います。

QArduino繰り返し

Arduinoのwhile文等で疑問があります。
while 文は条件文と実行文があったと思うのですが
実行文終わるまで条件文の確認は行われないのですか。
条件文の確認の頻度はどのくらいですか。

Aベストアンサー

> 実行文終わるまで条件文の確認は行われないのですか。
はい。

while文の処理は以下のとおりです。
1. 条件文を確認する。
2. trueならば、実行文を実行する。falseならば、while文を抜ける。
3. 1に戻る。

たぶん「条件文がtrueの間、実行文を実行する」みたいな説明を見て、「実行文の実行と同時に条件文を確認する」ような解釈をしてしまったのだと思いますが、
そのような処理マルチスレッドやマルチコアでなければできません。

QArduino

Arduinoで一バイト受信
http://www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=470
とあるのだが
一バイト受信は一個の数字を受信するという意味で大丈夫でしょうか

また()に何も入れないと一バイト受信なのですか

Aベストアンサー

>一バイト受信は一個の数字を受信するという意味で大丈夫でしょうか

8Bit分のデータを受信する。
というだけです。
# 0~255までの数値を受信する。と言い換えてもいいかも知れません。(ただし、送信側が256以上の数値を送った場合にどう受信されるかは環境依存…でしょう。)
# 「ASCIIコードで1個の数字を受信する」という解釈であれば合っています。(ただし、文字列としては使えないが)

とりあえず確認しますが……「数値」と「数字」の区別はつきますか?

>また()に何も入れないと一バイト受信なのですか

引数を取らない関数である。
というだけですので、入れた/入れないでどうこうではありません。
# 入れるとビルドでエラーになるか、無視されるかのどちらか。

QArduinoIDEのコンパイル結果の表示

Arduino言語で書かれたプログラムがArduinoIDEでどのような機械語に翻訳されているか、ちょっと興味があり確かめてみたくなりました。
コンパイル結果を機械語(アセンブラ)で表示する方法教えてください。

ArduinoIDEのオプションなど探してみたのですが、表示方法がみつからなかったので、よろしくお願いします。

Aベストアンサー

>ArduinoアセンブラでLチカ
>http://qiita.com/TakeoChan/items/8362eaf53cf199262cb7

>【Arduino】アセンブラ入門 その1
>http://nn-hokuson.hatenablog.com/entry/2017/09/11/194125

>arduinoの逆アセンブラーリスト
>http://blog.goo.ne.jp/cookchant/e/2e7d037ebaea8f7d395773b44966c9b9

 こういう感じらしいです。

Qトリプルビュートってできるのですか?

教えてもらってばかりですいません。
1TBのSSDに、Ubuntu200GB,Oracle Linux400GB,RED HAT400GB
にしたいと思っています。
ダブルビュートなら何度もしたことあるのですが、
トリプルビュートってできるのですか?
幾度もすいません。
可能かどうか教えてください。
どうぞ宜しくお願い申し上げます。

Aベストアンサー

トリプルブートは可能です。
ただ、パーティションの区切り方と管理には十分に気を配ってください。
下記リンクを読んで参考にしてください。
http://eng-entrance.com/linux-partition

QAdafruit LIS3DH 3軸加速度センサーモジュールをアルディーノUNOに搭載し角度を検出し

Adafruit LIS3DH 3軸加速度センサーモジュールをアルディーノUNOに搭載し角度を検出したいです。

『I2CまたはSPIのどちらを利用するかによってピン名とコメントをするか』と記載がありました。
SPIを利用する場合どのようにピン名とコメントを変えればよいでしょうか?回答お願いします。


// Basic demo for accelerometer readings from Adafruit LIS3DH

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_LIS3DH.h>
#include <Adafruit_Sensor.h>

// Used for software SPI
#define LIS3DH_CLK 13
#define LIS3DH_MISO 12
#define LIS3DH_MOSI 11
// Used for hardware & software SPI
#define LIS3DH_CS 10

// software SPI
//Adafruit_LIS3DH lis = Adafruit_LIS3DH(LIS3DH_CS, LIS3DH_MOSI, LIS3DH_MISO, LIS3DH_CLK);
// hardware SPI
//Adafruit_LIS3DH lis = Adafruit_LIS3DH(LIS3DH_CS);
// I2C
Adafruit_LIS3DH lis = Adafruit_LIS3DH();

#if defined(ARDUINO_ARCH_SAMD)
// for Zero, output on USB Serial console, remove line below if using programming port to program the Zero!
#define Serial SerialUSB
#endif

void setup(void) {
#ifndef ESP8266
while (!Serial); // will pause Zero, Leonardo, etc until serial console opens
#endif

Serial.begin(9600);
Serial.println("LIS3DH test!");

if (! lis.begin(0x18)) { // change this to 0x19 for alternative i2c address
Serial.println("Couldnt start");
while (1);
}
Serial.println("LIS3DH found!");

lis.setRange(LIS3DH_RANGE_4_G); // 2, 4, 8 or 16 G!

Serial.print("Range = "); Serial.print(2 << lis.getRange());
Serial.println("G");
}

void loop() {
lis.read(); // get X Y and Z data at once
// Then print out the raw data
Serial.print("X: "); Serial.print(lis.x);
Serial.print(" \tY: "); Serial.print(lis.y);
Serial.print(" \tZ: "); Serial.print(lis.z);

/* Or....get a new sensor event, normalized */
sensors_event_t event;
lis.getEvent(&event);

/* Display the results (acceleration is measured in m/s^2) */
Serial.print("\t\tX: "); Serial.print(event.acceleration.x);
Serial.print(" \tY: "); Serial.print(event.acceleration.y);
Serial.print(" \tZ: "); Serial.print(event.acceleration.z);
Serial.println(" m/s^2 ");

Serial.println();

delay(200);
}

Adafruit LIS3DH 3軸加速度センサーモジュールをアルディーノUNOに搭載し角度を検出したいです。

『I2CまたはSPIのどちらを利用するかによってピン名とコメントをするか』と記載がありました。
SPIを利用する場合どのようにピン名とコメントを変えればよいでしょうか?回答お願いします。


// Basic demo for accelerometer readings from Adafruit LIS3DH

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_LIS3DH.h>
#include <Adafruit_Sensor.h>

// Used for software SPI
#define LIS3DH_CLK 13
#d...続きを読む

Aベストアンサー

現物持っていませんから確認はできませんが…。
掲示されているコードのコメントから推測できる範囲で。

// Used for software SPI
#define LIS3DH_CLK 13
#define LIS3DH_MISO 12
#define LIS3DH_MOSI 11

ソフトウェアSPI使うなら11番から13番にそれぞれの信号制御をする。
ということでしょう。
割り当てを変えたい場合はこちらを変更することになるかと。

// Used for hardware & software SPI
#define LIS3DH_CS 10

ハードウェアSPIなら10番にCS信号を。
# ソフトウェアSPIでも使うっぽいですが。


http://www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=539
http://garretlab.web.fc2.com/arduino_reference/libraries/standard_libraries/SPI/
こちらのページだと…11から13は固定なんですかね。
SSの10番は他でもいい…と推測されます。


// software SPI
//Adafruit_LIS3DH lis = Adafruit_LIS3DH(LIS3DH_CS, LIS3DH_MOSI, LIS3DH_MISO, LIS3DH_CLK);
// hardware SPI
//Adafruit_LIS3DH lis = Adafruit_LIS3DH(LIS3DH_CS);
// I2C
Adafruit_LIS3DH lis = Adafruit_LIS3DH();

I2Cで使用するようになっているのでSPIにする場合は一番下のはコメントアウトに。
ソフトウェアSPIなら上のもののコメントアウトを解除、ハードウェアSPIなら真ん中のコメントアウトを解除…かと。

現物持っていませんから確認はできませんが…。
掲示されているコードのコメントから推測できる範囲で。

// Used for software SPI
#define LIS3DH_CLK 13
#define LIS3DH_MISO 12
#define LIS3DH_MOSI 11

ソフトウェアSPI使うなら11番から13番にそれぞれの信号制御をする。
ということでしょう。
割り当てを変えたい場合はこちらを変更することになるかと。

// Used for hardware & software SPI
#define LIS3DH_CS 10

ハードウェアSPIなら10番にCS信号を。
# ソフトウェアSPIでも使うっぽいですが。


http:/...続きを読む

Qシェルスクリプトで一括作成したユーザーのパスワードが使えません

下記のようなシェルスクリプトを使ってユーザーを一括登録しました。
ユーザーのフォルダが作成されました。/etc/passwdと/etc/shadowには追加されています。
しかし、作成したユーザーでログインしようとすると、「パスワードが違います。」とメッセージが出てログインできません。
下のスクリプトのパスワード作成の方法が違っていて、予想もしないようなパスワードが作成されてしまっているのでしょうか。
それとも、パスワードを有効にする処理を追加しなければいけないのでしょうか。
もし、パスワードを有効にする処理が必要なら、どのようにしたらいいのでしょうか。
どなたか、お知恵を拝借できないでしょうか。お願いします。

シェルスクリプトの内容
#!/bin/bash

FILE_U="/home/samba/mail_add.txt"
FILE_P="/etc/passwd"

newusers $FILE_U

for line in `cat $FILE_U`
do
user_name=`echo $line | cut -d ':' -f 1`
pass=`echo $line | cut -d ':' -f 2`
txt=`cat $FILE_P | grep -e "^$user_name:"`
user_id=`echo $txt | cut -d ':' -f 3`
group_id=`echo $txt | cut -d ':' -f 4`
home_dir=`echo $txt | cut -d ':' -f 6`
##パスワード生成
PASSWORD=`perl -e "print(crypt('${pass}', 'a5'));"`
useradd -u ${user_id} -g ${group_id} -d ${home_dir} -m -p ${PASSWORD} ${user_id}
cp -rf /etc/skel/* $home_dir/
chown -R $user_id $home_dir
chmod 711 $user_id $home_dir
chgrp -R $group_id $home_dir
done

/etc/passwdの内容
t-hayashi3109:x:1002:1002:t-hayashi3109:/home/t-hayashi3109:/bin/bash
t-fujihara3114:x:1003:1003:t-fujihara3114:/home/t-fujihara3114:/bin/bash
t-takejima423:x:1004:1004:t-takejima423:/home/t-takejima423:/bin/bash
n-kishita999:x:1005:1005:n-kishita999:/home/n-kishita999:/bin/bash
y-kawase270:x:1006:1006:y-kawase270:/home/y-kawase270:/bin/bash

/etc/shadowの内容
t-hayashi3109:$6$IMrX/4SsD4$J0MTnXOhBR3HWfmtdptRkue/wmaWNrnx4lsahchwxBZIVDJvew3XHYXzi89o/ds18AmiTi9WRg4TJhXH66LMG1:17218:0:99999:7:::
t-fujihara3114:$6$cF90/Zk/sE43sq$I/c5IJWdIleNCjQp13uLyn/eHWxQMfZNjyLE7bjfkGswdb.q46VvqV8uAXzIZUdhc8zJW9BSnhrMc.eBIvdyP0:17218:0:99999:7:::
t-takejima423:$6$b0I4T4EbexUig2$0ouOYWtnPAZMz1YKNLrOsyG1RYkJhSS1OnSvkdIR97Cr0d5JOpM3Dg9F.MfVF957QPmuFgmE8N9avPx2XChB31:17218:0:99999:7:::
n-kishita999:$6$eAlJ9dMM$Mt2tL.TqJ/A0cXk3eAs/5ids.6iDtcy339YNRacEZZcfaMUIEcUkRcXoD..vw0quA1ezQlQbhxL5sXmmGTGYc.:17218:0:99999:7:::
y-kawase270:$6$hw44olqmQE/u2$2j9Sit5Bgr3XgYcVETyG4ahzEYQ5WHJgN9PrYoNYqieFbyMmt1qCuSunuZ8Mwo35rln7nTY3U7j8PGXyD33XJ/:17218:0:99999:7:::

下記のようなシェルスクリプトを使ってユーザーを一括登録しました。
ユーザーのフォルダが作成されました。/etc/passwdと/etc/shadowには追加されています。
しかし、作成したユーザーでログインしようとすると、「パスワードが違います。」とメッセージが出てログインできません。
下のスクリプトのパスワード作成の方法が違っていて、予想もしないようなパスワードが作成されてしまっているのでしょうか。
それとも、パスワードを有効にする処理を追加しなければいけないのでしょうか。
もし、パスワード...続きを読む

Aベストアンサー

>chmod: `t-hayashi3109' にアクセスできません: そのようなファイルやディレクトリはありません

に関しては、
>chmod 711 $user_name '/home/'$user_name'/'
が誤りです。
最初の$user_nameは不要です。

>pass=`echo $line | cut -d ':' -f 2`
>##指定されたパスワードを渡す
>echo $pass | passwd --stdin $user_name

恐らく不要です。
/etc/login.defsで
ENCRYPT_METHOD SHA512
になっていれば、newusersコマンドで作成されるパスワードハッシュはSHA512になっていると思われます。
# /etc/shadowの第2フィールドが$6$になっているかと。

>[root@mailsv02 ~]# su t-hayashi3109
>: そのようなファイルやディレクトリはありません

rootからのsuだとパスワードなしでも通るので、確認には不向き…かと思われます。

1つ前の質問で改行コードについて確認しましたけど…その辺りどうです?
ちなみに、それぞれ改行コードを変えているとfileコマンドで下記の様な結果になります。
[user@localhost ~]$ file mail_add_CRLF.txt
mail_add_CRLF.txt: ASCII text, with CRLF line terminators
[user@localhost ~]$ file mail_add_LF.txt
mail_add_LF.txt: ASCII text

CRLFがWindowsで標準に使われる改行コード、LFがLinuxで標準に使う改行コードです。
/home/samba
ということなので、mail_add.txtはWindowsで編集してsambaで転送したのではありませんか?
そうすると、ユーザのシェル指定が"/bin/bash"ではなく"/bin/bash\r"(\rはCR)になります。
# FTPのASCIIモード以外では変換してくれませんので、Windowsのエディタで改行コードをLFに指定するか、Linuxに移した後で改行コードの変換が必要です。
で、シェルが"/bin/bash\r"の場合に…
>[user@localhost ~]$ su - t-hayashi3109
>パスワード:
>: そのようなファイルやディレクトリはありません
となりました。

[root@localhost ~]# file /etc/passwd
/etc/passwd: ASCII text, with CRLF, LF line terminators
ということで、/etc/passwdがCRLF混じりのファイルになっているかと。

trコマンドで改行コード中のCRは削除できるので、それで置き換える…という方法で回避できるかと思われます。
[root@localhost ~]# tr -d \\r < /etc/passwd > /etc/passwd1
[root@localhost ~]# cp /etc/passwd1 /etc/passwd
cp: `/etc/passwd' を上書きしますか? y
のように一時ファイルに書き出してから更新する…とか。
# リダイレクトでやる場合は『入力ファイル』と『出力ファイル』を同じにすると問題が発生する場合があるのでご注意を。
http://osksn2.hep.sci.osaka-u.ac.jp/~taku/osx/crlf.html

>chmod: `t-hayashi3109' にアクセスできません: そのようなファイルやディレクトリはありません

に関しては、
>chmod 711 $user_name '/home/'$user_name'/'
が誤りです。
最初の$user_nameは不要です。

>pass=`echo $line | cut -d ':' -f 2`
>##指定されたパスワードを渡す
>echo $pass | passwd --stdin $user_name

恐らく不要です。
/etc/login.defsで
ENCRYPT_METHOD SHA512
になっていれば、newusersコマンドで作成されるパスワードハッシュはSHA512になっていると思われます。
# /etc/shadowの第2フィ...続きを読む

Qマイコンに詳しい方教えてください。

CLOCK 10MHz
; PORTB 0:LED緑,1:LED赤
;
LIST P=PIC16F84A ; LIST宣言で、使用するPICをPIC16F84Aと定義する
INCLUDE P16F84A.INC ; 設定ファイルp16f84a.incを読み込む

__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF


GPR_1 EQU 0Ch ; GPRの1バイト目にGPR_1と言う名前を付ける
GPR_2 EQU 0Dh ; GPRの2バイト目にGPR_2と言う名前を付ける
GPR_3 EQU 0Eh ; GPRの3バイト目にGPR_3と言う名前を付ける


ORG 0 ; リセットベクタ(0番地)を指定する。
INIT
; << PICの初期化 >>
BSF STATUS,RP0 ; ファイルレジスタSTATUSのRP0をセット(1)する → バンク1
CLRF TRISB ; ファイルレジスタTRISBをクリア(0) → PORTBは全て出力
BCF STATUS,RP0 ; STATUSのRP0をクリア(0) → バンク0

LOOP
MOVLW 03h
MOVWF PORTB ; RB0,RB1をオンにする(LED点灯)

CALL T05S ; 0.5秒待つ
CLRF PORTB ; RB0,RB1をオフにする(LED消灯)

CALL T05S ; 0.5秒待つ
GOTO LOOP ; LOOPに戻って繰り返す


; << 0.5S待つサブルーチン >>
T05S
MOVLW 05h ; ループ回数5を
MOVWF GPR_3 ; セット
T05LP CALL T100mS ; 100mS待つ
DECFSZ GPR_3,F ; ループ回数-1して0になったら次の命令をスキップ
GOTO T05LP
RETURN ; このサブルーチン呼出し元に戻る


; << 100mS待つサブルーチン >>
T100mS
MOVLW 0F9h ; F9h=249
MOVWF GPR_2 ; (ループ回数として249をセット)
T100LP CALL T04mS ; 0.4mS待つ
DECFSZ GPR_2,F ; ループ回数-1して0になったら次の命令をスキップ
GOTO T100LP ;
RETURN ; このサブルーチン呼出し元に戻る


; << 0.4mS待つサブルーチン >>
T04mS
MOVLW 0F9h ; F9h=249
MOVWF GPR_1 ; (ループ回数として249をセット)
T04LP NOP ; 何もせず1サイクル消費
DECFSZ GPR_1,F ; ループ回数-1して0になったら次の命令をスキップ
GOTO T04LP
RETURN ; このサブルーチン呼出し元に戻る

END ; プログラムの終了をアセンブラに指示する
このプログラムをスイッチを押したらランプが点灯するプログラムに変更したいのですが何処を修正すればいいのかわかりません。
初心者なのでわかりやすく教えて頂けると幸いです。宜しくお願いします。

CLOCK 10MHz
; PORTB 0:LED緑,1:LED赤
;
LIST P=PIC16F84A ; LIST宣言で、使用するPICをPIC16F84Aと定義する
INCLUDE P16F84A.INC ; 設定ファイルp16f84a.incを読み込む

__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF


GPR_1 EQU 0Ch ; GPRの1バイト目にGPR_1と言う名前を付ける
GPR_2 EQU 0Dh ; GPRの2バイト目にGPR_2と言う名前を付ける
GPR_3 EQU 0Eh ; GPRの3バイト目にGPR_3と言う名前を付ける


...続きを読む

Aベストアンサー

質問文のサンプルプログラムはとても親切にできている。
これを見ながら勉強すればよいのですが、それすら拒否するのであれば、
自分もNo.1の回答者さん同様、「向いてない」んで諦めることを勧める。

・・・
まずはコマンドリファレンスを見る。
PIC系のコマンドは少ないから覚えようとしなくても使っているうちに覚えてしまうでしょう。
次にI/O。これは専用のレジスタを使って値を読んだり書き込んだりして行う。
データシートと睨めっこだ。

その上で分からない所を聞くようにしよう。

プログラミングも初めてで何から手を付けていいか分からないんです…という事ならプログラミングを教えてくれるスクールで勉強してください。
さすがにそこから勉強が必要な人を一問一答形式のQ&Aサイトで何とかできるようなものではありません。


・・・余談・・・
自分もPICのアッセンブラについてはほとんど知りませんが、
先ほどコマンドリファレンスとデータシートをチラ見した感じでは、
2日くらい試行錯誤すればモノになるかな…って感じ。
その後もしばらくコマンドリファレンスとデータシートは手放せないでしょうが。
それよりもエミュレータのインストールが面倒かなと思った。

ただ、他の機種のアッセンブラを体験しているのでそんなに難しい感じは受けませんでしたが、
プログラミングの初心者さんには基礎を教えてくれる人がいないと1ヶ月でも無理かなと思いました。
(Z80系のザイログニーモニックと8080系の8ビット・インテルニーモニックのアッセンブラなら今でも行けますぜ。ダンナ)

そんなわけで初心者さんなら、身近にいるプログラミング(特にアッセンブラ)を教えてくれる人を頼りましょう。
1日1時間きっちり教われば、最短なら1週間でPICプログラミングできるようになる。(ただし、教えてくれる人のスキル次第)


ちなみにサンプルプログラムはチラ見する前から内容をほぼ理解できました。(そのくらい簡単で親切な作りです)
レジスタはデータシートを見ながら1つずつ確認しなきゃダメですけどね。

質問文のサンプルプログラムはとても親切にできている。
これを見ながら勉強すればよいのですが、それすら拒否するのであれば、
自分もNo.1の回答者さん同様、「向いてない」んで諦めることを勧める。

・・・
まずはコマンドリファレンスを見る。
PIC系のコマンドは少ないから覚えようとしなくても使っているうちに覚えてしまうでしょう。
次にI/O。これは専用のレジスタを使って値を読んだり書き込んだりして行う。
データシートと睨めっこだ。

その上で分からない所を聞くようにしよう。

プログラミングも初...続きを読む


人気Q&Aランキング

おすすめ情報