• ベストアンサー

組み込みアカデミー LEDを1個点灯のはずが2個点灯してしまいます

組み込みアカデミー第1回 LEDを1個点灯のはずが2個点灯してしまいます。 対象は付録の「NE-R8C/25」です。動作確認プログラムのslos.hwsを実行するとLED1と2が交互・同時点灯を繰り返し、正常に動作しています。 ところが以下のプログラムをC:\WorkSpace\step01\step01\step01.a30として実行してもLEDが2個点灯してしまいます。 プログラム中 LED1点灯のところがMOV.B #11111110b,p2でもLED1と2同時に点灯してしまいます。 指定されたsfr_r825.incファイルはc:\WorkSpase\STEP01\STEP01以下にコピーしています。 .INCLUDE sfr_r825.inc ;SFR定義ファイルのインクルード .SECTION PROGRAM,CODE ;コードセクション .ORG 0009000h Start: MOV.B #11111111b,pd2 ;入出力ポートP2を出力ポートに設定 BCLR p2_0      ;LED1点灯  BSET p2_1      ;LED2消灯 Loop: JMP Loop .SECTION FIXVECTOR,ROMDATA .ORG 0FFFCh Reset: .LWORD Start|0FF000000h .END

質問者が選んだベストアンサー

  • ベストアンサー
  • ricardo_
  • ベストアンサー率19% (14/72)
回答No.2

 ポートの設定を全て入力にしてみましょう。  LEDが消灯しなければ、このプログラム自体が走っていないと判断できます。  モニタか何か他のプログラムで出力に設定したのであり、あなたのプログラムで出力にしたのではないと判断出来る訳です。 >MOV.B #11111111b,pd2 ;入出力ポートP2を出力ポートに設定

shimo1947
質問者

お礼

アドバイスどおりポートの設定を入力にして、以後の命令はコメントにしてデバッグ→リセットして実行 をするとLEDは2個点灯しました。 おっしゃるとおりモニタか何かのプログラムで出力に設定されたとおもいます。 デバッグ→CPUのリセットをクリックしたらLEDは消灯します。 まだ原因がつかめません。 .INCLUDE sfr_r825.inc ;SFR定義ファイルのインクルード .SECTION PROGRAM,CODE ;コードセクション .ORG 0009000h Start: MOV.B #00000000b,pd2 ;ポートを入力に設定 ;MOV.B #11111111b,pd2 ;入出力ポートP2を出力ポートに設定 ;BCLR p2_0 ;LED1点灯 ;BSET p2_1 ;LED1消灯 Loop: JMP Loop .SECTION FIXVECTOR,ROMDATA .ORG 0FFFCh Reset: .LWORD Start|0FF000000h .END

shimo1947
質問者

補足

ricardo_さんへ アドバイスどおりでした。 プログラムを消してルネサスの「High-performance Embedded Workshop」の「新規プロジェクトワークスペースの作成」からやり直しました。 原因はプロジェクトタイプがApplicationになっていたからでした。EmptyApplicationで作成し、ポートの設定を全て入力にしてみるとLEDが消灯しました!!次にLED1点灯プログラムを実行すると正常に動作しました。ありがとうございます。ROBO-ONEに興味を持ちC言語からはじめようとこのキットを入手しました。 教えてgooも初めて利用して補足とお礼の順番も逆で申し訳ありません。

その他の回答 (1)

  • kuro804
  • ベストアンサー率29% (523/1762)
回答No.1

通りすがりで基板の内容も、それに関する記事の内容も知りませんが デバッグモードで走らせることが出来るなら BSET p2_1 まで走らせて停止させた時点で LED2 は消灯してるのでしょうか? 要は、ステップ動作で正常に働いて、連続(通常RUNモード)でLED2が消灯しないのであれば、仕様書のどこかにI/oポートアクセスに関する注意事項があるのではないでしょうか? たまにあるのが 同一ポートのビット操作を連続して行う場合は間に遅延の為にNOP命令を挿入する 等がありますね! がんばって下さい。

shimo1947
質問者

お礼

