2009年8月18日,新潟大学 「情報」と「ものづくり」 の実践教育3 下保敏和,佐藤亮一
試験について 重要 のページを要チェックしてください. PIC回路,プログラムが完成しなくても,合否には関係ありません
本日の内容 午前 9:20-10:10 論理演算(NOT, AND, OR) 10:20-11:10 プログラム説明(論理演算,テーブル処理) 11:20-12:10 演習 午後 13:20-14:10 モータを用いる回路の説明 (ドライブ能力,入力ポートについて) 14:20-15:10 回路作成 15:20-16:10 (プログラム作成(条件文),説明) 16:20-17:00 試験
午前の目次 論理演算 論理演算のプログラム解説 テーブル処理のプログラム解説 演習
午前の目次 論理演算 論理演算のプログラム解説 テーブル処理のプログラム解説 演習
1.論理演算 重要 否定(NOT)演算 論理積(AND)演算 論理和(OR)演算 A OUT 1 A B OUT 1 A B OUT 1
1.論理演算 重要 否定(NOT)演算 論理積(AND)演算 論理和(OR)演算 1011 0110 1011 0110 1011 0110 1111 0000 1111 0000 0100 1001 1011 0000 1111 0110
午前の目次 論理演算 論理演算のプログラム解説 テーブル処理のプログラム解説 演習
2.論理演算のプログラム sample-84-not.c 否定(NOT)を用いたプログラム例 for(;;) { pb = 1; for (i=0; i<13 ; i++) { PORTB = ~pb; PORTA = ~pb >> 8; timer_wait(INTERVAL); pb <<= 1; } pb = 1; 8ビットだと 0000 0001 PORTB = ~pb; により,以下のようになる. 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 NOT PORTB 7 6 5 4 3 2 1 0 1 1 1 1 1 1 1 0 0がON,1がOFF 点滅が逆になる 実際には,PORTA(0-4), PORTB (0-7)の 合計13個のLEDが点滅する.
2.論理演算のプログラム sample-84-logic.c 論理積(AND), 論理和(NOT)を用いたプログラム例 for(;;) { /* * and & , or | , not ~ * shift left << , shift right >> */ /* on from low bit*/ PORTB = 0xff; PORTA = 0x1f; pb = 1; for (i=0; i<13 ; i++) { PORTB &= ~pb; PORTA &= ~(pb >> 8); timer_wait(INTERVAL); pb <<= 1; } /* off from high bit */ pb = 0x1000; for (i=0; i<13 ; i++) { PORTB |= pb; PORTA |= pb >> 8; timer_wait(INTERVAL); pb >>= 1; }
2.論理演算のプログラム sample-84-logic.c 前半 論理積(AND), 論理和(NOT)を用いたプログラム例 for(;;) { /* * and & , or | , not ~ * shift left << , shift right >> */ /* on from low bit*/ PORTB = 0xff; PORTA = 0x1f; pb = 1; for (i=0; i<13 ; i++) { PORTB &= ~pb; PORTA &= ~(pb >> 8); timer_wait(INTERVAL); pb <<= 1; } PORTB = 0xff; PORTA = 0x1f; PORTBとPORTAの初期値 PORTA PORTB 0001 1111 1111 1111
2.論理演算のプログラム sample-84-logic.c 前半 論理積(AND), 論理和(NOT)を用いたプログラム例 for(;;) { /* * and & , or | , not ~ * shift left << , shift right >> */ /* on from low bit*/ PORTB = 0xff; PORTA = 0x1f; pb = 1; for (i=0; i<13 ; i++) { PORTB &= ~pb; PORTA &= ~(pb >> 8); timer_wait(INTERVAL); pb <<= 1; } pb = 1; 変数pbに 0000 0001 を代入
2.論理演算のプログラム sample-84-logic.c 前半 論理積(AND), 論理和(NOT)を用いたプログラム例 for(;;) { /* * and & , or | , not ~ * shift left << , shift right >> */ /* on from low bit*/ PORTB = 0xff; PORTA = 0x1f; pb = 1; for (i=0; i<13 ; i++) { PORTB &= ~pb; PORTA &= ~(pb >> 8); timer_wait(INTERVAL); pb <<= 1; } PORTB &= ~pb; 変数pbのNOT値 1111 1110とPORTBの初期値とのAND演算 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 AND 1 1 1 1 1 1 1 0
2.論理演算のプログラム sample-84-logic.c 前半 論理積(AND), 論理和(NOT)を用いたプログラム例 for(;;) { /* * and & , or | , not ~ * shift left << , shift right >> */ /* on from low bit*/ PORTB = 0xff; PORTA = 0x1f; pb = 1; for (i=0; i<13 ; i++) { PORTB &= ~pb; PORTA &= ~(pb >> 8); timer_wait(INTERVAL); pb <<= 1; } PORTA &= ~(pb >> 8); 変数pbの8ビット右シフトのNOT値 11111111値と,PORTAの初期値とのAND演算 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 AND 0 0 0 1 1 1 1 1 PORTA PORTB 0001 1111 1111 1110 よって,1回目のループでの PORTA, PORTBの値は
2.論理演算のプログラム sample-84-logic.c 前半 論理積(AND), 論理和(NOT)を用いたプログラム例 for(;;) { /* * and & , or | , not ~ * shift left << , shift right >> */ /* on from low bit*/ PORTB = 0xff; PORTA = 0x1f; pb = 1; for (i=0; i<13 ; i++) { PORTB &= ~pb; PORTA &= ~(pb >> 8); timer_wait(INTERVAL); pb <<= 1; } pb<<=1; 変数pbの値を左に1ビットシフト 0000 0010
2.論理演算のプログラム sample-84-logic.c 前半 論理積(AND), 論理和(NOT)を用いたプログラム例 for(;;) { /* * and & , or | , not ~ * shift left << , shift right >> */ /* on from low bit*/ PORTB = 0xff; PORTA = 0x1f; pb = 1; for (i=0; i<13 ; i++) { PORTB &= ~pb; PORTA &= ~(pb >> 8); timer_wait(INTERVAL); pb <<= 1; } PORTB &= ~pb; 変数pbのNOT値 1111 1101とPORTBの値とのAND演算 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 AND 1 1 1 1 1 1 0 0
2.論理演算のプログラム sample-84-logic.c 前半 論理積(AND), 論理和(NOT)を用いたプログラム例 for(;;) { /* * and & , or | , not ~ * shift left << , shift right >> */ /* on from low bit*/ PORTB = 0xff; PORTA = 0x1f; pb = 1; for (i=0; i<13 ; i++) { PORTB &= ~pb; PORTA &= ~(pb >> 8); timer_wait(INTERVAL); pb <<= 1; } PORTA &= ~(pb >> 8); 変数pbの8ビット右シフトのNOT値 11111111値と,PORTAの初期値とのAND演算 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 AND 0 0 0 1 1 1 1 1 PORTA PORTB 0001 1111 1111 1100 よって,2回目のループでの PORTA, PORTBの値は
2.論理演算のプログラム sample-84-logic.c 前半 論理積(AND), 論理和(NOT)を用いたプログラム例 for(;;) { /* * and & , or | , not ~ * shift left << , shift right >> */ /* on from low bit*/ PORTB = 0xff; PORTA = 0x1f; pb = 1; for (i=0; i<13 ; i++) { PORTB &= ~pb; PORTA &= ~(pb >> 8); timer_wait(INTERVAL); pb <<= 1; } 以上を繰り返すと, PORTA PORTB 0001 1111 1111 1100 1回目 0001 1111 1111 1100 2回目 3回目 0001 1111 1111 1000 0001 0000 0000 0000 12回目 0000 0000 0000 0000 13回目
2.論理演算のプログラム sample-84-logic.c 後半 論理積(AND), 論理和(NOT)を用いたプログラム例 for(;;) { /* off from high bit */ pb = 0x1000; for (i=0; i<13 ; i++) { PORTB |= pb; PORTA |= pb >> 8; timer_wait(INTERVAL); pb >>= 1; } pb = 0x1000; 変数pbに 0001 0000 0000 0000 を代入
2.論理演算のプログラム sample-84-logic.c 後半 論理積(AND), 論理和(NOT)を用いたプログラム例 for(;;) { /* off from high bit */ pb = 0x1000; for (i=0; i<13 ; i++) { PORTB |= pb; PORTA |= pb>>8 ; timer_wait(INTERVAL); pb >>= 1; } PORTB |= pb; 変数pbの値 0001 0000 0000 0000とPORTBの値とのOR演算 0001 0000 0000 0000 0000 0000 0000 0000 OR 0001 0000 0000 0000
2.論理演算のプログラム sample-84-logic.c 後半 論理積(AND), 論理和(NOT)を用いたプログラム例 for(;;) { /* off from high bit */ pb = 0x1000; for (i=0; i<13 ; i++) { PORTB |= pb; PORTA |= pb>>8 ; timer_wait(INTERVAL); pb >>= 1; } PORTA |= pb>>8; 変数pbの値の8ビット右シフトした値 0000 0000 0001 0000とPORTAの値との OR演算 0000 0000 0001 0000 0000 0000 0000 0000 OR 0000 0000 0001 0000 PORTA PORTB 0001 0000 0000 0000 よって,1回目のループでの PORTA, PORTBの値は
2.論理演算のプログラム sample-84-logic.c 後半 論理積(AND), 論理和(NOT)を用いたプログラム例 for(;;) { /* off from high bit */ pb = 0x1000; for (i=0; i<13 ; i++) { PORTB |= pb; PORTA |= pb>>8 ; timer_wait(INTERVAL); pb >>= 1; } 以上を繰り返すと, PORTA PORTB 0001 0000 00000 0000 1回目 0001 1000 0000 0000 2回目 3回目 0001 1100 0000 0000 0001 1111 1111 1110 12回目 0001 1111 1111 1111 13回目
午前の目次 論理演算 論理演算のプログラム解説 テーブル処理のプログラム解説 演習
2.論理演算のプログラム 重要 sample-84-table.c tableを用いたプログラム例 static unsigned char tbl[] = { /* Capital: OFF , small: ON */ /* PA PB */ 0x1f, 0xff, /* G GGGG RRRR RRRR */ 0x0a, 0xaa, /* g GgGg RrRr RrRr */ 0x15, 0x55, /* G gGgG rRrR rRrR */ 0x1f, 0x00, /* G GGGG rrrr rrrr */ 0x00, 0xff, /* g gggg RRRR RRRR */ 0x00, 0x00, /* g gggg rrrr rrrr */ }; for (;;) { for(i=0;i<sizeof(tbl);i+=2) { PORTA = tbl[i]; PORTB = tbl[i+1]; #define INTERVAL 0x2000 timer_wait(INTERVAL); }
2.論理演算のプログラム 重要 sample-84-table.c tableを用いたプログラム例 配列スタート PORTA PORTB 2つ進む for(i=0;i<sizeof(tbl);i+=2) { PORTA = tbl[i]; PORTB = tbl[i+1]; #define INTERVAL 0x2000 timer_wait(INTERVAL); }
午前の目次 論理演算 論理演算のプログラム解説 テーブル処理のプログラム解説 演習
午前の部 終わり
本日の内容 午前 9:20-10:10 論理演算(NOT, AND, OR) 10:20-11:10 プログラム説明(論理演算,テーブル処理) 11:20-12:10 演習 午後 13:20-14:10 モータを用いる回路の説明 (ドライブ能力,入力ポートについて) 14:20-15:10 回路作成 15:20-16:10 (プログラム作成(条件文),説明) 16:20-17:00 試験
午後の目次 ドライブ能力について 回路作成 プログラム解説(入力) 演習
午後の目次 ドライブ能力について 回路作成 プログラム解説(入力) 演習
モータを接続した回路図 重要 5V: 信号の電源 3V: モータの電源 信号の電源ライン モータの電源ライン M アースライン
モータを接続した回路 重要 LED: 10mA程度 モータ: 300mA程度 ここの電流は? M トランジスタは大丈夫?
トランジスタ特性 2SC1815 LED: 10mA程度 モータ: 300mA程度
FET特性 2SK2231 LED: 10mA程度 モータ: 300mA程度
PICの出力特性 16F84A (はき出し)
PICの出力特性 16F84A (吸い込み)
トランジスタとFET ベース,エミッタ,コレクタ ゲート,ソース,ドレイン
モータを接続した回路図(Tr) M
モータを接続した回路(FET) 重要 M M
午後の目次 ドライブ能力について 回路作成 プログラム解説(入力) 演習
FET
午後の目次 ドライブ能力について 回路作成 プログラム解説(入力) 演習
3.入力を含んだプログラム 1ビット(RA0)を入力に用いたプログラム例 sample-84-motor.c TRISA = 0x00; /* 4-0 output */ PORTA = 0xff; TRISB = 0x01; /* 7-1 output, 0 input input/interrupt */ PORTB = 0xfe; 0000 0000 0000 0000 0000 0000 0000 0001 入力
3.入力を含んだプログラム 1ビット(RA0)を入力に用いたプログラム例 sample-84-motor.c #define INTERVAL 6000 #define NO_ACTION 400 for(;;) { RA0 = 1; /* motor ON */ timer_wait(INTERVAL); RA0 = 0; /* motor OFF */ button_wait(); timer_wait(NO_ACTION); } 一定時間駆動 スイッチONで駆動 スイッチOFFでストップ
午後の目次 ドライブ能力について 回路作成 プログラム解説(入力) 演習
午後の部 終わり