Menggunakan PWM pada ATmega8535

Kebanyakan mikrokontroler AVR memiliki kanal PWM di dalam chip-nya. Fasilitas ini membuat penggunaan PWM menjadi lebih sederhana dan lebih akurat. Timer atau Counter dalam AVR dapat digunakan dalam modus PWM tanpa mengganggu fungsi dasar timer. Timer1 dapat di-konfigurasi dalam modus PWM dengan men-setting bit PWM11 dan PWM10 dalam register TCCR1A.

PWM11 PWM10 Description
0 0 PWM operation of Timer/Counter1 is disabled
0 1 Timer/Counter1 in 8-bit PWM Mode
1 0 Timer/Counter1 in 9-bit PWM Mode
1 1 Timer/Counter1 in 10-bit PWM Mode

Prescale dapat dipilih melalui register TCCR1B.

Lebar pulsa di-load ke dalam timer output compare register OCR1A (OCR1AH dan OCR1AL) dan OCR1B (OCR1BH dan OCR1BL). Timer/Counter1 bertindak sebagai up/down counter, menghitung naik dari 0000H hingga TOP, kemudian berbalik menghitung turun hingga nol, demikian seterusnya. Ketika nilai counter sama dengan isi dari 10-bit OCR1A atau OCR1B, pin OC1A dan OC1B di-set atau di-clear sesuai dengan setting bit dari COM1A1/COM1A0 atau COM1B1/COM1B0 dalam Timer/Counter1 Control Register (TCCR1A).

PWM Resolution Timer Top Value Frequency
8-bit PWM $00FF (255) Ftck1/510
9-bit PWM $01FF (511) Ftck1/1022
10-bit PWM $03FF (1023) Ftck1/2046
COM1X1 COM1X0 Effect on OCX1
0 0 Not Connected
0 1 Not Connected
1 0 Cleared on compare match, up-counting. Set on compare match down-counting (non-inverted PWM)
1 1 Cleared on compare match, down-counting. Set on compare match up-counting (inverted PWM)

Berikut adalah contoh dalam Bahasa C:

#define PULSE_WIDTH 0x40
void pwm_start()
{
  OCR1AL = PULSE_WIDTH; //Load Pulse width
  OCR1AH = 0;
  DDRD |= (1<<5);       //PortD.5 as o/p
  TCCR1A = 0x81;        //8-bit, Non-Inverted PWM
  TCCR1B = 1;           //Start PWM
}

Frekuensi yang dapat digunakan untuk aplikasi motor, tergantung pada kualitas motor dan kemampuan H-bridge yang digunakan. Motor yang digunakan pada power window mobil atau mainan, bekerja dengan baik pada frekuensi 500 Hz hingga 1 kHz. Beberapa motor kelas “high-end” bekerja dengan mulus pada 20 kHz. H-bridge 754410 dan L293D telah diuji dan berjalan dengan baik pada frekuensi 5 kHz.

Berikut adalah contoh pemrograman dengan BASCOM-AVR:

$regfile = "m8535.dat"
$crystal = 4000000
$baud = 9600
$hwstack = 32
$swstack = 10
$framesize = 50

Dim Dummy As Integer
Dim Potvalue As Integer

Config Pind.5 = Output
Config Pind.4 = Output
Config Timer1 = Pwm , Prescale = 64 , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Enable Interrupts
Enable Timer1
Config Adc = Single , Prescaler = 64
Start Adc
Ocr1ah = 0
Ocr1ah = 0
Do
  Potvalue = Getadc(0)
  Dummy = Potvalue / 2
  Dummy = Dummy / 2
  Ocr1bl = Dummy
Loop
End

Pelatihan Mikrokontroler dan Robot

