投稿

5月, 2021の投稿を表示しています

中華格安ロジアナ

イメージ
 中華のロジアナ24MHz8チャンネルを購入してみました。 アマゾンからポチリ 。 説明書もなんにももちろんないんですが、先人の方々がそのあたりは詳しく説明してくださっているので、参考にソフトをインストールして設定しました。 参考にしたページ: https://jsdkk.com/blog/mugita/?p=748 https://sigrok.org/ 実はインストールが上手くいかず。途中で1度停止し、その後は全く受け付けない症状になりました。いろいろ(手動でWINUSBをインストールとか・・・・)しても、参考ページにあるように、 Saleae Logic with 8channels というデバイスが表示されない現象が発生し、USBを抜き差しすると現れるようになったものの、いざ選択するとUSBが切り離されて、デバイスが認識されない状態でした。 →解決した方法: https://www.saleae.com/ja/downloads/ 本家の方は勝手に使うなと怒るんでしょうが、本家側のソフトをインストールしました。ドライバーが適正にインストールされるからでしょう。本家ソフトでも動きますし、PulseViewでも問題なく動くように。 SPIの信号を見た例。SPIのスレーブ側の問題なのか?コーディングの問題なのか?大量に時間を消費していましたが、これは便利。ある意味、これまでが馬鹿らしい。 また、whileでループしている時間の実測とかが正確に把握可能。 Timerの正確さとかちょっと知りたいとかが簡単にできる。 次はオシロスコープが欲しいのでした・・・

MSP432 Timer

イメージ
 MSP432には4つの16ビットタイマーと2の32ビットタイマーがあり、CCRが5つ。 CCR(Caputure/Compare register)の略のはず。 Exampleを一つ開いてみる。1秒おきにオンボードのLEDが点滅するという例題。ある意味正確な時間のLチカ。 timer_a_upmode_gpio_toggleを選択しIMPORTする。本家のExampleなのでエラーもでないから、ビルトして書き込みをしてみる。 P1.0に接続されたLEDが点滅 ソースコードを解釈していく /* Application Defines  */ #define TIMER_PERIOD    0x2DC6 10進数では11718。 const Timer_A_UpModeConfig upConfig = {         TIMER_A_CLOCKSOURCE_SMCLK,              // SMCLK Clock Source         TIMER_A_CLOCKSOURCE_DIVIDER_64,          // SMCLK/1 = 3MHz         TIMER_PERIOD,                           // 5000 tick period         TIMER_A_TAIE_INTERRUPT_DISABLE,         // Disable Timer interrupt         TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE ,    // Enable CCR0 interrupt         TIMER_A_DO_CLEAR                        // Clear value }; タイマーの設定。 クロックをSMCLK(デフォルトでは3MHz) TIMER_A_CLOCKSOURCE_DIVIDER_64:分周率を1/64? TIMER_PERIOD:この値がCCRに書き込みまれて、カウントしていってこの値を超えるかをみる。16ビット整数は2^16(65536)までの数字。 TIMER_A_TAIE_INTERRUPT_DISABLE:読んで字のごとく、タイマーによるインターラプトをEnableにするか?無効にするか?

MSP432 UARTによるPCとの通信

