JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

宙わたる教室

2024-12-21 13:53:57 | 科学と教育
 2024年10月8日から10回にわたって放映されたNHKのドラマ10「宙わたる教室」を見ました。ひさしぶりに良いドラマ、心にしみるドラマでした。

 定時制高校の生徒たちが、教師に導かれ科学部で火星のクレータの研究を行い、学会発表に臨むという実話を元にした青春物語です。物語の詳しい内容やレビューは他に譲り、自分なりの感想を書いてみます。

 定時制高校には、様々な生徒さんがいます。このドラマにも年齢も経歴も異なる生徒が登場します。金髪でたくさんの耳飾りをつけたやんちゃな柳田岳人(小林虎之介)、保健室登校を続ける名取佳純(伊東蒼)、フィリピン二世の越川アンジェラ(ガウ)、元工場経営者の長嶺省造(イッセー尾形)。そして理科教師の藤竹叶(窪田正孝)と養護教諭の佐久間理央(木村文乃)などなど。

 このドラマで感心したのは、キャスティングの良さもあるのですが、生徒役の表情がどんどん変わっていくことでした。藤竹先生と出会って科学(たぶんこれは科学でなくても良かったのでしょうが・・)の面白さに気づき仲間と活動するようになってくると表情が変わり目に光が宿るのです。演技・演出のすばらしさですね。特に柳田役の小林虎之介の演技はすばらしかったと思います。また、藤竹先生役の窪田正孝の感情を抑えた演技(一度だけ声を荒げる場面がありました)もすばらしかったと思います。

 ドラマをすべて見終わって感じたことがあります。人間にはそれぞれ持った能力(ポテンシャル)があるのですが、持っているだけではそのエネルギーは使われることはありません。しかし、エネルギーが流れるように障壁を崩してあげたり、ちょっとした溝を作ってあげるだけで、そのエネルギーは流れ出すのです。それをやってあげるのが教師の役目なのだと思いました。

 ドラマが終わって、原作を読んでみたくなり、さっそく購入しました。文芸春秋社刊、伊予原新著「宙わたる教室」です。帯をとってみると、大きな火星をバックにした定時制高校の校舎に明かりが灯り、窓に人影が見えます。これは藤竹先生かな。



 本を読み始めるとドラマが原作にほぼ忠実に作られたことが分かりました。読み進めるとドラマの各場面や登場人物の顔が浮かんできました。ここはあのシーンだな、ここをあんな風に演じたんだ、物語がよりリアルに感じられました。ドラマを見てから小説を読むというのもよいものですね。

 

 

MPLABアセンブラ PIC16F1827 PWMテスト

2024-12-03 07:36:08 | MPLAB アセンブラ
 MPLAB IDE v9.82, MPASM v5.51, PICKit3の環境で、PIC16F1827のPWMのテストをします。

 PIC16F1827でPWM信号を発生するのは、CCP(Capture/Compare/PWM)モジュールです。この品種では、ECCP1,ECCP2,CCP3,CCP4が利用できます。なお、EがつくCCPモジュールは機能が拡張されています。

 今回は、CCP3を使い、タイマーはTMR2を使ってテストします。回路図です。ICSPでプログラミングし、電源5VはPICKit3から供給します。PWM信号はRA3(PWM3)から出力します。


 PIC16F1827でのPWM発生のしくみは、私のホームページ(JH7UBCホームページ)のこちらのページで詳しく解説しています。

 今回テストとして、PWM3で周波数500HzのPWMを発生し、DutyCycleを変化させ、RA3に接続したLEDの明るさを周期的に変化させてみます。

 CCP3でPWMに設定するには、CCP3CONレジスタのbit3:bit2(CCP3M3:CCPM2)を11の設定します。他のbitは0でOKです。説明書では、下のようにCCPXCONとなっています。Xはモジュールの番号1,2,3,4です。

 つまり、CCP3CON=b'00001100'とします。

 次に、CCPTMRSレジスタで、CCP3でTMR2を使うという設定をします。
 bit5:bit4(C3TSEL1:C3TSEL0)を00とします。他のbitは適当でよいの、すべて0にします。

 つまり、CCPTMRS=b'00000000'とします。

 PWMの周波数(周期)とDuty比(DutyCycle)を設定するのはPR2レジスタの値とCCPR3L+CCP3CON<5:4>で、次のような式で計算されます。



 今回、PICのクロックは内蔵の4MHzとしますので、Tosc=1/4000000 (sec)で、TMR2のPrescaler値を16とすると500Hz(周期は1/500 (sec))を発生させるPR2の値は、
