対サンプルプログラムでの勝敗

組込みのTip

芹井滋喜著、「定番!ARMきっと&PIC用 Cプログラムでいきなりマイコン制御」、CQ出版、2016を読みながら、STM32マイコンの勉強をしている。

サンプルプログラムがうまくいったり、うまくいかなかったりしているので、
・うまくいった時を勝ち
・うまくいかなかった時を負け
として、勝敗をつけてみたいと思います。
そうすることで、うまくいかなくても続けるモチベーションになるかと思います。
※わからなかったら、主にAIに聞いて修正してます。

現在、 8勝6負2不明

1.対led_on戦
勝ち:LED2が点灯した。

2.対push_sw戦
勝ち:STM32F103のユーザーボタンを押すとLED2が点灯し、ユーザーボタンを離すとLED2が消灯した。

3.対seven_seg戦
勝ち:4つの7セグが「1234」と点灯し続けた。

4.対lcd戦
勝ち:LCDの1行目に「Welcome to ・・・」と表示され、続いて2行目に「MPU-Trainer!」と表示される。その後LCDが消えて、またLCDの1行目にWelcome to ・・・」と表示され…、と繰り返される。

5.対delay_ms戦
勝ち:LED2が0.5secごとに点滅を繰り返す。

6.対pulse_led戦
負け:MCUトレーナーのLED0は点灯したが、LCDには何も表示されていない。また、VR1を動かしてもLED0の点灯に変化なかった。

7.対led_toggle戦
不明:確認の方法がわからなかった。

8.対sampling_sw戦
不明:確認の方法がわからなかった。

9.対freq_counter戦
勝ち:はじめは、動かなかったが、いろいろしているうちに動いた。

10.対pulse_width戦
負け:LCDで、1行目「Pulse Width」、2行目「0.000msec」と出るが、その後信号を入れても変わらなかった。

11.対stop_watch戦
負け:LCDで、1行目「Stop Watch」、2行目「00:00:00」と出るが、STM32F103のユーザーボタンを押しても変わらなかった。

12.対kitchen_timer戦
勝ち:苦戦したが、AIに聞いて、以下のことをすることによって、動いた。
【動き】
①「SET」「00:00」と表示されるので、MPUトレーナーの紫色の3つのスイッチで、SW2で「分」を、SW1で「秒」(5秒ごと)を設定する。例えば、「00:05」とする。
②SW0を押すと、「RUN」「00:05」となり、1秒ごとにカウントダウンしていく。
③タイマーが「00:00」になると、MPUトレーナーのLED0が点灯して、時間が来たことを知らせてくれる。
【書籍からの修正点】
①[main.c]
①-1. /* USER CODE BEGIN 0 */ に以下を追加。
「volatile int tick_1s = 0;

void HAL_SYSTICK_Callback(void)
{
static int ms_count = 0;
ms_count++;
if (ms_count >= 1000) { // 1000ms = 1秒
ms_count = 0;
tick_1s = 1;
}
}」

①-2. while(1) の else { // State==RUN の中に以下を追加。
「// ★追加:1秒ごとにカウントダウン
if (tick_1s) {
tick_1s = 0;
if (time_count > 0) {
time_count–;
}
}」

②[stm32f1xx_it.c]
以下の関数で、「HAL_SYSTICK_IRQHandler();」が抜けていたので、追加。
void SysTick_Handler(void)
{
HAL_IncTick();
HAL_SYSTICK_IRQHandler();
}
※stop_watchが動かなかったのも、このせい???⇒試したが、stop_watchは、いまだ動かず。

13.対adc戦
負け:ボリュームの位置で違ったADC値が出てくると思ったが、反応なし。ボリュームが壊れているのか??

14.対adc_thermo戦
勝ち:U2の温度計は、MPUトレーナーの回路によるとMCP9700である。AIに聞いて、以下の修正を行ったら、うまくいった。

修正前:

    HAL_ADC_Start(&hadc2);
    HAL_ADC_PollForConversion(&hadc2, 100);
    if(HAL_ADC_GetState(&hadc2) == HAL_ADC_STATE_EOC_REG)
    {
        adc = HAL_ADC_GetValue(&hadc2);
        tmp=(((adc*3300)/0xfff)-TMP_OFST)/TMP_STEP;
        sprintf(str, "%03d", tmp);
        LcdXy(0, 0);
        LcdPuts(str);
    }
    HAL_ADC_Stop(&hadc2);
    HAL_Delay(100);

修正後:

    HAL_ADC_Start(&hadc2);
    if (HAL_ADC_PollForConversion(&hadc2, 100) == HAL_OK) {
        adc = HAL_ADC_GetValue(&hadc2);
        tmp = (((adc*3300)/0xfff)-TMP_OFST)/TMP_STEP;
        sprintf(str, "%03d", tmp);
        LcdXy(0, 0);
        LcdPuts(str);
    }
    HAL_ADC_Stop(&hadc2);

温度が、「028」と出ていて、なんとなく表示がチラチラしていたので、以下のように変更しておいた。

        sprintf(str, "%03d degC", tmp);
        LcdXy(0, 0);
        LcdPuts(str);
        HAL_Delay(1000);

15.対adc_int戦
負け:カーソルは点滅するが、何も出てこない。いろいろ試すが何も出ず。温度の設定も何もしていないから当たり前のような気はする。adcの割込みなので、ユーザーボタンを押したら何か数値が出るのかと思ったが、そうはなっていなかった様子。

16.対adc_multi戦
勝ち:LCDの上段に4桁の数字(ボリュームの値:左に回すと数字が増えて、右に回すと数字が減る)が出た。LCDの下段にも4桁の数字(「0028」と出ていたので、温度だと思う)が出た。今回初めて、ボリュームが動いた。ボリュームはつぶれていなかった。良かった。

17.対comparator戦
次回トライする。

//

コメント

タイトルとURLをコピーしました