イメージ
  MSP-EXP432P401Rの説明書 の回路図を見ると、 ピンP1.2と、P1.3はXDS110-ETとつながっていて、UARTのRXD,TXDになっている。これらのピンとPCとの通信することができる。DriverLibのExampleをインポートして動作を確認してみる。 インポートしたらさすがにエラーはないので、ビルトして書き込みを行う。 PCと接続されているCOMポートの番号をデバイスマネジャーで確認する。上の場合は8番側。シリアルの通信ターミナルを開いてキーボードに何か書いて送付するとエコーバックしてくる。 ArduinoIDEをインストールしているならCOMを8番に設定して、シリアルモニタを代用するでもOK 送信した文字がそのままバックして画面に出てくるってしろもの。 でこれで、ボーレートとか必要ところだけ編集すればまあ動かせる。 const eUSCI_UART_ConfigV1 uartConfig = {         EUSCI_A_UART_CLOCKSOURCE_SMCLK,          // SMCLK Clock Source         78,                                     // BRDIV = 78         2,                                       // UCxBRF = 2         0,                                       // UCxBRS = 0         EUSCI_A_UART_NO_PARITY,                  // No Parity         EUSCI_A_UART_LSB_FIRST,                  // LSB First         EUSCI_A_UART_ONE_STOP_BIT,               // One stop bit         EUSCI_A_UART_MODE,                       // UART mode         EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION,  // Oversampling

MSP432 MAX5144 via SPI

イメージ
sa  MSP432でSPIでDACのMAX5144を制御する。 Arduino や STM32 ですでに以前テストはしている。その時と同じくISL21080CIH315Z-TK(基準電圧1.5V)を用意して基準電圧として利用した。 ここまでで、ADCやSSD1306のOLEDやスイッチのテストをしてきているので、OLEDに設定電圧にちゃんと出力されているかを計測して表示するまでの記録。 SPIの設定→ピンのアサイン→SPIモードのEnable→実際の送信という流れ。  *                    MAX 5144 DAC  *                     ------------------  *                  |1 REF        GND 10 |  * 2,3 and 4   |2 CS         VCC  9 |  * pull up w   |3 SCLK       RFB  8 |  *    1k          |4 DIN        INV  7 |  * Vcc--10k-- |5 CLR        OUT  6 | CLRの端子を10KでVccと接続。ここを接続しないで実験していて半日以上無駄にした・・・。 【SPIの設定】 /* SPI Master Configuration Parameter */ const eUSCI_SPI_MasterConfig spiMasterConfig = {         EUSCI_B_SPI_CLOCKSOURCE_SMC LK,             // SMCLK Clock Source         32000,                                    // SMCLK = DCO = 3MHZ 3000000         32000,                                    // SPICLK = 500khz 500000         EUSCI_B_SPI_MSB_FIRST,                     // MSB First         //EUSCI_B_SPI_PHASE_DATA_CHANGED_ONFIRST_

MSP432 ssd1306 128x32

イメージ
  https://github.com/boykod/SSD1306-I2C-library-for-MSP430-432 ライブラリーを作ってくださっているので、ダウンロードし、必要なファイルをコピーする。 ssd1306_i2c_lib.c ssd1306_lib.c の2つは、ccsの下に入れて、 address.h font12x16.h font6x8.h ssd1306_i2c_lib.h ssd1306_lib.h はmainと同じ階層にドラッグしてもってくる。 SSD1306の128x32のものを利用する際は、ちょっと2つのファイルをいじる必要がある。 address.hを開いて、上から3行目に #define SSD1306_HEIGHT                 64 と定義されているので、これを #define SSD1306_HEIGHT                 32 に変更する。これだけでは正しく動いてくれないので、 ssd1306_lib.cを開いて20行目付近に sendCommand(0x3F); /* 64 COM lines */ があるので、 #if (SSD1306_HEIGHT == 32)     sendCommand(0x1F);                                                  /* 64 COM lines */ #elif     sendCommand(0x3F); #endif に置換し 同じく、 sendCommand(0x12); /* Alternative com pin configuration, disable com left/right remap */ / という箇所を #if (SSD1306_HEIGHT == 32)     sendCommand(0x02);                                                  /* Alternative com pin configuration, disable com left/right remap */ //0x12 #elif     sendCommand(0x12); #endif とする。 /**************

MSP432 ADC

イメージ
ADC・・・これまでArduinoとかSTM32とか触っていても、MSP本格的で初心者には難易度が高い。そもそもググって出てくる量が違う。いろいろ調べたが、本家の MSP432_Driver_Library のマニュアルが実は一番わかりやすい。ここの例題を(自己流で)解説する。 はじめの例題として、Exampleに収録されている"adc14_multiple_channel_no_repeat "を上から解釈していく。8個のマルチチャンネルのADCの値を読み込むというサンプル。解釈するといっても、理解は間違っているかもしれない・・・が他のソースに何が書いてあるかは理解できるようにはなる。 【サンプルコードのインポートから動作】 Resource Explorerから、adc14_multiple_channel_no_repeatを見つけ出してインポートのボタンを押す。 ソースコードの 上の方に、resultsBuffer[8]というのがあるので、右クリックしてAdd Watch Expressionで監視対象にいれる。 さすがに、TI社が書いているコードなのでエラーは発生しないから、そのままデバッグボタン。 このサンプルコードは、ユーザがデバッグを進めた時(F8ボタンを押した時)に1度だけ、その状態の最後の状態を配列に格納する。Add Watch Expressionで監視していたresultsBufferの配列になんらかの数字がはいることが確認できる(浮いているのでゼロにはならない) *****ここからソースを解釈**** 【おまじない】     /* Halting WDT  */     MAP_WDT_A_holdTimer();     MAP_Interrupt_enableSleepOnIsrExit(); このあたりはおまじない的。WDT_A_holdTimer():暴走防止のウォッチドッグタイマーを停止させて、Interrupt_enableSleepOnIsrExit();で低消費電力化のためにインターラプトしている間はMPUを止めてしまうという記述。 memset(void *buf, int ch, size_t n); はC言語の基本的な命令。bufの先頭からnバイト分にchをセットする。 memset(results

MSP432 GPIO Input - Switch

イメージ
  Lチカ(つまりデジタルのON/OFF)ができたら、次はデジタルの読み込みが王道の手順でしょという事で簡単な動作確認を実施 緑色のLEDの下にスイッチがあり、P1.1に接続されている。反対側にもP1.4に接続されたスイッチがある。P.1.1を押したらLEDをつけて、P1.4を押されたらOFFする。  MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1); スイッチの検出のため内部プルアップで使うかプルダウンで使うかを指定する。 プルアップで指定。ボタンが押されたらGNDに落ちるので、押されたらLOWを検出する。 MAP_GPIO_getInputPinValue でピンを状態を確認して、GPIO_INPUT_PIN_LOW 、つまりインプットピンがLOWかを検出する。 PIN1とPIN4でそれぞれ同じコードを書いて、LEDのオンオフができる。 int main(void) {     /* Stop Watchdog  */     MAP_WDT_A_holdTimer();     MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN0);     MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1);     MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN4);     while(1)     {      if(MAP_GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1)==GPIO_INPUT_PIN_LOW){       MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN0);      }      if(MAP_GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN4)==GPIO_INPUT_PIN_LOW ){       MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0);      }    