PR2=(Period/(4*Tosc*TMR2Prescale Value))-1=(1/500/(4*(1/4000000))*16)-1
  =4000000/(500*4*16) -1 =125-1=124
となります。
 Duty比は、一番下の式できまりますので、PR2=124のときは、CCPR3Lの値を0から125まで設定すれば0から100%のDuty比のPWM信号を発生することができます。

 プログラムです。DUTYの値をカウントアップするか、カウントダウンするかは、FLAGの値で決めます。10msごとにDUTYをカウントアップカウントダウンして、LEDの明るさを決めています。
-------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;
; PIC16F1827 PWM TEST
; 2024.12.3
; JH7UBC Keiji Hata
;;;;;;;;;;;;;;;;;;;;;;;;;;

              LIST      P=PIC16F1827
              INCLUDE           P16F1827.INC
              
              __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
     __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF
              
              ERRORLEVEL    -302

              CBLOCK             020h
              CNT1ms
              CNT10ms
              DUTY
              FLAG
              ENDC

SETUP
;クロック設定
              BANKSEL           OSCCON
              MOVLW              b'01101000'         ;PLLなし、4MHz,Fosc
              MOVWF              OSCCON

;入出力設定
              BANKSEL           ANSELA
              CLRF     ANSELA                            ;AN0-AN4使用しない
              CLRF     ANSELB                            ;AN5-AN11使用しない
              BANKSEL           TRISA
              CLRF     TRISA                 ;PORTAは全て出力(RA5は入力)
              CLRF     TRISB                 ;PORTBは全て出力

;PWM設定
              BANKSEL           CCP3CON
              MOVLW              b'00001100'         ;PWM mode
              MOVWF              CCP3CON
              BANKSEL           CCPTMRS
              MOVLW              b'00000000'         ;bit5-bit4=00,CCP3にTimer2を割り当てる
              MOVWF              CCPTMRS
              BANKSEL           PR2
              MOVLW              07Ch                    ;07Ch=124
              MOVWF              PR2                                   ;Timer2の周期を設定
              BANKSEL           T2CON
              MOVLW              b'00000110'
              MOVWF              T2CON               ;prescale 1:16 Timer2 start

;変数初期値
              BANKSEL           DUTY
              CLRF     DUTY
              MOVLW              01h
              MOVWF              FLAG

MAIN
              BANKSEL           DUTY
              MOVFW              FLAG
              XORLW 01h
              BTFSS   STATUS,Z           ;FLAG=1ならINCDUTYへ、FLAG=0ならDECDUTYへ
              GOTO   DECDUTY
              
INCDUTY
              MOVFW              DUTY
              SUBLW 07Ch                    ;W=124-W
              BTFSC   STATUS,Z           ;DUTY><124ならスキップ
              GOTO   FLAGCHG                        ;DUTY=124ならFLAGCHGへ
              INCF      DUTY                  ;DUTY=DUTY+1
              GOTO   SETDUTY
              
DECDUTY
              DECFSZ              DUTY                  ;DUTY=DUTY-1 DUTY=0になったらスキップ
              GOTO   SETDUTY
              
FLAGCHG          
              MOVFW              FLAG
              SUBLW 01h
              MOVWF              FLAG                   ;FLAG=1-FLAG
              GOTO   SETDUTY

SETDUTY
              BANKSEL           DUTY
              MOVFW              DUTY
              BANKSEL           CCPR3L
              MOVWF              CCPR3L
                            
              CALL     LOOP10ms
              GOTO   MAIN
              
LOOP10ms
              BANKSEL           CNT10ms
              MOVLW              0Ah                      ;0Ah=10
              MOVWF              CNT10ms
LOOP2
              CALL     LOOP1ms
              DECFSZ              CNT10ms
              GOTO   LOOP2
              RETURN             
              
LOOP1ms
              MOVLW              0F9h      ;0F9h=249
              MOVWF              CNT1ms
LOOP1
              NOP
              DECFSZ              CNT1ms,F
              GOTO   LOOP1
              RETURN
                            
              END
-------------------------------------------------
RA3から出力されたPWMの波形です。周期は約2ms(周波数は約500Hz)で、ヂューティ比が時間とともに変化します。



 ブレッドボードです。赤いLEDが明るくなったり暗くなったりします。左下の緑色のLEDは電源確認用です。




