teacup. [ 掲示板 ] [ 掲示板作成 ] [ 有料掲示板 ] [ ブログ ]

 <思いやりのあるコミュニティ宣言>
 teacup.掲示板は、皆様の権利を守りながら、思いやり、温かみのあるコミュニティづくりを応援します。
 いつもご協力いただきありがとうございます。

 投稿者
  題名
  内容 入力補助画像・ファイル<IMG>タグが利用可能です。(詳細)
    
 URL
[ ケータイで使う ] [ BBSティッカー ] [ 書込み通知 ] [ 検索 ]

スレッド一覧

  1. 足あと帳(0)
スレッド一覧(全1)  他のスレッドを探す 

*掲示板をお持ちでない方へ、まずは掲示板を作成しましょう。無料掲示板作成


Re: sinの振幅によってLED点灯

 投稿者:ケンケン  投稿日:2020年 7月15日(水)02時05分40秒 NE0356lan33.rev.em-net.ne.jp
返信・引用
  > No.860[元記事へ]

こーたろー様

・LCD表示だけのプログラムでは正常に表示されますか?
・何度も書いているようにforループの中にウェイトが入っていません。
 LCDへの出力が正しくできていたとしても、ものすごい速度で書き換えられて読むことは
 できないでしょう。
・かっこ閉じるが一つ足りないようです。ビルドは通ったのでしょうか?
 
 

Re: sinの振幅によってLED点灯

 投稿者:こーたろー  投稿日:2020年 7月13日(月)16時12分33秒 softbank126147189077.bbtec.net
返信・引用 編集済
  ケンケン様
丁寧にご返信いただきありがとうございます。

試しにiとsinをLCDに表示させたところうまく表示できませんでした。

このことからwhile文がループしていませんでした。

しかし、なぜループしていないのかわかりませんでした。




[code]
#include "mcc_generated_files/system.h"
#include "mcc_generated_files/charlcd.h"
#include"mcc_generated_files/led_d3.h"
#include"mcc_generated_files/led_d4.h"
#include"mcc_generated_files/led_d5.h"
#include"mcc_generated_files/led_d6.h"
#include"mcc_generated_files/led_d7.h"
#include"mcc_generated_files/led_d8.h"
#include"mcc_generated_files/led_d9.h"
#include<math.h>

#define N(99)

