マイクロコンピュータ / 電子情報工学科 / 中間テスト対策

PIC16F1827レジスタと回路図で
点を取り切るための一枚

中間テスト1・2の解説スライドと小テストから、実際に問われた形だけを抜き出して並べています。ビットの並べ替えと回路の向きの判断が配点の大半なので、そこは読むだけでなく触って確かめられるようにしました。

0x01

クロックと時間計算

中間テスト1・2の両方、そして小テストでも必ず最初に出ます。覚える式は2本だけで、あとは往復するだけです。

SYSTEM CLOCK CYCLE Tosc = 1 ÷ Fosc
INSTRUCTION CYCLE Tcy = 4 × Tosc = 4 ÷ Fosc

PIC16F1827は1命令=4システムクロックで動きます。これが計算の全部です。逆に解く問題(命令時間からFoscを求める)も、式を裏返すだけ。

クロック電卓

FoscTosc(システムクロック周期)Tcy(命令実行時間)出典
1 MHz1 μs4 μs
2 MHz0.5 μs2 μs小テスト 問題1
4 MHz0.25 μs1 μs中間1 問3
5 MHz0.2 μs0.8 μs小テスト 問題4(逆算)
8 MHz0.125 μs0.5 μsPWM問題で使用
10 MHz0.1 μs0.4 μsPWM問題で使用
16 MHz0.0625 μs0.25 μs
頻出のひっかけ 「4MHzのマイコンは 0.25μs で1命令を実行する」は。0.25μsはクロック周期であって命令時間ではありません。中間1の問2でそのまま出題されました。答えは 4×0.25=1μs。

あわせて暗記する基本スペック

項目補足
命令長14 ビットデータ幅と混同しない
データ幅8 ビットだから unsigned char は 0〜255
1命令の実行サイクル4 クロック「3クロック」は✕(中間1 問2)
入出力ピン数16 ピンPORTA 8本+PORTB 8本
0x02

マイコン vs マイクロプロセッサ

〇✕問題の定番。「マイコンは全部が下」と覚えて、ピン数・性能・周波数・消費電力・値段を思い出すのが速いです。例外はメモリ量の問い方だけ。

観点マイクロプロセッサ(MPU)マイコン(MCU)
消費電力数W〜数十W数mW(=低い)
コスト数百$数百円(=安い)
性能1μsで数千命令1μsで数十命令(=低い)
動作周波数GHz級MHz級(=低い)
OSありなし
ピン数百個以上数十個(=少ない)
メモリ量GB級KB級(=小さい)

実際に出た〇✕(小テスト 問題2)

記述正解理由
マイコンの周波数はMPUより高いMHz級 < GHz級
マイコンの性能はMPUより高い1μsあたり数十命令しか実行できない
マイコンの消費電力はMPUより高いmW級で圧倒的に低い
マイコンのメモリ量はMPUより小さい唯一の〇。「小さい」なので成立
マイコンのピン数はMPUより多い数十ピン vs 百ピン以上
マイコンのOSはMPUより早いそもそもマイコンにOSがない
0x03

レジスタ・ビット盤

配点が一番大きいところ。ビットをクリックして0/1を反転させると、16進数と各ビットの意味が同時に更新されます。レジスタを切り替えれば、そのまま試験で問われる形になります。

REGISTER BIT EDITOR
HEX0x00
BIN0000 0000
DEC0

レジスタの役割を一言で

レジスタ役割ビットの意味
TRISA / TRISB入出力方向の設定1=入力(Input)0=出力(Output)
ANSELA / ANSELBアナログ/ディジタルの切替1=アナログ0=ディジタル
PORTA / PORTBポートのデータそのもの読めば入力値、書けば出力値
OSCCON内部オシレータの周波数設定SPLLEN / IRCF<3:0> / SCS<1:0>
#pragma configデバイスパラメータの疑似命令FOSC, WDTE, MCLRE など
入力=1 の覚え方 Input の I は 1 に似ている、Output の O は 0 に似ている。TRISもANSELも「1のほうが特別(入力/アナログ)」と覚えると混ざりません。

手で書けるようにしておく変換