週末はFQP

2024-12-02 12:25:24 | アマチュア無線
 今週末の12月7日(土)9:00~21:00は、第16回FCWA CW QSOパーティ(略してFQP)です。福島CW愛好会(FCWA)主催のこのパーティは、早いもので今回で16回を迎えます。規約は、こちらをご覧ください。

 このパーティは、JA7SSB故齋藤さんが亡くなった2008年の翌年の2009年から齋藤さんの功績を記念するとともにCW交信の活性化を図るという目的で始まりました。開催当初から当局JH7UBCがコンテストマネージャーを務めさせていただいています。

 毎年、多くの局に参加いただき、賑やかにQSOパーティが行われ、昨年、一昨年は160局から180局ほどの局からログが提出されています。CW初心者からベテランまでいろいろなバンドでCW交信を楽しんでいただいております。

 QSOパーティと名乗っていますが、順位をつけ上位入賞局を表彰しますので、コンテストの要素も持っています。気軽に参加するもよし、頑張って上位入賞を目指すもよし、自分のスタイルでCW交信を楽しんでいただきたいと思います。

 では、当日お空でお会いしましょう。

 FCWA CW QSOパーティ マネージャー JH7UBC 畠 惠治

初雪

2024-11-30 23:19:11 | 夢の森から
 今朝起きたら周りは真っ白。喜多方市熱塩加納町での初雪です。

 昨夜から降っていた雨が雪に変わりました。積雪は約10cm。この季節は湿っぽく重い雪です。

 前庭の雪囲いをしたイヌツゲもすっかり雪化粧です。


 この写真を撮った後、国道121号大峠を越えて、米沢市経由で福島市まで行ってきました。

 大峠は30cmくらいは降ったようでしたが、除雪されていましたし、凍結はしていませんでしたので、普通に走ることができました。

 米沢市は、まったく雪はなく、ちょっと拍子抜け。我が家の付近だけ雪が降ったのかな・・・

 米沢市から福島市までは、東北中央道を走りました。こちらもほとんど雪はなく順調に走れました。

 いよいよ雪の季節です。こちら雪国では雪が降るのは当たり前。雪が降ってしまった方が落ち着きます。

MPLABアセンブラ PIC16F1827 ADCテスト

2024-11-28 13:30:49 | MPLAB アセンブラ
  MPLAB IDE v9.82, MPASM v5.51, PICKit3の環境で、PIC16F1827のADCのテストをします。 

 PIC16F1827は、10bit分解能のADコンバータ(ADC)を12チャンネル持っています。今回はこのADCの使い方を勉強します。

 回路図です。電圧はVRで調整して、17番ピンのAN0(RA0)から入力して、AD変換してその値をシリアル通信で出力してTeraTermで、その値を読み取ります。今回もICSPでプログラミングし、電源(5V)はUSBシリアル変換モジュールFT-234から供給します。PICのクロックは内蔵の4MHzとします。


 AD変換の手順です。
 1 アナログ入力ピンの指定とピンの入力設定
 2 ADCのチャンネル指定とADCを有効にする。
 3 ADCの準備時間(チャージ時間)を待ち、AD変換をスタート
 4 AD変換が終わったら変換結果を取り出す。

 まず、ANSELAレジスタとANSELBレジスタでアナログピンを指定します。


 AN0を使用しますので、bit0を1にして、他のビットは0にします。
 ANSELA=b'00000001'


 AN5~AN11は使わないので、
 ANSELB=b'00000000' つまり、CLRF  ANSELB

 つぎにADCのチャンネルをADCON0レジスタで指定します。


 bit6~bit2でチャンネルを設定します。AN0の場合、CHS4-CHS0=00000
 bit0のADON=1としてADCを有効にします。

 更にADCON1でADCの各種設定をします。
 AD変換結果を右詰めでADRESHとADRESLに格納しますので、bit7のADFM=1とします。また、ADCのクロックは、Fosc=4MHzの1/4で1MHz=1usとしますので、ADCS2-ADCS0=100とします。
 ADCの負参照電圧はVss(GND)としますので、bit2のADNREF=0、正参照電圧は、Vddとしますので、ADPREF1-ADPREF0=00とします。
 以上からADCON1=b'11000000'と設定します。


 EUSARTの設定とバイナリからBCDへの変換は、これまでの記事と同じです。

 プログラムです。1秒ごとにAN0の電圧をAD変換してシリアル通信で出力します。"ADC "+変換値でTeraTermに表示されます。チャージ時間は、MAINループ内で確保できると考え、特にとっていません。
