Wednesday 16 September 2015

Teori - Universal asynchronous receive transmit (UART)

Post ini akan membincangkan dengan ringkas berkenaan dengan UART protocol.

UART - Universal Asynchronous Receiver and Transmitter merupakan serial protocol yang sangat berguna. Ia dilihat menjadi pilihan yang common untuk berkomunikasi dengan sistem komputer / Microcontroller.

Untuk kupasan lanjut berkenaan dengan teori UART, sila klik disini.

Cara guna printf() dalam XC8

The printf() function performs two main tasks: formatting of text, and printing this formatted text to stdout. The exact location of stdout is determined by a second function called putch(), which is called by printf() to output each character.
The printf() function performs the formatting and then calls a helper function, called putch, to send each byte of the formatted text. By default the putch() function is empty. It should be customised to suit the project at hand. By customizing the putch function you can have printf send data to any peripheral or location. The printf() function is used to print to USART, but it could define stdout to output to an LCD screen or SPI. Code to initialize the intended destination must be executed before printf() is called. [1]

Mengikut wikidot.com, kita boleh guna function printf() bagi menghantar mesej melalui UART.
Berikut adalah caranya:

1.    Masukkan header file berikut ke dalam program:


2.    Initialize UART dengan setting berikut:
Baud Rate = 9600bps
Data bit = 8
Dll
Contoh:

3.    Tambah function dibawah ini tanpa perlu prototype function.


4.    Seterusnya function printf() sudah tersedia untuk digunakan bersama dengan UART. Contoh aturcara klik disini


References

[1]
Microchip, "Wikidot.com," 17 April 2014. [Online]. Available: http://microchip.wikidot.com/faq:29. [Accessed 16 September 2015].
[2]
Microchip, "Microchip Technology Inc," 5 Aug 2012. [Online]. Available: ww1.microchip.com/downloads/en/DeviceDoc/52053B.pdf. [Accessed 19 Sep 2015].




Tuesday 25 August 2015

Cara guna ADC modul di dalam PIC8F4550

Post ini akan membincangkan ciri - ciri ADC modul yang terdapat di dalam PIC8F4550 serta menerangkan langkah - langkah untuk menggunakannya.

1) Teori ADC Modul di dalam PIC18F4550

Sila rujuk Rajah 1 dibawah bagi memudahkan pemahaman terhadap ADC modul.

Rajah 1: Gambarajah blok ADC

Daripada rajah 1, boleh diperhatikan terdapat beberapa parameter yang perlu diberi perhatian, antaranya ialah:
  • Voltage Input yang datang daripada Analog Channel (AN0 - AN12).
  • Reference Voltage iaitu Vref(+) dan Vref(-)
  • Resolution 10bit (0 - 1023)
Ketiga-tiga parameter ini boleh dihubungkan melalui graf dibawah:

Rajah 2: Graf Digital vs Analog

Rajah 2 diatas menunjukkan hubung kait diantara digital dan analog adalah linear. Maka ia boleh diterjemahkan dalam persamaan matematik seperti berikut:

------------------------------- (1)

Justeru, kita boleh mengira hasil ADC (Dout) jika diberi Voltage input (Vin) dengan menggunakan persamaan (1) diatas.

Note: 3V <=Vref <= 5V


Dengan menggunakan PIC18F4550, keluaran daripada ADC modul (Dout) ini akan disimpan di dalam SATU(1) register, iaitu ADRES.

Selain daripada itu, terdapat parameter lain yang mempengaruhi hasil ADC, antaranya ialah:
  • A/D conversion time per bit, Tad. 
Bagi mendapat hasil conversion 10-bit yang lengkap, masa yang diperlukan adalah 12Tad.

Note: Nilai Tad mesti melebihi 1.6us


Nilai Tad boleh dikira berdasarkan pilihan ADCS seperti dibawah:


Berikut adalah contoh kiraan bagi menentukan ADCS yang paling sesuai:

Diberi nilai Fosc = 48MHz

Maka,

Case 1: Fosc/2
48MHz / 2 = 24MHz
Tad = 1/24MHz = 0.0041 us. Pilihan ini tidak sah, kerana kurang dari 1.6us

Case 2: Fosc/4
48MHz / 4 = 12MHz
Tad = 1/12MHz = 0.0083 us. Pilihan ini tidak sah, kerana kurang dari 1.6us

Case 3: Fosc/8
48MHz / 8 = 6MHz
Tad = 1/6MHz = 0.1667 us. Pilihan ini tidak sah, kerana kurang dari 1.6 us

Case 4: Fosc/16
48MHz /16 = 3MHz
Tad = 1/3MHz = 0.333 us. Pilihan ini tidak sah, kerana kurang dari 1.6 us

Case 5: Fosc / 32
48MHz / 32 = 1.5MHz
Tad = 1/1.5MHz = 0.666us. Pilihan ini tidak sah, kerana kurang dari 1.6us

Case 6: Fosc/ 64
48MHz / 64 = 0.75MHz
Tad = 1/0.75MHz = 1.333us. Pilihan ini diterima walaupun kurang dari 1.6us sebab tiada pilihan lain.

Justeru,  convertion time = 12 x 1.333us = 16.996 us


Daripada contoh ini dapati bahawa dengan menggunakan Fosc = 48MHz, tiada ADCS yang sesuai kerana kesemuanya adalah kurang dari 1.6us. Tetapi ADCS yang paling hampir iaitu Fosc/64 boleh digunakan. Walaupun hasil conversion tidak lengkap 100% tetapi masalah ini boleh diatasi dengan membuat purata hasil conversion.

2) Menulis aturcara C18 

Langkah seterusnya adalah menulis aturcara menggunakan C18 untuk manipulasi kandungan register:
  • ADCON0
  • ADCON1
  • ADCON2

Bagi memudahkan, penerangkan seterusnya akan berdasarkan kepada contoh dibawah.

1. Contoh simple ADC program. 


Rajah 3
Penyata Masalah:

Tulis aturcara C18 supaya Pin RA0 pada PIC18F4550 boleh digunakan untuk melakukan proses ADC secara berterusan. Dimana configurasi ADC yang diperlukan adalah seperti berikut:

i) Vref(+) = Vdd (5V)
ii) Vref (-) = Vss (0V)
iii) Resolution = 10 bit
iv) A/D Acquisition Time = 12Tad
v) A/D Conversion Clock = Fosc/64

Penyelesaian:
Rajah 4: aturcara bagi contoh 1.

Untuk mendapat aturcara penuh, Klik Disini

2. Aturcara yang ditunjukkan dalam Rajah 4 boleh di naik taraf supaya lebih flexible. Dimana ia boleh guna untuk mana-mana channel (AN0-AN12).

Untuk mendapat aturcara yang telah di naik taraf, Klik Disini


Penutup:

Diharapkan post yang ringkas ini akan memberi manfaat kepada pembaca. Jika terdapat masalah atau kekeliruan, sila komen di ruang yang disediakan.

Sekian