2012年1月21日土曜日

STM8SのADCの扱いのミスを修正しました

STM8S技術解説サイトのご報告です.

STM8SにはADCが載っています.このADCは、シリアル的に変換するものようで、サンプルデータを得るまでに14clockを要します.

そのclock周波数は、なぜか知りませんけど、1~4MHzにしてねと、電気特性で制限されているってことを読者氏からの指摘で知りました.電気的特性なんかいちいち読まないんだオレw.   >  サンクス! 読者氏

しかしなー、clockの上限はまだしも下限があるっていうのは解せぬ.S/Hコンデンサの電荷が持たないからかしら?

で、STM8SサイトのADCに関する記事と、サンプルプログラムを修正してupしました.

以上.


=== STMのアフィリエイト始めました ===
STM32のwelcome-kitです.試用レポはいずれ...
 

19 件のコメント:

  1. こんばんは
    修正済みのデータをダウンロードさせて頂きました。
    早速ビルドしてみますと 7エラーとなってしまいましたが、
    修正して行きながらエラー無しに漕ぎ着けたいと思っています。

    前にも扱いたかと思いますがパソコンの調子が悪く「ST-Link」
    接続を確立できません。
    上手く、「USB大容量記憶デバイス STM32 STLink」と
    の「ST32」ディスクドライブを認識できましても
    マイコンピュータではドライブが見えない状態で、
    USBを抜きましてもデバイスドライバを認識したままになっています。

    この不具合はPCを交換する予定なんですが、HDDの価格が下がらないので、未だ入れ替えが進んでいません。

    少し手間が掛かりますが、
    変わりに別のノートPCで書き込みなどをする予定で居りまして、
    特には支障なく進められそうです。

    それでは宜しくお願いします。

    返信削除
  2. こんにちは
    何とかノーエラーで出来るようになりました。
    http://den-nekonoko.blog.so-net.ne.jp/2012-01-24
    他の場所にホルダパスを移しても上手く行く場合と駄目な場合があります。
    今までは戴いた分でのビルドでしたが、これからは自分で組んで行かなくてはなりません。

    判らない所などまた教えて下さい。

    返信削除
  3. おめでとうございます.stm8s_conf.hは、2つ指定したライブラリフォルダの.....Templateというの方に入っているんです.STMicroからダウンロードした状態でそうなっているので、そのフォルダ構造を温存しております.では.

    返信削除
  4. こんにちは
    >Templateというの方に入っているんです
    これは以前のファイルから「Template」を持ってきてそばに置いておけばいいのでしょうか、
    てっきり、incとプロジェクト指していると勘違いしていました。

    それと、105にない .c は消していますが 他のファイルで要るのだけ選別するようなことは出来ませんでしょうか?

    結果ファイル .hex だけを設定する歩にはどうすればよいでしょうか?
    (.o .st .AOF .CSEG .elf .MAP もついでに出来ています)

    返信削除
  5. ●まぁそういうことですが置くだけじゃダメで、重要な概念はTemplateもライブラリの一種ですからTemplateのフォルダパスをSTVDに指定してやらなくちゃいけないってことです.やりかたは先日のやりかたです.
    ●要るファイルだけ選別というのは、ソースコードを理解して、ああこれは不要だわって自身でわかるようになるしかないです.機械的に不要なファイルを消す機能はSTVDには備わってませんので.
    ●.hexだけを生成させて、.oなどのファイルの生成を止めることは永遠に不可能です.なぜなら.oなどは.hexを生成する源のファイルだからです.なので、自分で削除するのが唯一の対処法です.わたしのサンプルファイルは削除してあるんです.

    返信削除
  6. こんばんは

    パスの指定は incと ソースだと思っていたんですが両方とも インクルードパスだったんですね。
    Templateホルダを探してみたんですが、見つかりませんでした。
    >わたしのサンプルファイルは削除してあるんです
    ななんと、判っていたら少し楽が出来たんですが、SW探しをしてしまいました。

    無い場合は、見本のような位置にホルダを作り、stm8s_conf.hを入れておけばよいのでしょうか?
    (stm8s_conf.hのバージョン?、他にもファイルがある?)

    切り離した、ST-Link モジュールを別の基板にも接続できるように、工夫をしています。

    それでは有り難うございました。

    返信削除
  7. こんにちは 色んな事を知りました、
    RAISONANCE_を使って
    タイマー3ではなく
    ADCで割り込みをするには
    EOCIE=1にします(文法が判りません)
    void EOC(void) interrupt 22 // analog watch dog interrupt
    {割り込み処理内容 を使います。}

    1ch+2chのADCをするには

    (1ch)single mode + (2ch)continuous mode
    (3ch)continuous mode
    (3ch)bufferd comtinuous mode

    のどれが一番良いのでしょうか?

    1ch で乗算計数を 時々間引いて処取り込み
    2ch で、連続的に2点の検出端を測定し続けます。
    1巡で EOC により 読み込みと結果演算をします。
    このあと結果をトリガ条件としてONE SHOTを使ってGPIOを操作したいです。
    この場合は割り込みは使わず、演算結果で
    TIM1_CtrlPWMOutputs(ENABLE);//を使うのでしょうか?
    それでは宜しくお願いします。

    返信削除
  8. こんにちは
    本題と違う所から説明しますと、
    ディスクトップとノート(両方ともxp-sp2)では大部状況が違います。
    ディスクトップはドラ伊具や何日間か一杯付いた満艦飾でビルドは出来るがST-Linkが使えません。
    ノートはST-Linkが繋がり書けるのですが、c:\ドライブだけしかなくてでビルドが上手く行きません。
    追々ホルダーパスなどを整えて行くつもりです。

    本題は、ディスクトップで作った3chのADCを連続に回す、データは確認できないので、
    LEDの反転でアクセスレートを判断すると言うのをやりました。
    読み出しと計算を
    void EOC(void) interrupt 22 // End of conversion (EOC) interrupt
    で始めるように換えただけで、TIM3の設定や通信そのものは禁止していません。

    予定ではLEDは高速点滅で点きっぱなしになると思ったんですが、
    実際には遅い点滅のままです。

    タッチなどをさわってもレートは変わらないので、ファームは書き換わったと思うんですが、
    TIM3や通信も禁止(飛び越し)をしないといけないでしょうか?
    それでは宜しくお願いします。

    返信削除
  9. メールは届くのですが、当ブログに表示されないのでなんでだろうと思っていたら、勝手にスパムに分類されていました.いま、スパムを解除しました.
    ADC 3chのソースファイルを貼りつけてもらえますかね? なにかわかるかもしれません.

    返信削除
  10. こんばんは
    拙のページコメントで質問があったので調べていて、パスの構造について理解だ進みました。

    しかし実際にやってみるとまだ間違って居るみたいでした。

    main.c を
    den-nekonoko.blog.so-net.ne.jp/
    にUPしました。

    返信削除
  11. 以下のコードのように修正しまして、ADC割り込みでチカチカしているように思います.では.

    #include "stdio.h"
    #include "stdlib.h"
    #include "string.h"
    #include "stm8s.h"
    #include "usrlib-uart.h"

    #define fMASTER 4000000 // 4MHz

    char UARTstrTX[100];

    void main(void)
    {
    CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE);
    CLK_HSIPrescalerConfig( CLK_PRESCALER_HSIDIV4 ); // ADC=16/4=4MHz
    CLK_SYSCLKConfig( CLK_PRESCALER_CPUDIV1 ); // CPU=4MHz

    ADC1_DeInit();
    ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_2, ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE);
    ADC1_ScanModeCmd(ENABLE);
    ADC1_DataBufferCmd(ENABLE);
    ADC1_ITConfig(ADC1_IT_EOCIE, ENABLE);
    ADC1_StartConversion();

    GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_HIGH_FAST); // LED

    enableInterrupts();

    while(1){ } /*Main loop*/
    }

    int cnt=0;
    void Tim3Update(void) interrupt 22 // 0.1Sec interrupt
    {
    cnt++;
    if(cnt==10000)
    {
    GPIO_WriteReverse(GPIOD,GPIO_PIN_0); // LED flash
    cnt=0;
    }
    return;
    }

    #ifdef USE_FULL_ASSERT
    void assert_failed(uint8_t* file, uint32_t line)
    {
    while (1) { }
    }
    #endif

    返信削除
  12. こんにちは
    早速有り難うございます、試してみます。
    STVD の意図する ホルダ構造が判り掛けてきました。

    例えばホルダパスの内容は
    ホルダ区別名>大タイトル名>Project>JOB名>STVD>Raisonance>Debug
    と連続していて。

    um0834\stm8s-discovery_dev\Project\ADC\inc インクルードファイル
    um0834\stm8s-discovery_dev\Project\ADC\src main.cを含むソースファイル
    um0834\stm8s-discovery_dev\Project\ADC\EWSTM8 不明
    D:\_users\_stm8\um0834\stm8s-discovery_dev\Project\ADC\STVD プロジェクト実態 ADC.stw adc.stp 以下不明 adc.dep ADC.wed
    um0834\stm8s-discovery_dev\Project\ADC\STVD\Raisonance\Debug 生成ターゲット

    **.c の /* Includes に何を使うかが書いてあると思うんですが、解明が進んでいません。

    また最初からニュープロジェクトを組み立てるとき、どの様に操作するのか良く判っていません。
    画面には 
    Source files *.c
    Include Files *.h
    External Dependencies *.h
    と言う順序で示され、コンパイルが早く済みます。
    それでは有り難うございました。

    返信削除
  13. こんばんは
    www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm8s-discovery_dev.zip
    um0834に解凍され中にADCが有り9chを読みながらEOCで4個のLEDを点けるようになっています。
    これだとコンパイルが早いです。

    9chを2chに変更してもエラーは出ないのですが、ソースを読んでも9chのシングルだというのが判りません。これなどの見方はご存じでしょうか?
    0~2chに変更したいと目論んでいます。

    返信削除
  14. 言い訳・・教えて貰いながら別のことをしていつ様に思われますが、
    必要なファイル類も集めて何度もやってみたのですが何故かエラーになってしまいます。

    それで目的は違うがエラーにならないソースADCと比較をしてしまいました。

    これらを比べてもEOC割り込みの条件や連続モードの設定の書き方のバリエーションが違っていて、比較できず、かえってこんがらがってしまいました。

    ADCの説明書を見ると連続モードでも0から始めなければならないように書いて無いと思うんですが、実際にはどの様に書くのかが示竣されておりません。
    AN2658 Figure 5. ADC1 operating modes 左上から2番目 Single channel Continuous and Buffered conversion です。

    返信削除
  15. 0からしか始められません.ADC1_Init( ①ADC1_CONVERSIONMODE_CONTINUOUS, ②ADC1_CHANNEL_9, ③ADC1_PRESSEL_FCPU_D2, ④ADC1_EXTTRIG_TIM, ⑤DISABLE, ⑥ADC1_ALIGN_RIGHT, ⑦ADC1_SCHMITTTRIG_ALL, ⑧DISABLE);
    この関数の②の引数の9が0~9を意味します.ここを2にすると0~2を意味します.5にすると0~5を意味します.

    返信削除
  16. den-nekonoko.blog.so-net.ne.jp/2012-01-28 に書いたんですが、オプションバイトの設定次第では ADC6,7,8,9しか動作しませんがその場合は連続スキャンは6から9を繰り返し、
    9でEOC割り込みを動作させられるのでしょうか?
    それでは宜しくお願いします。

    返信削除
  17. ●option byteは6789と設定できちゃいますが、一方でADC1_Init()では0~9のように0スタートしか設定できません.なので、6~9だけをスキャンすることはできませんで0~9になっちゃいます.
    ●EOC割り込みが、いつ発生するのかは仕様書を読んでないのでよくわかりません.やってみて問題がなければOKってことでよろしいかと.

    返信削除
  18. こんばんは ディスカバリーにADCを書き込んでLEDやボリュームを実装しかけています。
    あと一歩でこれがないとか、なかなか直ぐには揃わないので、ジャンク箱を引っかき回しながらやっています。
    最後のVRを見つけたので試験は明日になりそうです。
    例題は9chだけのシングルのようです、動作したら他へ振ったりしてみようと思います。
    それでは有り難うございました。

    返信削除
  19. こんばんは
    STのサンプルADCはバグっぽいです、
    急にVRを回すとデタラメにLEDが点灯します。

    さて、ADCはウエイテッドキャパシタSWでやっているようです。

    返信削除