MSP432 GPIO Output - BLINK

イメージ
  MSP432を入手 Getting Startedの画面から、Browse and import Examplesを選択する New Projectから作っていくとDriverLibrで必要なファイルがデフォルトで設定されないのため、Exampleの中のemptyをひな形として使う。何事もひな形からが間違いない。 IMPORTをsるうとCCSに取り込まれる。 取り込まれたフォルダを右クリックして名前を適当に変更する。 まずはLチカということでBLINKとした。 mainの下に、 MAP_GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0); P1ポートのPIN0をアウトプットに設定するための1行 とこのピンをトグル(オンならオフ、オフならオン)するための MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0); 行をwhileの中に入れる。待ち時間を入れてあげないと高速に点滅=目視で確認できないほどの高速に点滅するので、for文で無意味に10000まで数えてもらう。カウント用の変数iも上の方で宣言。 キーボードでCtrl+Bを押してビルトする。簡単なのでエラーとかないと思うが、あれば修正。その後、FLUSHのボタンを押して、書き込みを実施する 写真なので点滅しているかわからないが、上の写真で赤色のLEDが点滅してれば成功

STM32 Timer

イメージ
 STM32 Timerのタイマー タイマーの設定 実は、下に書いてあるように設定して、動かしていると思っていたのにLEDがついたらつきっぱなしで思った通りの動きをしなかった・・・・かと言って何かしましたか?というと一晩寝かせて朝やったら動いた・・・(やった事は、桁で数字をかえる、分周率を7200、36000といった具合に・・それで元の数字に戻ったころにちゃんと動いた・・・謎) 先に時間を操作するので、基準になるクロックの設定をする。 RCCからHSEにCrystal/Ceramic Resonator クロックの画面で各クロックを設定 ここではTimer4を使ってみた。 Internal clockにチェックを入れると下の設定画面が出てくる。 Prescalerを設定 後で設定するクロック(ここでは72MHz)の分周率。7200(1はゼロから始まるから) 72MHz=72000kHzなので7200で割ると10kHz。 1秒のタイマーにするには、10000カウントという事になる タイマーだけ設定しても何も起こらないのでオンボードのPC13をOutputに設定して、LEDを点灯させると static void MX_TIM4_Init(void) { 中略・・・   /* USER CODE BEGIN TIM4_Init 2 */   HAL_TIM_Base_Start_IT(&htim4);   /* USER CODE END TIM4_Init 2 */ }   HAL_TIM_Base_Start_IT(&htim4);でタイマーをスタートさせる命令。 コールバックされたら、ピンをトグルするように記載して点滅間隔でタイマー割り込みを確認する。 /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){     static short Led = 1;     if (htim == &htim4){     HAL_GPIO_TogglePin(GPIOC,

MSP432P401Rことはじめ(購入前の下調べ)

イメージ
購入前の下調べ。 MSP432は、TI社が出しているマイコン。正直、素人が使うのであれば同じCoretexを使うのであればSTM32の方が圧倒的に開発時間が少なくて済む。なにしろ、あれこれしたいと思っても情報量がネットであまり得られない。MSPをよく使うヘビーユーザの方に怒られるかもしれないが、情報量が少ないのも事実。学ぶには相当苦労する。 EVAキットのデータシート:  https://www.ti.com/lit/ug/slau597f/slau597f.pdf?ts=1620990223031 EVAキットの購入先 https://www.chip1stop.com/view/searchResUpt/InventryInfo?unqPartId=TI01*0208402&unqPartNm=MSP-EXP432P401R&keyword=MSP-EXP432P401R&partId=TI01-0389902 XDS110というデバッグ部分がついていて、USBからプログラム、デバッグができる。電源もPCから供給してくれる。また消費電力がどれぐらいか測定する部分とかがある。 下の部分が、MPUの部分でピン出しされている。開発がおわったらパッキっと切断するためかミシン目がシルク印刷されている。 【開発環境】CCS Code Composer Studio https://www.tij.co.jp/tool/jp/CCSTUDIO#downloads ユーザ登録等なしでサクッとダウンロード。容量は1.1G程度。 MSP432 Driver Library (DriverLib)ってのがって、 MSPDRIVERLIB ドライバまたはライブラリ | TIJ.co.jp MSP432P4xx SimpleLink™ Microcontrollers Technical Reference Manual (Rev. I) (ti.com) MAP_GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0); といったようにP1.0ピンをアウトプットに指定して、 MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0); でPINをHIGHにするといったAPIを使うプログラ

ADS1115 STM32 HAL

イメージ
STM32F103(blue pill):12ビットのADC搭載 読み取り精度が必要な時に16ビットなどが欲しい。1chならMCP3425が有名で秋月で簡単に購入できる。一方いくつもとなるとMultiplexerが搭載されているマルチチャンネルが読めるものが必要 入手性から ADS1115 を購入してみた。アマゾンでADCを調達しようとするとこれが出てくる。MCP3425から比べると大きい(4ADC分あるからといえば)。 また16ビットとなっているが、フルスケールがプラスマイナスなので実際は正側だけ使う場合は、15ビットの分解能になるとはいえ、フルスケールも選択できるので分解能はFSが狭ければ稼ぐ事もできる。 使い方のメモ。 【動作】 動作させる主な手順 1.レジスタとしてAddress Pointer registerに書き込みConfig Registerを指定する。 2.Config Registerに設定を書き込む 3.レジスタとしてAddress Pointer registerに書き込みConversion  Registerを指定する。 (Conversion  Register:16ビットのAD変換の結果が格納されるレジスタ) 4. Conversion  Registerの内容を読み込む 上記で書き込み時には、 R/Wビットはゼロ(LOW)で、読み込む時は、1(HIGH)にする。 【アドレス】I2Cのアドレスは4種類から選べ、メカで(ハードの時点で)ADDR Pinをどこに接続するかで決められる。1つの4ch分を使うのであれば、GNDにでも繋いでおく。 【手順1】Config Registerを指定する。 レジスタとして、 Conversion  Register:16ビットのAD変換の結果が格納されるレジスタ Config Register:各種の設定をするレジスタ Lo thresh Register/ Hi  thresh Register:コンパレーターの機能をもっていて閾値を設定できる(ここで指定した値に入るとALERT/RDYのピンの出力を変動させる事ができる。モードが通常とコンパレーターとWindowモードがあり、出力を制御できる。このあたりはデータシートを参照。) まず設定をしたいので、Address Pointer registe

STM32 Blue Pill(STM32F103C8T6)の容量

イメージ
Blue Pill(STM32F103C8T6)の容量が64kと公称されているが、実際は128kの容量を持っていると多くのブログなどで記載があった。 本当に?→ どうも64kを超えてもちゃんと動くようです。  STM32F103C8TX_FLASH.ldのファイル内に、 * Memories definition */ MEMORY {   RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 20K   FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH =128K } 128Kに書き換えるだけ・・・ 表示が128kになるだけではなくて、128Kの50%を超えてちゃんと書き込みできているようです。ダンプしてまでは確認してないが、動いているので問題はないようです。 https://drive.google.com/file/d/18emCZnAIXVuJ4SWqdAxn36qhAmPHlWW6/view?usp=sharing

STM32 MCP3425 via I2C

イメージ
 SPIからOLEDに文字を出す際は、先人が作ってくださっている関数をダウンロードしてきて使っていた。世界で有名どころならそれでよいが、つかうICのデータシートを紐解いてI2Cで設定する。 対象:MCP3425。Arduinoから超有名なADCで大量に情報は得られる。 まず、上の方で、 /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ #define MCP3425_address  (0x68 << 1) 次に /* USER CODE END PTD */   /* USER CODE BEGIN 2 */   uint8_t MCP3425_ConfREG=0b10011000; //16bit 15sps PGA x1   uint16_t adcdata;   float Vref_cp3425=2.048;   float Vmcp3425=0;   HAL_I2C_Master_Transmit(&hi2c1,(uint16_t) MCP3425_address, &MCP3425_ConfREG, 1, 100);  /* USER CODE END 2 */ とmainの前で、設定をし ADCの値を取得したところで HAL_I2C_Master_Receive(&hi2c1, (uint16_t)MCP3425_address, &MCP3425_buffer, 2, 100); adcdata=(MCP3425_buffer[0]) <<8 | MCP3425_buffer[1]; Vmcp3425=adcdata*Vref_cp3425/32767.0; で取り出せる。 【解説】 Address byte MCP3425のアドレスは、秋月から購入すると、0x68。 2進数で01101000。アドレスバイトは、最後がR/W(ICから見て受信か送信か)を選択するビットが入って1バイト。Arduinoとかこの点、ユーザが知らなくてもちゃんと処理してくれるが、HALのI2Cライブラリーはこの点をやってくれない。つまり