NEXT SYSTEM Robotics Learning Center menyelenggarakan sejumlah program pelatihan seputar pemrograman mikrokontroler dan aplikasinya dalam robotika. Pelatihan diselenggarakan secara reguler maupun inhouse, terbuka untuk siswa kelas 2 hingga kelas 12, mahasiswa, profesional dan umum.Berikut adalah kelas pelatihan yang saat ini diselenggarakan:

  • Pemrograman Robot Lego Mindstorms NXT dengan NXT-G
  • Pemrograman Robot Lego Mindstorms NXT dengan Bahasa C
  • Pemrograman Robot Lego Mindstorms NXT dengan Bahasa Java
  • Pemrograman Robot Lego Mindstorms NXT dengan Microsoft Robotics Studio
  • Pemrograman Robot Boe-Bot dengan Bahasa BASIC
  • Pemrograman Robot Scribbler dengan Bahasa BASIC
  • Pemrograman Robot Edukasi dengan Bahasa BASIC
  • Pemrograman Robot Edukasi dengan Bahasa C
  • Pemrograman Robot Edukasi dengan Bahasa Pascal
  • Pemrograman Mikrokontroler BASIC Stamp dengan Bahasa BASIC
  • Pemrograman Mikrokontroler MCS-51 dengan Bahasa BASIC
  • Pemrograman Mikrokontroler MCS-51 dengan Bahasa C
  • Pemrograman Mikrokontroler AVR dengan Bahasa BASIC
  • Pemrograman Mikrokontroler AVR dengan Bahasa C
  • Pemrograman Mikrokontroler AVR dengan Bahasa Pascal
  • Pemrograman Mikrokontroler PIC dengan Bahasa BASIC
  • Pemrograman Mikrokontroler PIC dengan Bahasa C
  • Pemrograman Mikrokontroler PIC dengan Bahasa Pascal

Disamping itu, NEXT SYSTEM Robotics Learning Center membuka program pelatihan Robotics for Kidz. Program ini ditujukan bagi anak usia 8-12 tahun.

Untuk informasi lebih lanjut, silahkan menghubungi:

NEXT SYSTEM
Robotics Learning Center
ITC Kosambi F2
Jl. Baranang Siang 6-8
Bandung 40112
Telp. (+62 22) 4222062, 70775874
Email: info@nextsys.web.id

http://edukasi.nextsys.web.id

Mikrokontroler PIC

Walaupun mikrokontroler yang satu ini excellent, populasi pemakai di Indonesia, tidak terlalu banyak. Mungkin dikarenakan faktor harga, yang umumnya, hampir 2-3 kali lipat dibanding produk yang setara keluaran Atmel. Namun perlu dicatat, harga chip Atmel yang murah yang banyak beredar di Indonesia, adalah produk dengan kualitas kelas dua; sementara PIC hanya menyediakan kualitas satu. Chip Atmel kualitas satu harganya kurang lebih setara dengan chip PIC.

Ada beberapa jenis yang walaupun agak sulit ditemukan, tapi bisa dicari, seperti PIC 16F877A dan PIC 16F84A. Untuk pemula, PIC 16F88 bisa disarankan, karena sudah memiliki internal ADC (7 channel) dan menyediakan fasilitas PWM walaupun cuma satu. Bandingkan dengan PIC 16F84A yang hanya menyediakan input digital saja.

Mikrokontroler ini agak sedikit unik. Saya sebut unik karena sangat berbeda dengan pakem Intel yang selama ini kita ketahui. Yang menarik lagi adalah, instructions set nya cuma 35 (low end) hingga 80 (high end) saja. Ini pula yang disebut sebagai “keterbatasan” selain cuma memiliki akumulator tunggal.

Berikut adalah penjelasan teknis dari beberapa tipe PIC yang kebetulan ada di tangan saya:

PIC16F88 (18 pin)

This powerful (200 nanosecond instruction execution) yet easy–to-program (only 35 single word instructions) CMOS Flash-based 8-bit microcontroller packs Microchip’s powerful PIC® architecture into an 18-pin package and is upwards compatible with the PIC16C7x, PIC16C62xA, PIC16C5X and PIC12CXXX devices. The PIC16F88 features 8 MHz internal oscillator, 256 bytes of EEPROM data memory, a capture/compare/PWM, an Addressable USART, a synchronous serial port that can be configured as either 3-wire Serial Peripheral Interface (SPI™) or the 2-wire Inter-Integrated Circuit (I²C™) bus, 7 channels of 10-bit Analog-to-Digital (A/D) converter and 2 Comparators that make it ideal for advantage analog / integrated level applications in automotive, industrial, appliances and consumer applications.