設問ビット並び(7→0)答え
RB0〜RB3を出力、他を入力(中間1 問6)1111 0000TRISB = 0xF0
RA0,RA1,RA2,RA4を入力、他を出力(中間1 問7)0001 0111TRISA = 0x17
RA0,RA1,RA4を入力、他を出力(中間1 問12・中間2 問1)0001 0011TRISA = 0x13
Bポート全ピンがLED=全出力0000 0000TRISB = 0x00
RB1,RB2,RB4,RB5を出力、他を入力(小テスト 問題5)1100 1001TRISB = 0xC9
RA1,RA2,RA4,RA5だけディジタル、他アナログ(小テスト 問題6)1100 1001ANSELA = 0xC9
RA0だけアナログ(中間2 問1)0000 0001ANSELA = 0x01
気づいたら早い 小テストの問題5と問題6は、聞き方が「出力/入力」と「ディジタル/アナログ」で違うのに、答えはどちらも 0xC9 です。TRISは1が入力、ANSELは1がアナログ。指定されたピンが「0側」になる点が共通しているだけなので、毎回どちらが1かを確認してください。
0x04

回路図の読み方

図から読み解く問題は、判断ポイントが3つしかありません。スイッチのプルアップ、LEDの向き、電流制限抵抗の値です。

① プルアップ抵抗とスイッチ

正しい接続 中間1 問5 の(イ)

+5V R GND RA1

抵抗は +5V とピンの間、スイッチは ピンと GND の間。スイッチOFFで High、ONで Low になります。

よくある誤り (ア)(ウ)(エ)

+5V GND RA1

スイッチが抵抗とピンのにあると、OFF時にピンが浮いて(ハイインピーダンス)値が不定になります。これが誤答パターン。

スイッチピンの電位プログラムから見た値
開いている(OFF)高電位(High)1
閉じている(ON)低電位(Low)0
抵抗値 プルアップ抵抗は 10kΩ 前後(小テスト 問題7)。中間1 問8では 1kΩ が答えでしたが、選択肢の中で「電流をほとんど流さないための大きめの抵抗」を選ぶ、という判断は共通です。LED用の小さい抵抗(150〜300Ω)と取り違えないこと。

② LEDの向き ─ ここが最大の落とし穴

同じ試験の中でも図によって向きが違います。アノード(三角形の底)がどちら側かを必ず目で確認してください。

ソース型 ピン=1 で点灯

PIC R GND

ピン → 抵抗 → LED → GND。ピンから電流を出すので、1で点灯・0で消灯。中間2 設問5の D0〜D3 がこの型(PORTB=0x0F で D0〜D3 点灯)。

シンク型 ピン=0 で点灯

+5V R RA2

+5V → LED → 抵抗 → ピン。ピンが電流を吸い込むので、0で点灯・1で消灯。中間2の LED DA がこの型(RA2=0 で点灯)。

中間1 問12 設問4 の答えが割れる理由 あの回路では D0〜D3 と D4〜D7 で向きが逆になっています。RB3〜RB0 が 0 → D0〜D3 点灯RB7〜RB4 が 1 → D4〜D7 点灯。つまり PORTB = 0x0F のとき D0〜D3 は消灯、D4〜D7 も消灯という、直感に反する組み合わせが生まれます。図を見ずに「1なら点灯」と即答すると落とします。

③ LEDの電流制限抵抗

CURRENT LIMITING RESISTOR R = ( Vdd − Vf ) ÷ I
 = ( 5V2V ) ÷ I  ← LEDの順方向電圧 Vf ≒ 2V

抵抗値の電卓

設問計算答え
20mA を流したい(中間1 問8)3V ÷ 20mA150 Ω
15mA を流したい(小テスト 問題7)3V ÷ 15mA200 Ω
10mA を流したい3V ÷ 10mA300 Ω
0x05

7セグメントLED

対応表さえ書ければ確実に取れます。試験中はまず余白に RB7〜RB0 と DP,g,f,e,d,c,b,a の対応を書いてから、値を2進数に展開してください。

RB7RB6RB5RB4RB3RB2RB1RB0
DPgfedcba
11001111

上の並びが 0xCF。点灯するのは DP, g, d, c, b, a で、f と e が消えるので「3.」の形になります(中間1 問11 の答えは ア)。