/*
                         Main application
*/
int main(void)
{ uint8_t i=0;
double ra,a[N+1],pi,t;
pi=4*atan(1.0);
/*for(i=0;i<=N;i++){
    t=0.01666666*i/((double)N+1);
    ra=120*pi,t;
    a[i]=sin(ra);
}*/
    // initialize the device
    SYSTEM_Initialize();
    CHARLCD_Initialize();

    while (1)
    {for(i=0;i<=N;i++){

        if(0.8<a[i]&&a[i]<=1.0) LED_D3_On();
        else LED_D3_Off();
        if(0.6<a[i]&&a[i]<=0.8)LED_D4_On();
        else LED_D4_Off();
        if(0.4<a[i]&&a[i]<=0.6)LED_D5_On();
        else LED_D5_Off();
        if(-0.4<a[i]&&a[i]<=0.4)LED_D6_On();
        else LED_D6_Off();
        if(-0.4<a[i]&&a[i]<=-0.6)LED_D7_On();
        else LED_D7_Off();
        if(-0.6<a[i]&&a[i]<=-0.8)LED_D8_On();
        else LED_D8_Off();
        if(-0.8<a[i]&&a[i]<=-1.0)LED_D9_On();
        else LED_D9_Off();

        printf("i=%4d   sin(ra)=%5.4lf\r"i,a[i]);





   /* }*/

        // Add your application code

    }

    return 1;
}
/**
End of File
*/


[/code]



 

Re: sinの振幅によってLED点灯

 投稿者:ケンケン  投稿日:2020年 7月12日(日)23時36分15秒 NE0356lan33.rev.em-net.ne.jp
返信・引用
  こーたろー様

60Hzで、1周期を100分割するということは、6000分の1秒ごとに出力を更新するということです。
そのためには、出力変更後に6000分の1秒のウェイトをおいて繰り返すか、6000分の1秒ごとに
割り込みを発生させて割り込み内で出力変更するかになります。

ところで、60分の1秒周期というとかなり短くて、肉眼では認識できないと思いますが高速な
カメラで撮影なのですかね。

下記にヒントを載せておきます。

#define N 100
double a[N]


メインルーチン内

for(i=0;i<N;i++){
    a[i]=sin(3.14159*2*(double)i/N);
}

while(1){
    for(i=0;i<N;i++){
        if(0.7<=a[i] && a[i]<=1.0) LED_D3_On();
        else LED_D3_Off();
        if(0.4<=a[i] && a[i]<0.7) LED_D4_On();
        else LED_D4_Off();
        if(0.1<=a[i] && a[i]<0.4) LED_D5_On();
        else LED_D5_Off();
        if(-0.1<=a[i] && a[i]<0.1) LED_D6_On();
        else LED_D6_Off();
        if(-0.4<=a[i] && a[i]<-0.1) LED_D7_On();
        else LED_D7_Off();
        if(-0.7<=a[i] && a[i]<-0.4) LED_D8_On();
        else LED_D8_Off();
        if(-1.0<=a[i] && a[i]<-0.7) LED_D9_On();
        else LED_D9_Off();

//    ここに約1/6000秒のウェイトを入れる


    }

}
 

Re: sinの振幅によってLED点灯

 投稿者:こーたろー  投稿日:2020年 7月12日(日)11時31分15秒 softbank126243071093.bbtec.net
返信・引用 編集済
  ケンケン様
お返事ありがとうございます。

高速にループされてしまうということですが、そうなると、sinの周期を60Hzにしている意味はなくなるということですよね?

できればtを実際の時間の秒カウントにできれば、60Hzが実現するのかなとかんがえております。

修正方法などありましたらよろしくお願いします。
 

Re: sinの振幅によってLED点灯

 投稿者:ケンケン  投稿日:2020年 7月11日(土)22時45分41秒 NE0356lan33.rev.em-net.ne.jp
返信・引用
  > No.856[元記事へ]

こーたろー様

でも、やりたいことから想像すると、こういうことですかね。

c[i]=sin((double)i*pi*2/(N+1));


a[i],b[i]は計算不要です。
 

Re: sinの振幅によってLED点灯

 投稿者:ケンケン  投稿日:2020年 7月11日(土)22時37分0秒 NE0356lan33.rev.em-net.ne.jp
返信・引用
  > No.855[元記事へ]

こーたろー様

あ、すみません、こっちが正解ですね。

t=0.01666666*(double)i/(N+1);
 

Re: sinの振幅によってLED点灯

 投稿者:ケンケン  投稿日:2020年 7月11日(土)22時32分19秒 NE0356lan33.rev.em-net.ne.jp
返信・引用
  > No.854[元記事へ]

こーたろー様

ここが問題ですね。

t=0.01666666*i/((double N)+1);

正しくは下記のようになります。

t=0.01666666*i/((double)N+1);


例えば1000回の空ループとはこういうことです。
何もしないループです。時間稼ぎです。

for(int j=0;j<1000;j++) ;
 

Re: sinの振幅によってLED点灯

 投稿者:こーたろー  投稿日:2020年 7月11日(土)22時15分11秒 softbank126243065055.bbtec.net
返信・引用
  ケンケン様
返信ありがとうございます。
出ているエラーがこちらです。
なにか修正がありましたらお願いします。
[error]
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'C:/Users/yuuta/Desktop/MPLAB/situmonn.X'
make  -f nbproject/Makefile-default.mk dist/default/production/situmonn.X.production.hex
make[2]: Entering directory 'C:/Users/yuuta/Desktop/MPLAB/situmonn.X'
"C:\Program Files\Microchip\xc16\v1.50\bin\xc16-gcc.exe"   main.c  -o build/default/production/main.o  -c -mcpu=24FJ1024GB610  -MMD -MF "build/default/production/main.o.d"      -mno-eds-warn  -g -omf=elf -DXPRJ_default=default  -legacy-libc    -O0 -msmart-io=1 -Wall -msfr-warn=off    -mdfp="C:/Program Files (x86)/Microchip/MPLABX/v5.40/packs/Microchip/PIC24F-GA-GB_DFP/1.3.109/xc16"
nbproject/Makefile-default.mk:205: recipe for target 'build/default/production/main.o' failed
make[2]: Leaving directory 'C:/Users/yuuta/Desktop/MPLAB/situmonn.X'
nbproject/Makefile-default.mk:91: recipe for target '.build-conf' failed
make[1]: Leaving directory 'C:/Users/yuuta/Desktop/MPLAB/situmonn.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
main.c: In function 'main':
main.c:68:26: error: expected ')' before numeric constant
make[2]: *** [build/default/production/main.o] Error 255
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

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

[/error]

プログラミング初心者でまだあまり理解が深まっておりませんが、数千回程度の
 カウンタで空ループをどのように作ればよいですか?
 

Re: sinの振幅によってLED点灯

 投稿者:ケンケン  投稿日:2020年 7月11日(土)21時43分59秒 NE0356lan33.rev.em-net.ne.jp
返信・引用
  > No.852[元記事へ]

こーたろー様


MCCはほとんど使ったことがないので、なぜビルドできないのかは私にもわかりませんが、
プログラムを見て気付いたことを上げておきます。

・配列a,b,cを作っていますが、実際に配列として有効に使われているのはcだけのようです。
 a,bは配列にする必要はありませんね。

・whileループの中にウェイトがありません。これでは高速にループされるので、全てのLEDが
 同時に点灯して見えるでしょう。
 ウェイトの作り方はいろいろありますが、まずは単純に何も動作させない数千回程度の
 カウンタで空ループを回せばよいと思います。
 

sinの振幅によってLED点灯

 投稿者:こーたろー  投稿日:2020年 7月10日(金)00時00分0秒 softbank126243089021.bbtec.net
返信・引用
  [問題点]SINの振幅値によってLEDを点灯させたいです。0.8<sinωt<1.0ならLED3を点灯、0.6<sinωt<0.8ならLED4を点灯、以後刻みを0.6~0.4、0.4~-0.4、-0.4~-0.6,-0.6~-0.8、-0.8~-1.0,とする。
また計算に時間がかかり本来の処理が遅れることが問題なので計算速度はできるだけはやくしたいです。

以下のプログラムを組んでみましたがうまくビルドされませんでした。加筆修正願います。特にint main (void)以下をお願いします。ちなみにMCCを用いておりますので#より上は自動でプログラムされております。水晶発振器は3MHzに設定しております。
よろしくお願いします。

PIC24FJ1024GB610を用いております。








[code]
#include "mcc_generated_files/system.h"
#include "mcc_generated_files/led_d3.h"
#include "mcc_generated_files/led_d4.h"
#include "mcc_generated_files/led_d5.h"
#include "mcc_generated_files/led_d6.h"
#include "mcc_generated_files/led_d7.h"
#include "mcc_generated_files/led_d8.h"
#include "mcc_generated_files/led_d9.h"
#include "mcc_generated_files/charlcd.h"

#include<math.h>
#define N (99)
/*
Main application
*/
int main(void)
{ uint8_t i=0;
double a[N+1],b[N+1],c[N+1],pi,t;
pi=4*atan(1.0);
for(i=0;i<=N;i++){
t=0.01666666*i/((double N)+1);
a[i]=t;
b[i]=120*pi*t;
c[i]=sin(b[i]);
}

while (1)
{
for(i=0;i<=N;i++){
if(0.8<=c[i]&&c[i]<1.0) LED_D3_On();
else LED_D3_Off();
if(0.6<=c[i]&&c[i]<0.8) LED_D4_On();
else LED_D4_Off();
if(0.4<=c[i]&&c[i]<0.8) LED_D5_On();
else LED_D5_Off();
if(-0.4<=c[i]&&c[i]<0.4) LED_D6_On();
else LED_D6_Off();
if(-0.6<=c[i]&&c[i]<-0.4) LED_D7_On();
else LED_D7_Off();
if(-0.8<=c[i]&&c[i]<-0.6) LED_D8_On();
else LED_D8_Off();
if(-1.0<=c[i]&&c[i]<-0.8) LED_D9_On();
else LED_D9_Off();
}

// Add your application code

}

return 1;
}
/**
End of File
*/


[/code]







[code]
#include "mcc_generated_files/system.h"
#include "mcc_generated_files/led_d3.h"
#include "mcc_generated_files/led_d4.h"
#include "mcc_generated_files/led_d5.h"
#include "mcc_generated_files/led_d6.h"
#include "mcc_generated_files/led_d7.h"
#include "mcc_generated_files/led_d8.h"
#include "mcc_generated_files/led_d9.h"
#include "mcc_generated_files/charlcd.h"

#include<math.h>
#define N (99)
/*
Main application
*/
int main(void)
{ uint8_t i=0;
double a[N+1],b[N+1],c[N+1],pi,t;
pi=4*atan(1.0);
for(i=0;i<=N;i++){
t=0.01666666*i/((double N)+1);
a[i]=t;
b[i]=120*pi*t;
c[i]=sin(b[i]);
}

while (1)
{
for(i=0;i<=N;i++){
if(0.8<=c[i]&&c[i]<1.0) LED_D3_On();
else LED_D3_Off();
if(0.6<=c[i]&&c[i]<0.8) LED_D4_On();
else LED_D4_Off();
if(0.4<=c[i]&&c[i]<0.8) LED_D5_On();
else LED_D5_Off();
if(-0.4<=c[i]&&c[i]<0.4) LED_D6_On();
else LED_D6_Off();
if(-0.6<=c[i]&&c[i]<-0.4) LED_D7_On();
else LED_D7_Off();
if(-0.8<=c[i]&&c[i]<-0.6) LED_D8_On();
else LED_D8_Off();
if(-1.0<=c[i]&&c[i]<-0.8) LED_D9_On();
else LED_D9_Off();
}

// Add your application code

}

return 1;
}
/**
End of File
*/


[/code]
 

レンタル掲示板
/83