Kuro804さんへ プログラムを消してルネサスの「High-performance Embedded Workshop」の「新規プロジェクトワークスペースの作成」からやり直しました。 原因はプロジェクトタイプがApplicationになっていたからでした。EmptyApplicationで作成し、ポートの設定を全て入力にしてみるとLEDが消灯しました!!次にLED1点灯プログラムを実行すると正常に動作しました。ありがとうございます。

shimo1947
質問者

補足

デバッグ→ステップ と言うコマンドがありました。Loopの行が9ステップなのでそこまで走らせたらLEDは2個ついていました。 NOPもいれてみましたが状況は変わりません。 .INCLUDE sfr_r825.inc ;SFR定義ファイルのインクルード .SECTION PROGRAM,CODE ;コードセクション .ORG 0009000h Start: ;MOV.B #00000000b,pd2 入出力ポートP2を入力ポートに設定 MOV.B #11111111b,pd2 ;入出力ポートP2を出力ポートに設定 BCLR p2_0 ;LED1点灯 NOP BSET p2_1 ;LED1消灯 Loop: JMP Loop .SECTION FIXVECTOR,ROMDATA .ORG 0FFFCh Reset: .LWORD Start|0FF000000h .END

関連するQ&A

  • マイコンキットで学ぶ/組み込みシステム入門

    【対象】 日経エレクトロニクス(2007.6.30発行) 16ビット・マイコン搭載ボード付き(組み込み速修キット) エミュレータ一体型 http://techon.nikkeibp.co.jp/embedded/academy/thats1.html http://techon.nikkeibp.co.jp/embedded/academy/guide1.pdf#search='NE... <マイコン> R5F21256SNFP <エミュレータチップ> HD64F2215U(H8Sファミリ/2215グループ) (このマイコンに特殊プログラムをインストールしてエミュレータ機能をもたせているのか?) <パソコンOS> Windows7(32bit版) Sw1(p1_7) Sw2(p1_3) LED1(p2_0) LED2(p2_1) 始めまして。アセンブリの学習を始めた初心者です。 皆さんに質問です。 現在「Sw1を押した時LED1が90%で点灯かつSw2を押した時LED2が80%で点灯する事」を課題として行っています。   私が入力した命令 .INCLUDE sfr_r825.inc .SECTION PROGRAM,CODE .ORG 0009000h Start: MOV.B #01110111b, pd1   p1_7、p1_3を入力ポートに設定 MOV.B #0FFh, pd2     p2_0,p2_1を出力ポートに設定 MOV.B #0FFh, p2      LED1,LED2消灯 Loop: BTST p1_7      Sw1がOnならZフラグに1、OFFなら0 JZ Sw1_On    Zフラグが1ならSw1_Onへ BTST p1_3      Sw2がOnならZフラグに1、OFFなら0 JZ Sw2_On    Zフラグが1ならSw2_Onへ JMP Loop Sw1_On: BCLR p2_0          LED1点灯 JSR Wait_LedOn01     BSET p2_0          LED消灯 JSR Wait_LedOff01 JMP Loop Sw2_On: BCLR p2_1           LED2点灯 JSR Wait_LedOn02 BSET p2_1           LED2消灯 JSR Wait_LedOff02 JMP Loop Wait_LedOn01: MOV.W #198,R0 WaitSub_LedOn01: SBJNZ.W #1,R0,WaitSub_LedOn01 RTS Wait_LedOff01: MOV.W #22,R0 WaitSub_LedOn02: SBJNZ.W #1,R0,WaitSub_LedOn02 RTS Wait_LedOn02: MOV.W #176,R0 WaitSub_LedOn03: SBJNZ.W #1,R0,WaitSub_LedOn03 RTS Wait_LedOff02: MOV.W #44,R0 WaitSub_LedOn04: SBJNZ.W #1,R0,WaitSub_LedOn04 RTS .SECTION FIXVECTOR,ROMDATA .ORG 0FFFCh Reset: .LWORD Start|0FF000000h .END という入力をしました。 しかし、Sw1,Sw2を同時に押した際、LED1のみの点灯となってしまいます。 試行錯誤で今まで行ってきましたが、現在止まってしまっております。 解決策など教えていただければと考えております。 回答の方、宜しくお願いいたします。

  • 8×8ドットマトリクスLED表示について

    ForCy-USBのプログラミング http://www.recursion.jp/product/forcyusb/manual.pdf ForCy-USBを使って8×8のドットマトリクスLEDを一つ一つ点灯させたいのですがやり方が分かりません。(64個のLEDを任意に点灯)サイトの情報ではほとんどがc言語のプログラムなので質問させていただきました。 0xff 0x24 =sfr// ポートB を出力 0x0f 0x27 =sfr// ポートC 下位4bit を出力 0xfa 0x2a =sfr// ポートD 上位4bit を出力 :init ;scan [8]led 0 0x25 =sfr scan ++ 7 & =scan 1 scan << ~ dup 0x28 =sfr 0xf0 & 0x2b =sfr scan led 0x25 =sfr @c :main ↑(このようなプログラミングです) 例えば、斜め線を作るプログラムを作成していただけませんか。 ○○○○○○○● ○○○○○○●○ ○○○○○●○○ ○○○○●○○○ ○○○●○○○○ ○○●○○○○○ ○●○○○○○○ ●○○○○○○○ ____________________________________________ 0xff 0x24 =sfr // DDRB 0x0f 0x27 =sfr // DDRC 0xfa 0x2a =sfr // DDRD :ポート設定 ;行 [8]内容 0 0x25 =sfr // いったん消灯 行 ++ 7 & =行 // 表示行を巡回移動 1 行 << ~ // 対応する行のビットを0 dup 0x0f & 0x30 | 0x28 =sfr // SW1,2 はプルアップ 0xf0 & 0x2b =sfr 行 内容 0x25 =sfr // その行の内容表示 :走査 8 0 { dup 内容 ~ over =内容 ++ } for .. :反転 ポート設定 0 =行 8 0 { 0xff over << over =内容 ++ } for .. { 走査 反転 } interrupt @c . :LED表示 上記サイトの25Pをみてやっています

  • PIC 8このLEDの点灯 左から右 右から左

    ↓のコードで 8つのLEDを右から左に一つずつ順番に点灯したあと左から右に順番に点灯させるプログラムをつくりたい そして下のコードに ~~~~ここに1行~~~~と書いているところがあります。 そこになにか一行書くとできるらしいのです。 でもどうやってもできません。 loop1: btfsc PORT_A,1 goto loop1 多分、↑に書いたコードの箇所がずっと無限に回ってるからだとおもいます。 この↓のコードで~~~~ここに1行~~~~の場所に本当になにか一つつけくわえるだけでできるのであれば教えてほしいです。 また、この問題が間違ってるというのであればどこが間違っているかを教えてほしいです。 少しだけならコードをかきかえても大丈夫だそうです。 わかるかたもしいましたら、おねがいします。 INDF EQU 0x00 TMR0 EQU 0x01 PCL EQU 0x02 STATUS EQU 0x03 FSR EQU 0x04 TRIS_A EQU 0x05 TRIS_B EQU 0x06 TRIS_C EQU 0x07 PORT_A EQU 0x08 PORT_B EQU 0x09 PORT_C EQU 0x0A org 0x00 ;ここから↓ MOVLW 0x3F MOVWF TRIS_A CLRW MOVWF TRIS_B MOVWF TRIS_C MOVWF PORT_B MOVWF PORT_C loop1: btfsc PORT_A,1 goto loop1 ~~~~ここに1行~~~~ loop2: btfss PORT_A,0 goto  loop2 goto loop1 -----------------------------------------

  • PIC16f88でLEDの点灯をしたいのですが、

    PIC16f88でLEDの点灯をしたいのですが、 9番ピン(RB3)だけLEDが点灯しません。 #include<htc.h> __CONFIG(UNPROTECT & DEBUGEN & MCLRDIS & PWRTEN & WDTDIS & HS); void main() { PORTB = 0xff; TRISB = 0x00; } 上記のプログラムでBポートをすべて出力にしてLEDを光らせているつもりです。 書き込みを行い試してみたところ、6,7,8番は点灯してくれました。 いろいろと調べてみたのですが、PWM設定(CCP1)と関係があるのでしょうか? また何かしらの設定が必要でしたら、教えていただけると助かります。

  • アセンブラのタイマー割り込み

    ちょと長いですがプログラムおいときます 下のプログラムでは割り込みをスイッチで行うのですが スイッチを使わない割り込みをするにはタイマーがいいのではと聞きましたが 私にはわからなかったので教えていただきたいです どこをどう変えたら起動できるでしょうか? 使っているものはマイコン(R8C15)です 内容とか足らないのかもしれませんが何でも言ってください すみませんがよろしくお願いします .INCLUDE sfr_r815.inc ;プログラム部分 .SECTION PROGRAM, CODE .ORG 0D000h Start: LDC #0500h, isp LDINTB #VarVector JSR SetClock20MHz JSR InitPort JSR InitKeyInputIntr MOV.B Dummy, r0h FSET i Loop: BCLR p1_1 JSR Wait2s BSET p1_1 JSR Wait2s JMP Loop ;外部クロックに切り替えるサブルーチン SetClock20MHz: BSET prc0 BSET cm13 BSET cm15 BCLR cm05 BCLR cm16 BCLR cm17 BCLR cm06 NOP NOP NOP NOP BCLR ocd2 BCLR prc0 RTS ;ポートの初期化を行なうサブルーチン InitPort: MOV.B #00000110b,drr MOV.B #00000110b,p1 MOV.B #00000110b,pd1 RTS ;キー入力割り込みの初期化を行なうサブルーチン InitKeyInputIntr: BCLR ki0pl BSET ki0en MOV.B #01h, kupic RTS ;2秒待ちサブルーチン Wait2s: MOV.W #200, r1 Wait2s_1: JSR Wait10ms SBJNZ.W #1, r1, Wait2s_1 RTS ;10m秒待ちサブルーチン Wait10ms: PUSH.W r0 MOV.W #28571,r0 Wait10ms_1: SBJNZ.W #1,r0,Wait10ms_1 POP.W r0 RTS ;キー入力割り込み処理ルーチン KeyInput: Start1: MOV.B #10001001b,pd1 MOV.B #00000000b,p1 MOV.B #10111000b,pd3 MOV.B #00000000b,p3 Syoki01: MOV.W #2,r1 BSET p1_3 ;M BCLR p3_3 ;SDI Loop1: MOV.W #2,a1 GYOU: MOV.W #9,a0 CP00: BSET p3_4 ;CP=H BCLR p3_5 JSR wait1 BCLR p3_4 ;CP=L JSR wait1 BSET p3_4 ;CP=H BCLR p3_5 JSR wait1 BCLR p3_4 ;CP=L JSR wait1 SBJNZ.W #1,r1,CP00 BNOT p3_3 ;SDI MOV.W #2,r1 SBJNZ.W #1,a0,CP00 LOAD0: BSET p3_4 ;CP=H ;BSET p3_5 ;LOAD JSR wait1 BCLR p3_4 ;CP=L BCLR p1_0 ;DIO BSET p3_5 ;LOAD JSR wait1 BNOT p3_3 ;SDI SBJNZ.W #1,a1,GYOU MandDIO: BSET p1_0 ;DIO BNOT p1_3 ;M JMP Loop1 wait1: MOV.W #30,r2 wait001: SBJNZ.W #1,r2,wait001 RTS REIT ;その他の割り込み処理ルーチン NOTUSE: REIT ;データ(作業領域)部分 .SECTION WORK,DATA .ORG 0400h Dummy: .BLKB 1 ;可変ベクタテーブル .section VARIABLEVECTOR, ROMDATA .org 0F000h VarVector: .lword NOTUSE .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword KeyInput .lword NOTUSE .lword NOTUSE .lword NOTUSE .lword NOTUSE .lword NOTUSE ;リセットベクタ部分 .SECTION FIXVECTOR, ROMDATA .ORG 0FFFCh Reset: .LWORD Start | 0FF000000h .END

  • CCSコンパイラにてLED点灯プログラムが作成したい

    タイトルにもあるようにCCSコンパイラにてLED点灯プログラムを作成したいのですが、プログラムが上手く組めません。 ハードウェアとしては、PORT_A0にスイッチを接続。 PORT_B0にLEDを接続。 PICは16F873を使用。 動作は、電源を入れた状態でLEDは消灯している状態。 スイッチを1度押すとLEDは点灯(スイッチはモメンタリーを使用) スイッチを離してもLEDは点灯したまま。 もう一度スイッチを押すとLEDは消灯。 これらの動作を繰り返すプログラムを割り込みを使用せずに作成したいのですが、上手くできません。 void main() 以降の{}の中がわかりませんので、 もし宜しければ、教えてください。 #include <16f873.h> #ZERO_RAM #define setup_adc_ports(NO_ANALOG) #use delay(clock = 20000000) void main() { }

  • H8-3048 LED点灯プログラムについて

    初歩的な質問で申し訳ございません。 H8-3048でスイッチ入力によってLEDを点灯させたいのですが、 スイッチの押されたタイミングによって LEDの点灯状況が変化してしまいます。 何故でしょうか?回路側の問題?ご助言お待ちしています。 参考までに下にLED点灯ソースコードを示します。 #include <3048f.h> #define led P1.DR.BYTE /*P1.DR.BYTEをledに割り当て*/ #define sw1 PA.DR.BIT.B2 #define sw2 PA.DR.BIT.B3 void initport(void) /*入出力端子設定*/ { P1.DDR = 0xff; PA.DDR = 0x00; } int main( void ){ initport(); led = 0x00; /*初期値設定*/ while(1){ if( sw1 == 1 ){ /*sw1が押された時LED点灯*/ led = 0xff;} else if( sw2 == 1 ){ /*sw2が押された時LED消灯*/ led = 0x00;} else{ led;} /*それ以外はLEDの状態保持*/ } }

  • 【ルネサスのマイコン】E8aからR8C35Aへのコンパイル、書き込み

    初心者です。E8aからR8C35Aへのコンパイル、書き込みができず困っております。 簡単なプログラミングでまずはLEDを点灯させてみたいのですが、HEW4でのコンパイルでエラーが出てしまいます。 sfr_r835a.hをincludeして、かつ、HEW4上のheader fileにも追加しているのに、「P1-1」が使えない理由が分かりません。。。 どなたがご教授頂けませんでしょうか?よろしくお願いいたします。 <エラー内容> [Error(ccom)] unknown variable P1_1 <C source file> #include "sfr_r835a.h" void main(void) { P1_1=0; while(1); } <参考にしたHP> http://goda.blog3.fc2.com/blog-entry-195.html

  • pi18でLEDを点灯するプログラム教えてください

    プログラムはC言語 ソフトはMPLAB IDEv8.60 コンパイラはMPLAB ICD2です。 picはpic18f2550です。 回路は OSCにセラロック RB7とRB6に抵抗とLED が接続されています。 この条件でLEDを点滅させる簡単なプログラムを教えてください。 本やネットで調べ、取り上げられているプログラムを見ていろいろ試したのですがLEDが光りません。 私ではどうしようもないので、よろしくお願いします。 #include <p18f2550.h> void main (void) { }

  • アセンブラの練習で困ってます

    下記のようなアセンブラのプログラムの勉強をしています。初心者。 (ベクターテーブルとかは省略してます) この状態であれば、tablに書いたデータどおりにLEDが順番に点灯します。 しかしtablの内容を書き換えると、点灯しなくなります。命令語の意味を 調べたりしたのですが、わかりません。どなたか理由を教えてください。 (例えば) 10000000 01000000 00100000 00010000 10000000 01000000 00100000 ・・・・ プログラム抜粋 reset: mov.l #stack,sp bsr initio begin: mov.l #tabl,er1 ; 点灯データ表 mov.w #14,r2 ; 点灯データ表のデータ数 loop: mov.b @er1+,r0l not.b r0l mov.b r0l,@p1dr bsr wait dec.w #1,r2 bne loop bra begin ; tabl: .data.b b'10000000 .data.b b'01000000 .data.b b'00100000 .data.b b'00010000 .data.b b'00001000 .data.b b'00000100 .data.b b'00000010 .data.b b'00000001 .data.b b'00000010 .data.b b'00000100 .data.b b'00001000 .data.b b'00010000 .data.b b'00100000 .data.b b'01000000 ; initio: mov.b #h'ff,r0l ; ポート1を出力に設定 mov.b r0l,@p1ddr rts ; wait: mov.l er0,@-sp mov.l #h'100000,er0 wait1: nop dec.l #1,er0 bne wait1 mov.l @sp+,er0 rts

専門家に質問してみよう