UART system(connection 2 PIC)
Seperti yg anda semua tahu... PIC banyak menyediakan ciri-ciri khas hanya untuk menyenangkan kita sebagai pengunanya... antaranya adalah Universal asynchronous receiver/transmitter(UART)... UART bertindak untuk memberi hubungan selari(serial connection) subsytem bagi komputer... dengan kata mudah dan terangnya mesej(binary 5v~0v) akan dihantar melalui satu wayar sahaja( kalau parallel banyak wayar)... satu wayar untuk transmitter dan satu wayar untuk receiver... receiver pula akan menerima mesej ini dalam bit yg sempurna(decode mesej uart).... biasanya UART digunakan untuk connection PIC dengan PIC lain, terminal,komputer dan lain-lain peralatan...
Baud rate
Apabila binary(contoh:11010101) dihantar melalui connection selari sudah tentu ada masa yg membezakan antara setiap bit(contoh: 1<masa>1<masa>0<masa>1)..... masa ni teorinya dipanggil clock atau baud rate... baud rate mesti sama diantara transmitter dan receiver... kerana receiver perlu tahu bila bit yg seterunya harus dibaca.. jadi binary yg dihantar melalui transmitter akan diterima dengan baiknya oleh receiver dan akan dicode kan kepada mesej yg betul....
Connection
Banyak jenis connection bagi PIC dan peralatan lain(contoh:komputer,gsm modem) seperti melalui wayar rs232:
atau micro uart cable(macam cable dari handset(android) korang ke computer):
untuk connection sesama pic guna wayar biasa jek... :)
Program CCS
dalam ccs memang ada cara yang mudah untuk mengaplikasikan uart nih... header yg digunakan adalah "#include <string.h>" dan "#include <UART.h>".. sebelum mulakan operasi uart nih kita kena hasilkan command pemberitahuan(transmitter dan receiver di kaki pin yg mane?) seperti "#use rs232 (baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=RS232,bits=8)" ..
sebelum mulakan process uart kita kena enable kannye dahulu "setup_uart(true); " dan disable "setup_uart(false);" bila-bila masa yg anda suka.. untuk transmit gunakan "putchar("mesej")" atau "printf("mesej");"
dan receive guna "getchar()" atau "scanf()"..
Contoh:
-connection diantara 2 pic...
PIC pertama(transmitter):
PIC kedua(receiver):
Litar dalam proteus:
Download:
p/s: (receiver) utk bace ayat yg penuh seperti 'LED1','LED2' mmg lah agak sukar.. tetapi kebiasaanya kita hanye perlu membace satu abjek sahaja seperti 'a','A','b','B' dan lain2.... selepas itu guna command "if" utk hasilkan process.... trima kasih.. :)
Baud rate
Apabila binary(contoh:11010101) dihantar melalui connection selari sudah tentu ada masa yg membezakan antara setiap bit(contoh: 1<masa>1<masa>0<masa>1)..... masa ni teorinya dipanggil clock atau baud rate... baud rate mesti sama diantara transmitter dan receiver... kerana receiver perlu tahu bila bit yg seterunya harus dibaca.. jadi binary yg dihantar melalui transmitter akan diterima dengan baiknya oleh receiver dan akan dicode kan kepada mesej yg betul....
Connection
Banyak jenis connection bagi PIC dan peralatan lain(contoh:komputer,gsm modem) seperti melalui wayar rs232:
atau micro uart cable(macam cable dari handset(android) korang ke computer):
untuk connection sesama pic guna wayar biasa jek... :)
Program CCS
dalam ccs memang ada cara yang mudah untuk mengaplikasikan uart nih... header yg digunakan adalah "#include <string.h>" dan "#include <UART.h>".. sebelum mulakan operasi uart nih kita kena hasilkan command pemberitahuan(transmitter dan receiver di kaki pin yg mane?) seperti "#use rs232 (baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=RS232,bits=8)" ..
sebelum mulakan process uart kita kena enable kannye dahulu "setup_uart(true); " dan disable "setup_uart(false);" bila-bila masa yg anda suka.. untuk transmit gunakan "putchar("mesej")" atau "printf("mesej");"
dan receive guna "getchar()" atau "scanf()"..
Contoh:
-connection diantara 2 pic...
PIC pertama(transmitter):
#include <18f4550.h>
#include <string.h>
#fuses HS,NOWDT,NOLVP,NOPROTECT
#use delay(clock=20M)
#define LCD_ENABLE_PIN PIN_D2
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#include <LCD.C>
#include <UART.h>
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=RS232,bits=8)
void main(){
lcd_init();
setup_uart(true);
while(true){
Printf(lcd_putc,"\ftransmitt\n message");
if(!input(pin_B0)){
Printf(lcd_putc,"\fLed1");
Printf("led1");
}
else if(!input(pin_B1)){
Printf(lcd_putc,"\fLed2");
Printf("led2");
}
else if(!input(pin_B2)){
Printf(lcd_putc,"\fLed3");
Printf("led3");
}
delay_ms(100);
}}
#include <string.h>
#fuses HS,NOWDT,NOLVP,NOPROTECT
#use delay(clock=20M)
#define LCD_ENABLE_PIN PIN_D2
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#include <LCD.C>
#include <UART.h>
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=RS232,bits=8)
void main(){
lcd_init();
setup_uart(true);
while(true){
Printf(lcd_putc,"\ftransmitt\n message");
if(!input(pin_B0)){
Printf(lcd_putc,"\fLed1");
Printf("led1");
}
else if(!input(pin_B1)){
Printf(lcd_putc,"\fLed2");
Printf("led2");
}
else if(!input(pin_B2)){
Printf(lcd_putc,"\fLed3");
Printf("led3");
}
delay_ms(100);
}}
PIC kedua(receiver):
#include <18f4550.h>
#include <string.h>
#fuses HS,NOWDT,NOLVP,NOPROTECT
#use delay(clock=20M)
#define LCD_ENABLE_PIN PIN_D2
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#include <LCD.C>
#include <UART.h>
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=RS232,bits=8)
void main(){
lcd_init();
setup_uart(true);
char a[4]={0};
int b=0;
Printf(lcd_putc,"\fReady to\nread");
while(true){
if(a[0]==0){
a[0]=getchar();
}
else if(a[0]!=0){
if(b==0){
Printf(lcd_putc,"\f%c",a[0]);
b+=1;
}
else if(b<=3){
a[b]=getchar();
Printf(lcd_putc,"%c",a[b]);
b+=1;
}
else{
if(a[0]=='l'&&a[1]=='e'&&a[2]=='d'&&a[3]=='1'){
Printf(lcd_putc,"\fled1");
output_high(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
}
else if(a[0]=='l'&&a[1]=='e'&&a[2]=='d'&&a[3]=='2'){
Printf(lcd_putc,"\fled2");
output_low(PIN_B0);
output_high(PIN_B1);
output_low(PIN_B2);
}
else if(a[0]=='l'&&a[1]=='e'&&a[2]=='d'&&a[3]=='3'){
Printf(lcd_putc,"\fled3");
output_low(PIN_B0);
output_low(PIN_B1);
output_high(PIN_B2);
}
b=0;
a[0]=0;
}
}
}}
#include <string.h>
#fuses HS,NOWDT,NOLVP,NOPROTECT
#use delay(clock=20M)
#define LCD_ENABLE_PIN PIN_D2
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#include <LCD.C>
#include <UART.h>
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=RS232,bits=8)
void main(){
lcd_init();
setup_uart(true);
char a[4]={0};
int b=0;
Printf(lcd_putc,"\fReady to\nread");
while(true){
if(a[0]==0){
a[0]=getchar();
}
else if(a[0]!=0){
if(b==0){
Printf(lcd_putc,"\f%c",a[0]);
b+=1;
}
else if(b<=3){
a[b]=getchar();
Printf(lcd_putc,"%c",a[b]);
b+=1;
}
else{
if(a[0]=='l'&&a[1]=='e'&&a[2]=='d'&&a[3]=='1'){
Printf(lcd_putc,"\fled1");
output_high(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
}
else if(a[0]=='l'&&a[1]=='e'&&a[2]=='d'&&a[3]=='2'){
Printf(lcd_putc,"\fled2");
output_low(PIN_B0);
output_high(PIN_B1);
output_low(PIN_B2);
}
else if(a[0]=='l'&&a[1]=='e'&&a[2]=='d'&&a[3]=='3'){
Printf(lcd_putc,"\fled3");
output_low(PIN_B0);
output_low(PIN_B1);
output_high(PIN_B2);
}
b=0;
a[0]=0;
}
}
}}
Litar dalam proteus:
(klik gambar untuk besarkan)
video:
Download:
Nota:Letak kedua-dua file nih dalam folder yg same korang letak program uart korang....
p/s: (receiver) utk bace ayat yg penuh seperti 'LED1','LED2' mmg lah agak sukar.. tetapi kebiasaanya kita hanye perlu membace satu abjek sahaja seperti 'a','A','b','B' dan lain2.... selepas itu guna command "if" utk hasilkan process.... trima kasih.. :)