PIC16F877A (40 pin)

This powerful (200 nanosecond instruction execution) yet easy-to-program (only 35 single word instructions) CMOS FLASH-based 8-bit microcontroller packs Microchip’s powerful PIC® architecture into an 40- or 44-pin package and is upwards compatible with the PIC16C5X, PIC12CXXX and PIC16C7X devices. The PIC16F877A features 256 bytes of EEPROM data memory, self programming, an ICD, 2 Comparators, 8 channels of 10-bit Analog-to-Digital (A/D) converter, 2 capture/compare/PWM functions, the synchronous serial port can be configured as either 3-wire Serial Peripheral Interface (SPI™) or the 2-wire Inter-Integrated Circuit (I²C™) bus and a Universal Asynchronous Receiver Transmitter (USART). All of these features make it ideal for more advanced level A/D applications in automotive, industrial, appliances and consumer applications.

PIC 16F872 (28 pin)

This powerful (200 nanosecond instruction execution) yet easy-to-program (only 35 single word instructions) CMOS FLASH-based 8-bit microcontroller packs Microchip’s powerful PIC® architecture into an 28-pin package and is upwards compatible with the PIC16C5X, PIC12CXXX and PIC16C7X devices. The PIC16F872 features 64 bytes of EEPROM data memory, self programming, an ICD, 5 channels of 10-bit Analog-to-Digital (A/D) converter, 2 additional timers, a capture/compare/PWM functions and the synchronous serial port can be configured as either 3-wire Serial Peripheral Interface (SPI™) or the 2-wire Inter-Integrated Circuit (I²C™) bus. All of these features make it ideal for more advanced level A/D applications in automotive, industrial, appliances and consumer applications.

PIC 16F84A (18 pin)

This powerful (200 nanosecond instruction execution) yet easy-to-program (only 35 single word instructions) CMOS Flash/EEPROM-based 8-bit microcontroller packs Microchip’s powerful PIC® architecture into an 18-pin package. The same device can be used for prototyping and production and the end application can be easily updated without removing the device from the end product via the ICSP. Easily adapted for automotive, industrial, appliances low power remote sensors, electronic locks and security applications.

Untuk informasi lebih lanjut mengenai chip PIC dan pelatihan pemrogramannya, silahkan menghubungi NEXT SYSTEM Robotics Learning Center.

Menghubungkan BASIC Stamp dengan Modul Sonar SRF04

Mikrokontroler harus merubah level logika pada pin INIT pada modul sonar untuk memulai sebuah pembacaan. Setelah pin input INIT menjadi LOW, modul sonar akan mengirimkan sebuah ping. Setelah itu, output ECHO menjadi HIGH dan akan menjadi LOW kembali setelah modul menerima sebuah pantulan.

Perintah PULSOUT mengirimkan sebuah pulsa high pada pin INIT pada modul sonar. Perintah PULSIN mengukur waktu yang diperlukan gelombang pantul untuk kembali. Setelah merekam pembacaan, mikrokontroler menunggu 10 ms untuk memberikan waktu pada modul untuk melakukan reset secara baik.

Waktu eksekusi dari perintah PULSIN adalah berbeda untuk pin yang berbeda. Bila kita merubah pin yang digunakan, perintah PULSIN dalam subrutin sr_sonar di atas mungkin akan kehilangan tepi naik dari input ECHO dan mengembalikan nilai pembacaan nol. Menggunakan perintah RCTIME akan memperbaiki masalah ini. Trik lain adalah memberikan sedikit jeda dengan sebuah perintah dummy sebelum mengukur waktu echo dengan perintah RCTIME (lihat contoh di bawah). Kita perlu melakukan percobaan untuk menentukan kode terbaik untuk aplikasi yang dibuat.

