บทที่ 3 การรับ และส่งข้อมูลจากภายนอก และการเขียนโปรแกรม

Download Report

Transcript บทที่ 3 การรับ และส่งข้อมูลจากภายนอก และการเขียนโปรแกรม

บทที่ 3
การรับ และส่ งข้ อมูลจากภายนอก และการเขียน
โปรแกรม
เทอดศักดิ์ ลิ่วหาทอง
สาขาวิชาอิเล็กทรอนิกส์
สถาบันเทคโนโลยีพระจอมเกล้ าเจ้ าคุณทหาร
ลาดกระบัง
I/O Ports
• Digital I/O Ports
• Analog to Digital
Converter Port
• Pulse Width Modulation
(PWM) Ports
I/O Ports
• PIC มี I/O Port ชนิดต่างๆเพื่อใช้
ติดต่อกับอุปกรณ์ตอ่ พ่วงผ่าน เช่น
5
ADC
Ports
5 Analog Input
5 Thermal
Sensors
8
Digital
Output
Ports
8 bits Digital Output
8x8
LED Display
4 Digital
Output
Ports
4 bits Digital Output
4 Digital
Input
Ports
4 bits Digital input
PWM
Port
Pulse Width Modulation
PIC18F8722
Keyboard
AC Servo
Motor
โครงสร้างของ I/O Ports
• ทุก Port ของ PIC สามารถกาหนดให้ เป็ น
Input หรื อ Output Port ก็ได้
• ทุก Port จะมี Register อยู่ 3 ตัวคือ
– TRIS Register ใช้ กาหนดให้ Port เป็ น
Input (TRIS=1) และ Output
(TRIS=0)
– Port Register ใช้ เก็บค่าที่อา่ นได้ จาก
อุปกรณ์ตอ่ พ่วง
– LAT Register ใช้ เก็บค่าที่จะส่งไปให้
อุปกรณ์ตอ่ พ่วง
ข้อห้ามของการนาเอา Output กับ Output
มาต่อเชื่อมกัน
• การออกแบบวงจรดิจิตอล ห้ ามไม่ให้ Output ของ
เกทมาต่อเชื่อมกัน
• เช่นถ้ า Output ของ Not Gate ตัวบนเป็ น 1
และตัวล่างเป็ น 0 จะทาให้ ไม่สามารถบอกได้ วา่ Y มี
สถานะเป็ น 1 หรื อ 0
• และโดยปกติจะทาให้ Not Gate พังเสียหายได้
Tristate Buffer
• ถ้ าต้ องการนา Output ของวงจรดิจิตอลมา
ต่อเชื่อมกันจะต้ องต่อผ่าน Tristate
Buffer เสมอ
• ถ้ าขา Enable เป็ น 0 จะทาให้ Output มี
สถานะเป็ นไปตามสถานะของ Input
• แต่ถ้าขา Enable เป็ น 1 จะทาให้
Output มีสถานะเป็ น High
Impedance
Tristate Buffer
โครงสร้างของ I/O Ports
• ถ้ าต้ องการให้ Port เป็ น Input Port
จะต้ องเซ็ทให้ TRIS = 1 เพื่อให้
Output ของ Tristate Buffer ตัว
บนเป็ น High Impedance เพื่อตัด
การเชื่อมต่อของ LAT ออกจากอุปกรณ์ตอ่
พ่วงที่อยูภ่ ายนอก
• ถ้ าต้ องการให้ Port เป็ น Output
Port จะต้ องให้ TRIS = 0 เพื่อให้
Output ของ Tristate Buffer มี
สถานะเดียวกับสถานะของ LAT
โครงสร้างของ I/O Ports
I/O Port ของ PIC18F8722
R A 0 -R A 7
•
•
•
•
•
•
PWR = Power Supply
O = Output
I = Input
ANA = Analog Signal
DIG = Digital Output
ST = Schmitt Buffer
Input
P IC 1 8 F 8 7 2 2
• TTL = TTL Buffer Input
• X = Don’t Care
R B 0 -R B 7
R C 0 -R C 7
R D 0 -R D 7
R E 0 -R E 7
R F 0 -R F 7
R G 0 -R G 5
R H 0 -R H 7
R J 0 -R J 7
I/O Port ของ PIC18F8722
R A 0 -R A 7
R B 0 -R B 7
R C 0 -R C 7
R D 0 -R D 7
R E 0 -R E 7
R F 0 -R F 7
R G 0 -R G 5
R H 0 -R H 7
P IC 1 8 F 8 7 2 2
R J 0 -R J 7
I/O Port ของ PIC18F8722
R A 0 -R A 7
R B 0 -R B 7
R C 0 -R C 7
R D 0 -R D 7
R E 0 -R E 7
R F 0 -R F 7
R G 0 -R G 5
R H 0 -R H 7
P IC 1 8 F 8 7 2 2
R J 0 -R J 7
I/O Port ของ PIC18F8722
R A 0 -R A 7
R B 0 -R B 7
R C 0 -R C 7
R D 0 -R D 7
R E 0 -R E 7
R F 0 -R F 7
R G 0 -R G 5
R H 0 -R H 7
P IC 1 8 F 8 7 2 2
R J 0 -R J 7
I/O Port ของ PIC18F8722
R A 0 -R A 7
R B 0 -R B 7
R C 0 -R C 7
R D 0 -R D 7
R E 0 -R E 7
R F 0 -R F 7
R G 0 -R G 5
R H 0 -R H 7
P IC 1 8 F 8 7 2 2
R J 0 -R J 7
I/O Port ของ PIC18F8722
R A 0 -R A 7
R B 0 -R B 7
R C 0 -R C 7
R D 0 -R D 7
R E 0 -R E 7
R F 0 -R F 7
R G 0 -R G 5
R H 0 -R H 7
P IC 1 8 F 8 7 2 2
R J 0 -R J 7
I/O Port ของ PIC18F8722
R A 0 -R A 7
R B 0 -R B 7
R C 0 -R C 7
R D 0 -R D 7
R E 0 -R E 7
R F 0 -R F 7
R G 0 -R G 5
R H 0 -R H 7
P IC 1 8 F 8 7 2 2
R J 0 -R J 7
I/O Port ของ PIC18F8722
R A 0 -R A 7
R B 0 -R B 7
R C 0 -R C 7
R D 0 -R D 7
R E 0 -R E 7
R F 0 -R F 7
R G 0 -R G 5
R H 0 -R H 7
P IC 1 8 F 8 7 2 2
R J 0 -R J 7
I/O Port ของ PIC18F8722
R A 0 -R A 7
R B 0 -R B 7
R C 0 -R C 7
R D 0 -R D 7
R E 0 -R E 7
R F 0 -R F 7
R G 0 -R G 5
R H 0 -R H 7
P IC 1 8 F 8 7 2 2
R J 0 -R J 7
#include <p18f8722.h>
#include <adc.h>
#include <delays.h>
#include <timers.h>
ADCON1 = 0b00001110;
TRISAbits.TRISA5 = 1;
TRISBbits.TRISB0 = 1;
TRISD = 0;
PORTD = 1;
#define NUMBER_OF_LEDS 8
while(1)
{
#pragma code
if(PORTAbits.RA5==0)
{
i++;
if(i==8) i=7;
PORTD = LED[i];
while(PORTAbits.RA5==0);
}
void main(void)
{
char LED[] = {
0b00000001,
0b00000011,
0b00000111,
0b00001111,
0b00011111,
0b00111111,
0b01111111,
0b11111111
if(PORTBbits.RB0==0)
{
i--;
if(i<0) i=0;
PORTD = LED[i];
while(PORTBbits.RB0==0);
}
};
int i=0;
}
}
#include <p18f8722.h>
#include <adc.h>
#include <delays.h>
#include <timers.h>
ADCON1 = 0b00001110;
TRISAbits.TRISA5 = 1;
TRISBbits.TRISB0 = 1;
TRISD = 0;
PORTD = 1;
#define NUMBER_OF_LEDS 8
while(1)
{
#pragma code
if(PORTAbits.RA5==0)
{
i++;
if(i==8) i=7;
PORTD = LED[i];
while(PORTAbits.RA5==0);
}
void main(void)
{
char LED[] = {
0b00000001,
0b00000011,
0b00000111,
0b00001111,
0b00011111,
0b00111111,
0b01111111,
0b11111111
if(PORTBbits.RB0==0)
{
i--;
if(i<0) i=0;
PORTD = LED[i];
while(PORTBbits.RB0==0);
}
};
int i=0;
}
}