-------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PIC16F1827 ADC TEST
; 2014.11.28
; JH7UBC Keiji Hata
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

              LIST      P=PIC16F1827
              INCLUDE           P16F1827.INC
              
   __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
   __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF
              
              ERRORLEVEL    -302

              CBLOCK             020h
              BYTE0
              BYTE1
              DIGIT12
              DIGIT34
              SHIFT
              WORK1
              TEMP
              CNT1ms
              CNT250ms
              ENDC

SETUP
;クロック設定
              BANKSEL           OSCCON
              MOVLW              b'01101000'         ;PLLなし、4MHz,Fosc
              MOVWF              OSCCON
;入出力設定
              BANKSEL           TRISA
              MOVLW              b'00000001'         ;RA0とRA5は入力、他は出力
              MOVWF              TRISA
              MOVLW              b'00000010'         ;RB1は入力、他は出力
              MOVWF              TRISB
              BANKSEL           ANSELA
              MOVLW              b'00000001'         ;AN0を使用する。AN1-AN4使用しない
              MOVWF              ANSELA
              CLRF     ANSELB                            ;AN5-AN11使用しない
;ADC関係設定
              BANKSEL ADCON0
              MOVLW              b'00000001'         ;AN0を使う。ADC Enable
              MOVWF              ADCON0
              BANKSEL           ADCON1
              MOVLW              b'11000000'         ;右詰め、クロックFosc/4=1us、Vref-=Vss、Vref+=Vdd
              MOVWF              ADCON1
 
;USART設定
;RX,TX PIN 設定
              BANKSEL           APFCON0
              BCF                     APFCON0,7        ;RXDSEL=0 RX=RB1
              BCF                     APFCON1,0        ;RXCKSEL=0 TX=RB2     
              BANKSEL           TXSTA
              MOVLW              b'00100100'
              MOVWF              TXSTA                ;非同期モード、高速通信モードBRGH=1
              BANKSEL           RCSTA
              MOVLW              090h
              MOVWF              RCSTA                ;受信可、非同期モード
              BANKSEL           BAUDCON
              BCF                     BAUDCON,3      ;BRG16=0 BRG 8bit
              MOVLW              019h                    ;019h=25
              MOVWF              SPBRGL                            ;Fosc=4MHz,Baud Rate=9600bps
              
MAIN
              MOVLW              "A"
              CALL     SENDCHR
              MOVLW              "D"
              CALL     SENDCHR
              MOVLW              "C"
              CALL     SENDCHR
              MOVLW              " "
              CALL     SENDCHR
              BANKSEL           ADCON0
              BSF       ADCON0,ADGO ;AD変換スタート
              BTFSC  ADCON0,ADGO ;変換終了まで待つ
              GOTO   $-1
              BANKSEL           ADRESL
              MOVFW              ADRESL                            ;変換結果を格納
              BANKSEL           BYTE0
              MOVWF              BYTE0
              BANKSEL           ADRESH
              MOVFW              ADRESH
              BANKSEL           BYTE1
              MOVWF              BYTE1
              CALL     CONV_BCD        ;バイナリからBCDに変換
              CALL     NUMPRINT
              CALL     LOOP250ms
              CALL     LOOP250ms
              CALL     LOOP250ms
              CALL     LOOP250ms
              GOTO   MAIN

NUMPRINT
              BANKSEL           DIGIT34
              MOVFW              DIGIT34
              MOVWF              WORK1
              MOVWF              TEMP
              SWAPF  TEMP,W
              ANDLW 0Fh                      ;DIGIT34の上位4bitを取り出す
              IORLW  30h                      ;ASCIIコードに変換
              CALL     SENDCHR
              BANKSEL           WORK1
              MOVFW              WORK1
              ANDLW 0Fh                      ;DIGIT34の下位4bitを取り出す
              IORLW  30h                      ;ASCIIコードに変換
              CALL     SENDCHR
              BANKSEL           DIGIT12
              MOVFW              DIGIT12
              MOVWF              WORK1
              MOVWF              TEMP
              SWAPF  TEMP,W
              ANDLW 0Fh                      ;DIGIT12の上位4bitを取り出す
              IORLW  30h                      ;ASCIIコードに変換
              CALL     SENDCHR
              BANKSEL           WORK1
              MOVFW              WORK1
              ANDLW 0Fh                      ;DIGIT12の下位4bitを取り出す。
              IORLW  30h                      ;ASCIIコードに変換
              CALL     SENDCHR
              MOVLW              0Dh                     ;改行コード
              CALL    SENDCHR
     MOVLW       0Ah                      ;NLコード
     CALL     SENDCHR
              RETURN
              