0x03 のビット盤PORTB→7SEG を選び、右下の入力欄に 0xCF と打つと、その場で形が確認できます。数字の 0〜9 を作る値も自分で探しておくと応用問題に強くなります。

カソードコモンとアノードコモン 問題文に「カソードコモン型」とあれば、共通端子がGNDなのでポート出力1で点灯。アノードコモンなら共通端子が+5Vになるので0で点灯と反転します。問題文の一語で答えが全部ひっくり返るので、最初に丸を付けておくこと。
0x06

XC8の文法○×

中間1 問9。C言語として正しいかではなく、このマイコンで意味を持つかを問われます。

記述正誤理由
PORTA = ~PORTA;ビット反転して代入。左辺があるので成立
PORTB << 4;構文は正しいが代入先がないので何も起きない。PORTB = PORTB << 4; なら〇
if(PORTA & 0x04) ==1;if文の書式は if(条件式){ }==1; が余分
RA8 = 1;PIC16F1827に RA8 は存在しない(RA0〜RA7)
RB1 !=0;比較しているだけで代入していない
TRISAbits.RB4 = 1;TRISAはRAxしか設定できない。RB4なら TRISBbits.RB4
RA6 = 0.5;ピンは0か1の2値。小数は指定できない
for(unsigned char i=0; i<300; i++)8ビットなので unsigned char最大255。300回は回せず無限ループ

フローチャート ↔ コードの対応(中間1 問10)

FLOWCHART → C 「Bポート(7〜0)を出力設定」 → TRISB = 0x00; 「z を1ビット左シフトして PORTB に格納」 → PORTB = z << 1; 「z > 128 ?」 → if(z > 128) 「1秒の遅延時間を作成」 → __delay_ms(1000);

手順は毎回同じです。①フローチャートの箱とコードの空欄を矢印で結ぶ → ②各箱の日本語をそのままC言語に置き換える。先に対応付けを済ませると、空欄の数だけ機械的に埋まります。

0x07

A/D変換

中間テスト2の主役。ADCON0とADCON1の2枚のビットマップを覚えるだけで、設問がまるごと取れます。

ADCON0 ─ どのチャンネルを、いつ変換するか

bit 76543210
CHS<4:0>GO/DONEADON
  • CHS<4:0> 00000=AN0、00001=AN1、…、01100=AN12
  • GO/DONE 1=変換開始 / 0=変換終了(修了)
  • ADON 1=ADC有効 / 0=ADC無効

ADCON0 = 0x010000 0001 → チャンネル AN0、変換処理は終了状態、ADCは有効

ADCON1 ─ 結果の形式と基準電圧

bit 76543210
ADFMADCS<2:0>ADNREFADPREF<1:0>
  • ADFM 1=右詰め / 0=左詰め
  • ADCS<2:0> 000=FOSC/2、001=FOSC/8、010=FOSC/32、011=Frc、100=FOSC/4、101=FOSC/16
  • ADNREF 0=VSS / 1=VREF−ピン
  • ADPREF<1:0> 00=VDD、10=VREF+ピン、11=FVR

ADCON1 = 0x801000 0000右詰め・FOSC/2・VREF−はVSS・VREF+はVDD。中間2の設問(エ)〜(キ)がこの1行で全部答えられます。

A/D変換の値から電圧へ

VOLTAGE FROM ADRESL(プログラム行19の式) vin = (float)(5 × res) ÷ 256

ADRESL → 電圧・LED状態

変換後の分岐は次の3段です。しきい値と PORTB の値をセットで覚えてください。

条件PORTB点灯するLED
vin ≦ 1.5V0x03D0, D1
1.5V < vin ≦ 3.5V0x0FD0〜D3
3.5V < vin0xFFD0〜D7(全点灯)
スイッチSが閉(RA1=0)0x00全消灯、DAも消灯
行15の __delay_us(20) は何のため? サンプルホールドキャパシタを充電するためです。「A/D変換が行われる」「GO/DONE信号が発生される」ではありません。変換開始(行16の ADCON0bits.GO = 1;)はこの後にきます。
スイッチの状態とプログラムの対応 if(PORTAbits.RA1 == 1) が真=スイッチOFF(開)=プルアップで高電位。このとき DA は RA2=0点灯し、他のLEDは電圧レベルに応じて点灯します。スイッチONなら RA2=1 で DA 消灯、PORTB=0x00 で全消灯。
0x08

