LEDを点滅させるアセンブラのプログラム

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
PIC16F876という奴で、MPLABとかいう奴を使ってます
LED点滅というのは、LEDが縦一列に8個付いてるテストボードを使って
プログラムを書き終わったPICをそのテストボードに付けて
その8個のLEDが点滅すればおkなのですが、アセンブラがよくわかりません
とりあえず、ずっと点灯させるアセンブラプログラムは出来たのですが・・・
つづく
2デフォルトの名無しさん:2010/11/17(水) 20:16:26
つづき
これが点灯した時のプログラムです。これらを使って点滅させることが出来ると思うのですが
INCLUDE PIC16F876.inc
IOSET
BSF STATUS,RP0
MOVLW 0FFH
MOVWF TRISA
MOVWF TRISC
CLRF TRISB
BCF STATUS,RP0
MAINROUTINE
MOVLW 0FFH
MOVWF PORTB
MOVLW 0FFH
MOVWF 20H
つづく
3デフォルトの名無しさん:2010/11/17(水) 20:17:59
JP1
DECFSZ 20H,f
GOTO JP1
MOVLW 00H
MOVWF PORTB
MOVLW 0FFH
MOVWF 20H
JP2
DECFSZ 20H,f
GOTO JP2
GOTO MAINROUTINE
END
以上が、LED8個点灯(スイッチを入れると永久に)するプログラム(アセンブラ)です
4デフォルトの名無しさん:2010/11/17(水) 20:21:22
8個のLEDが同時に点滅できるプログラムが出来たら
次は踏み切りのように8個のLEDを前4個、後ろ4個に分けて
点滅させるプログラムも作らなければいけないそうなのでどうか、お願いします
5デフォルトの名無しさん:2010/11/17(水) 20:26:47
実はその後の課題もあるのです。●点灯しているLED○していないLED
●○○○○○○○
○●○○○○○○
○○●○○○○○
○○○●○○○○
   略
○○○○○○●○
○○○○○○○●
最初に戻る の繰り返すパターン
6デフォルトの名無しさん:2010/11/17(水) 20:31:34
最後はナイトライダーとかいう点滅方法です。
明日までに何とか解決しなければ・・・
7デフォルトの名無しさん:2010/11/17(水) 21:04:49
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所
8デフォルトの名無しさん:2010/11/17(水) 21:34:15
中学生乙
9デフォルトの名無しさん:2010/11/17(水) 21:46:14
RESTART:
1をポートに書く
一定時間待つを呼ぶ
2をポートに書く
一定時間待つを呼ぶ
4を....8,16,32,64...128...64..32.16......
;;; ...は自己で補完しろ
2をポートに書く
一定時間待つを呼ぶ
RESTARTラベルへ飛ぶ

>>1おまえにはシフトとか以前にこんな風に順序立てて全部ならべるコードから始めるのを勧める
10デフォルトの名無しさん:2010/11/18(木) 16:09:55
回路図かなんかさえありゃ知識ない俺でも手伝ってやれるがな
TRISA〜C, PORTB, STATUS の
どれがどうつながってるのか分からんと手も足も出ない
11デフォルトの名無しさん:2010/11/18(木) 18:38:32
arduinoなら簡単だよ
12デフォルトの名無しさん:2010/11/18(木) 18:52:04
流れはこんな感じです
0FFH→(20H)
  ↓
0FFH→(21H)
  ↓
?→(22H)
  ↓
(22H)−1→(22H)
  =0?  NOの場合、ここの部分だけ繰り返す
       YESの場合、次にいく           つづく
13デフォルトの名無しさん:2010/11/18(木) 18:58:21
つづき
(21H)−1→(21H)
   =0?  Noの場合、2つ前の命令に戻る
        Yesの場合、次にいく
    ↓
(20H)−1→(20H)
   =0?  Noの場合、3つ前の命令に戻る
        Yesの場合、終了