'
' Devantech SRF04 Example
'

wDist var word

INIT con 0
ECHO con 1

' CONVERSION FACTORS:
'
' The PULSIN command returns the round-trip echo time in 2us units
' which is equivalent to the one-way trip time in 1us units.
'
' Filename: srf04-1.bs2
' distance = (echo time) / (conversion factor)
'
' use 74 for inches (73.746us per 1 in)
' use 29 for centimeters (29.033us per 1 cm)
'

convfac con 74 ' use inches

'---------------------------------------------

main:
 gosub sr_sonar
 debug dec wDist, cr
 pause 200
 goto main

sr_sonar:
 pulsout INIT,5 ' 10us init pulse
 pulsin ECHO,1,wDist ' measure echo time
 wDist=wDist/convfac ' convert to inches
 pause 10
 return

sr_sonar_2:
 pulsout INIT,5 ' 10us init pulse
 output INIT ' dummy command (delay)
 rctime ECHO,1,wDist ' measure echo time
 wDist=wDist/convfac ' convert to inches
 pause 10
 return

Menggunakan LCD

Penampil LCD cukup mudah ditemukan di pasaran, terutama ukuran 16×2. Harganya pun relatif terjangkau.

Di dalam penggunaannya, hubungan antara mikrokontroler dan LCD dapat menggunakan hubungan 8-bit atau 4-bit. Pilihan kedua lebih banyak digunakan karena akan menghemat pin I/O 🙂 Selain pin data, juga perlu dihubungkan pin RS dan pin E.

Menggunakan penampil LCD 16*2, khususnya dengan mikrokontroler MCS51 dan BASCOM-8051, relatif mudah. Berikut adalah contoh program untuk menampilkan kata HELLO WORLD! pada dua baris LCD:

Config LCD = 16*2
Config lcdpin=pin, db4=p0.4, db5=p0.5, db6=p0.6, db7=p0.7,e=p0.3, rs=p0.2

Cursof Off
Cls
Lcd “Hello”
LowerLine
Lcd “World!”
End

Memprogram EEPROM I2C dengan Bahasa C

Berikut adalah contoh bagaimana meng-akses I2C EEPROM Atmel 24C02 menggunakan CodeVision-AVR:

/* bus I2C dihubungkan dengan PORTB */
/* sinyal SDA pada bit 3 */
/* sinyal SCL pada bit 4 */

#asm
.equ __i2c_port=0x18
.equ __sda_bit=3
.equ __scl_bit=4
#endasm

#include <i2c.h>
#include <delay.h>
#define EEPROM_BUS_ADDRESS 0xa0

/* membaca satu byte dari EEPROM */
unsigned char eeprom_read(unsigned char address) {
unsigned char data;
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data=i2c_read(0);
i2c_stop();
return data;
}

/* menulis satu byte ke EEPROM */
void eeprom_write(unsigned char address, unsigned char data) {

i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address);
i2c_write(data);
i2c_stop();

/* jeda 10ms untuk menyelesaikan penulisan */
delay_ms(10);
}

void main(void) {
unsigned char i;

/* inisialisasi bus I2C */
i2c_init();

/* menulis byte 55h pada alamat AAh */
eeprom_write(0xaa,0x55);

/* membaca byte dari alamat AAh */
i=eeprom_read(0xaa);

while (1); /* loop selamanya */
}

Memprogram EEPROM I2C dengan BASCOM-AVR

I2C

I2C singkatan dari Inter Integrated Circuit, adalah sebuah protokol untuk komunikasi serial antar IC, dan sering disebut juga Two Wire Interface (TWI). Bus yang digunakan untuk komunikasi antara mikrokontroler dan divais periferal seperti memori, sensor temperatur dan I/O expander.