割り込みとタイマー0

中間テスト2 問3。INTCON と OPTION_REG の2つを16進数から展開できれば、設問1〜6がほぼ連鎖して解けます。

INTCON ─ 割り込みの許可とフラグ

bit 76543210
GIEPEIETMR0IEINTEIOCIETMR0IFINTFIOCIF
全体許可周辺装置タイマ0許可INTピン許可状態変化タイマ0フラグINTフラグ状態変化フラグ

INTCON = 0xA01010 0000GIE=1(全体許可)かつTMR0IE=1。よって割り込み要因はタイマー0のオーバーフロー
INTCON = 0x00 → 全ビット0 → 割り込みは不可能

OPTION_REG ─ タイマー0の入力源

bit 765432:0
/WPUENINTEDGTMR0CSTMR0SEPSAPS<2:0>
プルアップ0=立下り
1=立上り
0=内部クロック
1=外部RA4
0=立上りで加算
1=立下りで加算
0=TMR0に接続
1=TMR0に接続しない
分周比

OPTION_REG = 0x280010 1000
INTEDG=0 → 割り込みは立下り/TMR0CS=1 → 入力源は外部(RA4端子)/TMR0SE=0 → カウントするエッジは立上り/PSA=1 → プリスケーラは TMR0 に接続なし

立下りと立上りが両方出てくる 設問1の「割り込み要因のエッジ」は INTEDG(bit6)を、設問2の「タイマー0がカウントするエッジ」は TMR0SE(bit4)を見ます。同じ 0x28 の中で答えが立下り立上りに分かれるので、どちらのビットを聞かれているか必ず確認してください。

タイマー0のオーバーフロー周期

TMR0 OVERFLOW(8ビットカウンタ) オーバーフロー周期 = 256 × ( 1 ÷ 入力周波数 ) × プリスケール値
 例:入力64Hz、プリスケーラ無し → 256 × 1/64 = 4 秒

TMR0電卓

割り込みルーチンの定型(設問5)