;1文字送信          
SENDCHR
              BANKSEL           TXSTA
              BTFSS   TXSTA,TRMT     ;送信可能かチェック(1:可 0:禁止)
              GOTO   $-1
              MOVWF              TXREG
              RETURN
              
;1文字受信
GETCHR
              BANKSEL           PIR1
              BTFSS   PIR1,RCIF           ;RCIF=1ならスキップ
              GOTO   $-1
              BANKSEL           RCREG
              MOVFW              RCREG
              RETURN
              
;--------------------------------------------
; バイナリからBCDへの変換
;--------------------------------------------
CONV_BCD
              BANKSEL           STATUS
              BCF                     STATUS,C          ;キャリーをクリア
              MOVLW              10h                                    ;16ビットカウンタ
              MOVWF              SHIFT                 ;SHIFT=8 
              CLRF     DIGIT12                           ;BCDデータクリア
              CLRF     DIGIT34
LOOP
              RLF                     BYTE0,F                            ;shift  BYTE to DIGIT
              RLF                     BYTE1,F
              RLF                     DIGIT12,F
              RLF                     DIGIT34,F
              DECFSZ              SHIFT,F              ;end check
              GOTO   ADJST                 ;adjust to BCD
              RETURN
ADJST
              MOVF   DIGIT12,W         ;DIGIT12 adjust TO BCD
              CALL     ADJBCD
              MOVWF              DIGIT12
              MOVF   DIGIT34,W         ;DIGIT34 adjust to BCD
              CALL     ADJBCD
              MOVWF              DIGIT34
              GOTO   LOOP

;****   Each digit adjust to BCD  ****
ADJBCD
              MOVWF              WORK1               ;save
              MOVLW              3                                        ;W+3
              ADDWF WORK1,W
              MOVWF              TEMP
              BTFSC   TEMP,3               ;Test W+3>7
              MOVWF              WORK1               ;>7 then W+3 else W
              MOVLW              030h                    ;W+30
              ADDWF WORK1,W
              MOVWF              TEMP    
              BTFSC   TEMP,7               ;Test W+30>7*
              MOVWF              WORK1               ;>70 then W+30 else W
              MOVF   WORK1,W
              RETURN

;250msタイマー
LOOP250ms
              MOVLW              0FAh                    ;0FAh=250
              BANKSEL           CNT250ms
              MOVWF              CNT250ms
LOOP2
              CALL     LOOP1ms
              DECFSZ              CNT250ms
              GOTO   LOOP2
              RETURN

;1msループ
LOOP1ms
              MOVLW              0F9h                    ;0F9h=249
              MOVWF              CNT1ms
LOOP1
              NOP
              DECFSZ              CNT1ms,F
              GOTO   LOOP1
              RETURN             
              
              END
              
-------------------------------------------------

 ブレッドボードです。


 TeraTermの画面です。
 ボリュームを回すと電圧が変化し、電圧(0~5V)に対応したAD変換値0~1023が表示されました。


 トラブルシューティング

 最初にプログラムを書いた時は、1秒ごとに"ADC 0000"とだけ表示され、ボリュームを回しても数値が変化しませんでした。
 IDEでシミュレーションするとバイナリBCD変換がうまくいっていないことが分かりました。このルーチンは既に何度も使用して動作は確認してあります。
 はて、何が原因か?分かるまで少し時間がかかりました。
 ADRESLとADRESHの値をBYTE0とBYTE1に格納するのですが、ここがうまくいっていませんでした。これまで、BYTE0やBYTE1などのGPRに数値を書き込むときはBANK切り替えを気にしていなかったのですが、この時もBANKSEL  BYTE0などと指定しなければならなかったようです。

 ということで、SFRの時はもちろんGPRの時もBANKSELでレジスタのバンクを指定することにしまいた。これで問題なく動作するようになりました。