Komunikasi dilakukan melalui dua jalur: SDA (serial data) dan SCL (serial clock). Setiap divais I2C memiliki 7-bit alamat yang unik. MSB adalah fix dan ditujukan untuk kategori divais. Sebagai contoh, 1010 biner ditujukan untuk serial EEPROM. Tiga bit berikutnya memungkinkan 8 kombinasi alamat I2C, yang berarti, dimungkinkan 8 divais dengan tipe yang sama, beroperasi pada bus I2C yang sama. Pengalamatan 7-bit memungkinkan 128 divasi pada bus yang sama. Alamat I2C dikirim dalam byte pertama. LSB dari byte ini digunakan untuk menunjukkan bila master akan melakukan penulisan (0) atau pembacaan (0) terhadap slave.

Divais yang mengirim data sepanjang bus disebut master, divais yang menerima data disebut slave. Master memulai transmisi dengan sebuah sinyal start, dan menghentikan transmisi dengan sebuah sinyal stop pada jalur SDA. Selama sinyal start dan stop, jalur SCL harus dalam keadaan high. Setelah master memulai pengiriman data dengan sebuah sinyal start, master menulis satu byte alamat divais kepada slave. Setiap byte data harus memiliki panjang 8-bit. Slave harus memberikan konfirmasi dari byte data yang diterimanya dengan sebuah bit acknowledge (ACK).

Compiler BASCOM-AVR dapat digunakan untuk membuat program yang dapat melakukan penulisan dan pembacaan ke dan dari EEPROM. BASCOM-AVR memiliki beberapa perintah terkait dengan pengendalian bus I2C.

  • Config SDA : meng-konfigurasi jalur SDA, misalnya PORTB.0
  • Config SCL : meng-konfigurasi jaluar SCL, misalnya PORTB.1
  • I2cstart : menghasilkan sebuah kondisi start
  • I2cstop : menghasilkan sebuah kondisi stop
  • I2cwbyte : menulis satu byte pada divais target
  • I2crbyte : membaca satu byte dari divais target

Dalam BASCOM-AVR, pertama kita harus meng-konfigurasi port yang digunakan untuk jalur SDA dan SCL dari bus I2C. Selanjutnya, kita kirimkan alamat divasi untuk memilih EEPROM yang terhubung dengan bus I2C. Setelah itu kita kirimkan dua byte ke EEPROM untuk memilih alamat dalam EEPROM dimana kita akan menuliskan data. Byte terakhir yang dikirim dalam rangkaian penulisan adalah byte data.

[sourcecode language=”c”]
Dim D_w As Byte , D_r As Byte

Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 ,
Db7 = Portb.0 , E = Portb.6 , Rs = Portb.7

Config Lcd = 16 * 2
Cls
Cursor Off

Config Scl = Portd.0
Config Sda = Portd.1

D_w = 100

'********** menulis satu byte ke EEPROM ***********************************************
I2cstart 'memulai
I2cwbyte &amp;B1010_0000 'kirim alamat divais
I2cwbyte 0 'H adress dari EEPROM
I2cwbyte 0 'L adress dari EEPROM
I2cwbyte D_w 'data ke EEPROM
I2cstop 'berhenti
Waitms 10

'********** membaca dari EEPROM **********************************************
I2cstart 'mulai
I2cwbyte &amp;B1010_0000 'kirim alamat divais
I2cwbyte 0 'H address dari EEPROM
I2cwbyte 0 'L address dari EEPROM
I2cstart 'ulangi start
I2cwbyte &amp;B1010_0001 'alamat slave untuk pembacaan
I2crbyte D_r , Nack 'baca byte dari EEPROM
I2cstop ' stop

Lcd "D_w= "
Lcd D_w 'show byte on LCD
Lowerline
Lcd "D_r= "
Lcd D_r
End
[/sourcecode]


Workshop: Pemrograman Praktis Mikrokontroler PIC untuk Aplikasi Robot

Pada hari Selasa dan Rabu, 19-20 Agustus 2008, saya dan DR. Riza Muhida, asisten profesor bidang Mekatronika di International University Malaysia, memberikan workshop setengah hari kepada 34 orang guru dan siswa dari SMPK/SMAK TRIMULIA dan SMP BIntang Mulia Bandung. Ini merupakan kegiatan workshop mikrokontroler dan robotika pertama untuk kalangan sekolah menengah, khususnya di kota Bandung.