と、流れはこんな感じです。20H,21H、22Hに16進数を入れて、それを1引いた数を
同じ場所に上書きして、その値が0になったら次へ、違ったら0になるまで繰り返す
という感じです
14デフォルトの名無しさん:2010/11/18(木) 19:46:43
>>10
回路図はないんです・・・ただ>>2-3のアセンブラ言語を使えば、LEDを点滅させる
ことができるようなのですが・・・もしかしたらTRISA〜Cは使わなくても良いのですかね?
PORTBは全体的な出力の役割をしているのだと思います
>>11
高校の授業なので決められているもの以外は使えません
15デフォルトの名無しさん:2010/11/18(木) 20:04:54
用語解説します
BSF f,b・・・ビットセット命令 ファイルレジスタ命令

BCF f,b・・・ビットファイルレジスタ fで指定した○bit目をクリアせよ(0にする)

MOVLW k・・・レジスタに入れたい数kを入れよ

MOVWF・・・ワーキングレジスタの中身をFで指定したレジスタに入れよ(コピー)

CLRF f・・・指定したレジスタの中身を消せ

CONF f,d・・・dがfの時、f自身へ
16デフォルトの名無しさん:2010/11/18(木) 21:12:40
>>12-13 >>15
いやそれはとっくに全部調べがついてるんだ
単純に TRISA〜C, PORTB, STATUS のどれがなんのために使われているのかが知りたい

一見 PORTB が LED に繋がってるように見えるが
もしそうなら >>2-3 のプログラムであれば点滅しそうなものだ
しかし君は点灯という
ということは 20h回の待機じゃあまりに早すぎて点滅しているように見えないのだろうか
17デフォルトの名無しさん:2010/11/18(木) 21:37:39
>>16
え!?このプログラムでも実は点滅してるんですか!?
点滅速度が早すぎて点灯しているように見える・・・ということですか?
0FFHとはご存知だと思いますが2進数にすると256です。
ここの部分を違う値にすれば点滅して見えるようになるのでしょうか?
そんなことで解決できればいいのですが・・・
最初らへんのプログラムにあるIOSETでPORTCとPORTAを入力してPORTBを出力と
あって、電源がONの時に入力と書いてあるのですが、これだけじゃ分かりませんよね?

18デフォルトの名無しさん:2010/11/18(木) 21:49:00
あ、多分こうです
POTRTA・・・Aの中に数字を入れる為の箱みたいなもの
     このAの中身をwへ
PORTB・・・PORTAと同様に数字を入れる為の箱
    このBとwを足して、再びwへ
PORTC・・・これらを計算して出た結果wをCへ入れる
という役割のような気がします。推測ですが、20H,21H,22Hと同じような感じなので
もしかしたらPORTはいらないように思えました
19デフォルトの名無しさん:2010/11/18(木) 21:56:12
>>18
・・・PORTではなくTRISA〜Cのことを言ったかもしれませんorz
というより、やはりPORTはいらないと思いました。
STATUS は謎ですね・・・これももしかしたらいらないのかもしれません
20デフォルトの名無しさん:2010/11/18(木) 22:03:00
ループカウンタ     レジスタ
ループ1のカウンタ    20H
ループ2のカウンタ    21H
ループ3のカウンタ    22H

ループ1×ループ2×ループ3
  256 × 256 × 256 (MAX)・・・ もう何のことやら
21デフォルトの名無しさん:2010/11/19(金) 15:19:50
他の方どうぞ
22デフォルトの名無しさん:2011/01/04(火) 15:55:25
あけましておめでとうございます

ここってまだ生きてるのかい?
よかったら相談に乗るよ
  
23デフォルトの名無しさん:2011/05/18(水) 16:02:08.65
時期的に、もう解決しているだろうけど・・・
16進数の 0FFH は2進数にすると 11111111B で
10進数にすると 255 というふうに突っ込んではダメ?
24デフォルトの名無しさん:2011/05/18(水) 23:01:57.31
その通りです。
あってます。
25デフォルトの名無しさん
あってたか