ISR TEMPLATE void __interrupt isr(void){  INTCONbits.GIE = 0;   // (a) 全割り込みを禁止  INTCONbits.TMR0IF = 0; // (b) 割り込みフラグをクリア  counter++;  INTCONbits.GIE = 1;   // (c) 全割り込みを許可  return; }

「禁止 → フラグクリア → 処理 → 許可」の順番。フラグは1を立てるのではなく0でクリアする点が引っかけになります(選択肢に TMR0IF = 1 が混ざっています)。

スイッチによる2つの動作モード

スイッチS実行される行割り込みD8PORTB が示すもの
閉(RA1=0)12〜17可能(INTCON=0xA0)消灯(RA0=0)タイマー0の割り込み回数値
開(RA1=1)18〜24不可能(INTCON=0x00)点灯(RA0=1)TMR0の値=パルスの周波数

設問6(ウ):Sが開いているとき、__delay_ms(1000) の1秒間に64Hzのパルスが64回入るので TMR0 = 64。2進数では 0100 0000 なので、点灯するのは D6 だけです。

0x09

PWM

中間テスト2 問4と小テストの記述問題。式を2本覚えて、周期→PRx、デューティ→CCPRxL の往復ができれば完成です。

PWM PERIOD PWM周期 = ( PRx + 1 ) × 4 × Tosc × プリスケール値

DUTY TIME デューティ時間 = ( CCPRxL + 1 ) × 4 × Tosc × プリスケール値

DUTY RATIO ─ 約分すると全部消える デューティ比 = ( CCPRxL + 1 ) ÷ ( PRx + 1 )
デューティ比に Fosc とプリスケーラは効かない 比を取ると 4 × Tosc × プリスケール値 が分子分母で約分されて消えます。つまり CCPRxL を求める問題では、Fosc や プリスケール値が与えられていても使いません。問題文の数字を全部使おうとすると迷います。

PWM電卓

逆算:目標のPWM周波数から PRx を求める

実際に出た計算

条件答え
Fosc=4MHz, PRx=255, 分周4 → PWM周期256 × 4 × 0.25μs × 41.024 ms
Fosc=8MHz, 分周4, PWM=2kHz → PRx500μs ÷ (4×0.125μs×4) − 1249
PRx=255, デューティ比0.5 → CCPRxL0.5 × 256 − 1127
解答キーとのズレ ─ 先生に確認する価値あり 公式どおり計算すると上の表の値になりますが、配布資料と小テストの解答は次のようにズレています。
・中間2 問4のスライドは PWM周期を 1.096 ms と記載(式のとおりに計算すると 256×4×0.25μs×4 = 1.024 ms
・小テスト問題1の解答キーは CCPRxL = 117(デューティ比の式からは 0.5×256−1 = 127
どちらも1桁だけの違いなので誤植の可能性が高いですが、記述で出た場合は式を書いて過程を示すのが安全です。選択式なら資料側の値が選択肢に並ぶこともあるので、両方の数字を頭に入れておいてください。
0x0A

演習

クリックで答えが開きます。まず紙に書いてから開いてください。過去に実際に出題された問題と、同じ考え方で作った類題を混ぜています。

クロック・スペック

Q01Fosc = 2MHz のとき、システムクロックサイクル時間と命令実行サイクル時間は?開く
0.5 μs / 2 μsTosc = 1÷(2×10⁶) = 0.5μs。命令は4クロックなので 4×0.5 = 2μs。
Q02命令実行サイクル時間が 0.8μs のマイコンの動作周波数は?開く
5 MHzTosc = 0.8÷4 = 0.2μs。Fosc = 1÷0.2μs = 5MHz。
Q03PIC16F1827 の命令長・データ幅・1命令の実行サイクルは?開く
14ビット / 8ビット / 4クロックサイクル命令長14とデータ幅8を取り違えやすい。データ幅8なので unsigned char が基本型になる。
Q04Fosc = 16MHz のとき、1000命令を実行するのにかかる時間は?開く
250 μsTcy = 4÷16MHz = 0.25μs。0.25μs × 1000 = 250μs。

レジスタとビット計算

Q05RB1, RB2, RB4, RB5 を出力、その他を入力にする。レジスタ名と16進数の値は?開く
TRISB = 0xC9出力にするビットが0。bit7〜0 = 1,1,0,0,1,0,0,1 → 1100 1001 → 0xC9。
Q06RA1, RA2, RA4, RA5 だけディジタル、その他をアナログにする。レジスタ名と値は?開く
ANSELA = 0xC9ANSELは1がアナログ、0がディジタル。ディジタルにする bit1,2,4,5 を0にして 1100 1001 → 0xC9。TRISと同じ値になるが理由は別物。
Q07RB0〜RB3 を出力、その他を入力にするときの TRISB の値は?開く
0xF01111 0000。中間1 問6そのまま。
Q08RA0, RA1, RA2, RA4 を入力、その他を出力にするときの TRISA の値は?開く
0x170001 0111。中間1 問7。
Q09内部オシレータの周波数を設定するレジスタ名は? Bポートをディジタルにするレジスタ名は?開く
OSCCON / ANSELBデバイスパラメータの疑似命令は #pragma config、ポートのデータは PORTA / PORTB。
Q10OSCCON = 0x62 のとき、発振器の種類・クロック周波数・4倍PLLの有無は?開く
内部オシレータ / 2 MHz / PLL 使用無し0110 0010。bit7=0でPLL不使用、IRCF=1100で2MHz、SCS=10で内部。
Q11OSCCON = 0x6A のときのクロック周波数は?開く
4 MHz0110 1010。IRCF=1101 → 4MHz。中間2のプログラムは _XTAL_FREQ 4000000 なので辻褄が合う。

回路図

Q12プルアップ抵抗の値として適切なのは 100Ω / 200Ω / 300Ω / 10kΩ のどれ?開く
10 kΩプルアップは電位を決めるだけで電流を流す必要がないので大きい値。小さい抵抗はLED用。
Q13プルアップされたスイッチが開いているとき、ピンの状態は? 閉じているときは?開く
開=高電位(1) / 閉=低電位(0)閉じると GND に落ちる。中間2の if(PORTAbits.RA1 == 1) が「Sが開いているとき」に対応する理由。
Q14電源5V、LEDの順方向電圧2V、15mA流したいときの制御抵抗は?開く
200 Ω(5−2)÷0.015 = 200Ω。20mAなら150Ω、10mAなら300Ω。
Q15LEDのアノードが+5V側、カソードが抵抗経由でピンに繋がっている。点灯させるにはピンをどうする?開く
低電位(0)にするシンク型。中間2のLED DA がこれで、PORTAbits.RA2 = 0; で点灯する。
Q16スイッチS0が押されているとき、電源端子(+5V)からの電流はどこへ流れる?開く
R0の抵抗を経由してGNDに流れる中間1 問8。スイッチが閉じると抵抗→スイッチ→GNDの経路ができる。

7セグメントLED

Q17カソードコモン型で PORTB に 0xCF を出力した。点灯するセグメントは?開く
DP, g, d, c, b, a(f と e は消灯)1100 1111。RB7=DP, RB6=g, RB5=f, RB4=e, RB3=d, RB2=c, RB1=b, RB0=a。「3.」の形。
Q18同じ回路で「7」を表示したい(DPは消灯)。PORTB に出力する値は?開く
0x07a, b, c だけ点灯 → 0000 0111。数字を作る練習は応用問題対策になる。

A/D変換

Q19ADCON0 = 0x01 のとき、チャンネル・変換処理・ADCの有効性は?開く
AN0 / 変換終了(修了) / 有効0000 0001。CHS=00000でAN0、GO/DONE=0で終了、ADON=1で有効。
Q20ADCON1 = 0x80 のとき、変換結果形式・変換クロック・VREF+・VREF− は?開く
右詰め / FOSC/2 / VDD / VSS1000 0000。ADFM=1で右詰め、ADCS=000でFOSC/2、ADNREF=0でVSS、ADPREF=00でVDD。
Q21可変抵抗をアナログ入力に使う回路で ANSELA に入れる値は?(RA0のみアナログ)開く
0x010000 0001。RA0だけ1(アナログ)。同時に TRISA = 0x13(RA0,RA1,RA4が入力)。
Q22ADRESL = 0xA0 のとき、入力電圧と点灯するLEDは?開く
約 3.1 V / D0〜D3 が点灯res=160。vin = 5×160÷256 = 3.125V。1.5 < 3.125 ≦ 3.5 なので PORTB = 0x0F。
Q23ADRESL = 0xFF のときは?開く
約 4.98 V / 全LED点灯(PORTB = 0xFF)5×255÷256 = 4.98V。3.5Vを超えるので最後の else。
Q24行15の __delay_us(20) の目的は?開く
サンプルホールドキャパシタが充電される変換開始はその次の行。「A/D変換が行われる」を選ばないこと。

割り込み・タイマー

Q25INTCON = 0xA0 のとき、有効な割り込みは?開く
タイマー0のオーバーフロー割り込み1010 0000 → GIE=1, TMR0IE=1。他は全部0。
Q26OPTION_REG = 0x28 のとき、TMR0の入力源・カウントするエッジ・プリスケーラの接続は?開く
外部(RA4端子)/ 立上り / 接続なし0010 1000 → TMR0CS=1(外部)、TMR0SE=0(立上り)、PSA=1(TMR0に接続しない)。
Q27同じ 0x28 で、割り込み要因のエッジ(INTEDG)は?開く
立下りbit6 = 0。Q26の「立上り」と混同しやすいので、どのビットを聞かれているか確認する。
Q28TMR0の入力周波数が 64Hz、プリスケーラ無しのとき、割り込みは何秒ごとに発生する?開く
約 4 秒8ビットなので256カウントでオーバーフロー。256 × 1/64 = 4秒。
Q29入力 1kHz、プリスケール値 8 のとき、オーバーフロー周期は?開く
約 2.048 秒256 × (1/1000) × 8 = 2.048秒。
Q30割り込みルーチンの (a)(b)(c) に入る記述は?開く
(a) INTCONbits.GIE = 0 / (b) INTCONbits.TMR0IF = 0 / (c) INTCONbits.GIE = 1禁止→フラグクリア→処理→許可。フラグは0でクリアする。
Q31Sが開いているとき、メインループを1度実行し終えた時点の TMR0 の値と点灯するLEDは?(4MHz / 外部64Hz)開く
TMR0 = 64 / D6 のみ点灯(D8も点灯)__delay_ms(1000) の1秒で64パルス。64 = 0100 0000 なので D6 だけ。PORTAbits.RA0 = 1 により D8 は点灯。
Q32行18〜24を実行しているとき、割り込みは可能か?開く
不可能直前の行20で INTCON = 0x00 にしてGIEを含む全ビットを0にしているため。

PWM

Q33Fosc=8MHz、プリスケール値4で 2kHz の PWM を作りたい。PRx の値は?開く
249周期 = 1/2kHz = 500μs。Tosc = 0.125μs。500 = (PR+1)×4×0.125×4 = (PR+1)×2 → PR+1 = 250 → PR = 249。
Q34PRx=255 でデューティ比 0.5 にしたい。CCPRxL の値は?開く
127(公式どおりの計算値)(CCPRxL+1)/(255+1) = 0.5 → CCPRxL+1 = 128 → 127。Fosc やプリスケール値は約分で消えるので使わない。※小テストの解答キーは117と表示されているため、講義での確認を推奨。
Q35Fosc=4MHz、PRx=255、プリスケール値4 のときの PWM 周期は?開く
1.024 ms(式どおりの計算値)256 × 4 × 0.25μs × 4 = 1024μs。※配布スライドの記載は 1.096ms。式を書いて過程を示すのが安全。

XC8の記述

Q36PORTB << 4; は正しいか?開く
構文エラーではないが代入先がないので結果が捨てられる。PORTB = PORTB << 4; とする。
Q37TRISAbits.RB4 = 1; は正しいか?開く
TRISA は RAx 専用。RB4 を設定するなら TRISBbits.RB4
Q38for文で300回ループさせるとき、カウンタに unsigned char を使ってよいか?開く
8ビットなので0〜255。300に到達できず無限ループになる。unsigned int を使う。
Q39フローチャートの「z を1ビット左シフトした結果を PORTB に格納」に対応するC言語の記述は?開く
PORTB = z << 1;「Bポートを出力設定」は TRISB = 0x00;、「1秒の遅延」は __delay_ms(1000);
Q40a = PORTA & 0x03; で PORTA = 0xFA のとき、a の値は?開く
0x021111 1010 AND 0000 0011 = 0000 0010。下位2ビットだけを取り出すマスク。
0x0B

直前チェック

試験開始直後、問題を読む前に余白へ書き出しておくと迷いが減るものです。

  • 1Tosc = 1/Fosc、Tcy = 4/Fosc(4倍を忘れない)
  • 2TRIS は 1=入力 / 0=出力、ANSEL は 1=アナログ / 0=ディジタル
  • 3ビット位置の定規:7 6 5 4 3 2 1 0 を先に書いてから0/1を埋める
  • 47セグの並び:DP g f e d c b a(RB7→RB0)
  • 5LEDは図で向きを確認してから点灯条件を決める
  • 6LED制御抵抗 R = (5−2)/I、プルアップは10kΩ級
  • 7プルアップのスイッチ:開=高電位=1、閉=低電位=0
  • 8ADCON0 の下位2ビット:GO/DONE、ADON。上位が CHS でチャンネル番号
  • 9ADCON1 の bit7 ADFM:1=右詰め
  • 10vin = 5 × res ÷ 256、しきい値 1.5V / 3.5V → 0x03 / 0x0F / 0xFF
  • 11INTCON:GIE PEIE TMR0IE INTE IOCIE TMR0IF INTF IOCIF
  • 12TMR0オーバーフロー = 256 × (1/f) × プリスケール値
  • 13ISR は 禁止 → フラグ0クリア → 処理 → 許可
  • 14PWM周期 = (PRx+1)×4×Tosc×分周、デューティ比 = (CCPRxL+1)/(PRx+1)
  • 15デューティ比の問題で Fosc と分周は使わない