Dengan menggunakan mikrokontroler PIC dan Bahasa C, serta pemrograman mikrokontroler melalui port serial komputer; para guru dan siswa diajak untuk menyelami aplikasi praktis, bagaimana memprogram mikrokontroler, membuat aplikasi sistem lalu lintas, sistem keamanan, membaca data dari sensor, dan lain-lain; serta bagaimana mengendalikan motor, yang nantinya akan digunakan dalam aplikasi robot.

Saat ini, mikrokontroler dan Bahasa C bukan lagi konsumsi para mahasiswa di perguruan tinggi. Dengan pola pembelajaran yang mengedepankan kepraktisan dan kemudahan, serta dukungan dari teknologi terkini, para siswa sekolah menengah pun dapat menikmatinya. Riding the wave dan Don’t Reinventing the Wheel.

Tahapan Pemrograman Mikrokontroler

Berikut adalah tahapan pemrograman mikrokontroler PIC dengan bahasa BASIC:

Memrogram Mikrokontroler PIC dengan BASIC

Pada saat kemunculan komputer pribadi di era 1980an, bahasa BASIC cukup populer. Saat ini, BASIC masih diperhitungkan sebagai bahasa pemrograman yang paling mudah digunakan, tidak terkecuali di dalam dunia mikrokontroler. BASIC memungkinkan pengembangan aplikasi lebih cepat dibanding bahasa assembly. Ketika menulis kode untuk mikrokontroler, programmer sering kali berhadapan dengan isu yang sama, seperti komunikasi serial, menampilkan informasi pada tampilan LCD, membangkitkan sinyal PWM, dan yang lainnya. Untuk maksud mem-fasilitasi pemrograman, BASIC menyediakan sejumlah rutin dan pustaka untuk memecahkan masalah ini.

Dalam konteks ukuran program dan kecepatan eksekusi, assembly memiliki sedikit keunggulan dibanding BASIC. Namun, kita bisa menyisipkan kode assembly di dalam BASIC, untuk menangani bagian dimana waktu eksekusi merupakan hal yang kritis.

Mikrokontroler modern seperti PIC, meng-eksekusi instruksi dalam satu siklus. Jika clock mikrokontroler adalah 4MHz, maka satu instruksi assembly memerlukan 250ns x 4 = 1us. Secara teknis, satu perintah BASIC terdiri dari sejumlah instruksi assembly. Waktu eksekusi untuk setiap perintah merupakan jumlah dari waktu eksekusi dari sejumlah instruksi assembly yang mewakilinya.

Saat ini, pilihan terbaik untuk pengembangan aplikasi dengan BASIC adalah PIC16F84, PIC16F87x, PIC16F62x, PIC18Fxxx. Kontroler ini memiliki program memory dengan teknologi flash, yang dapat dihapus dan diprogram ulang secara cepat, sehingga memungkinkan debugging secara cepat pula. Dengan satu kali klik mouse di dalam programming software, program mikrokontroler dapat secara instan dihapus kemudian di-reload tanpa harus mencabut chip dari alat. Program yang telah di-load ke dalam memori flash dapat tersimpan walaupun catu daya dimatikan. Disamping memori flash, mikrokontroler seri PIC16F87x dan PIC16F84 memiliki 64-256 byte memori EEPROM internal, yang dapat digunakan untuk menyimpan data program dan parameter lain ketika catu daya dimatikan. Instruksi BASIC, EEPROM_Read dan EEPROM_Write, dapat digunakan untuk keperluan ini.

Berikut adalah program LED berkedip yang dibuat dengan mikroBASIC untuk mikrokontroler PIC.

program LED_Blink
main:
 TRISB = 0         ' Configure pins of PORTB as output
eloop:
 PORTB = $FF       ' Turn on diodes on PORTB
 Delay_ms(1000)    ' Wait 1 second
 PORTB = 0         ' Turn off diodes on PORTB
 Delay_ms(1000)    ' Wait 1 second
 goto eloop            ' Stay in loop
end.