Teknisi Elektronika

About

Ahmad Edi Saputra

Sunday, May 29, 2022

STM32 with arduino platform

 Arduino merupakan platform yang banyak digunakan dikalangan pengembang embedded system baik dikalangan pemula maupun professional. Kemudahan penggunaan platform ini membuat para pemula untuk mempercepat proses pembelajaran dan mempercepat proses prototyping bagi para professional. Arduino memungkinkan penggunanya mengakses low level IO melalui high level API yang lebih mudah dimengerti sehingga sangat mengurangi waktu untuk membaca puluhan, bahkan ratusan halaman datasheet.

Saat ini, platform arduino telah mendukung berbagai jenis mikrokontroler selain AVR atmega, salah satunya adalah STM32. terdapat dua jenis framework untuk STM32 yaitu unofficial dari Roger Clark (stm32duino) dan official support dari STMicro (arduino_core_stm32). Terdapat banyak perbedaan mendasar pada kedua framework ini dimana stm32duino ditulis berdasarkan library pendahulunya yaitu mapple sedangkan arduino core stm32 ditulis diatas library standar dari STM itu sendiri (HAL, bukan STD).

untuk proses installasi dari arduino core stm32 adalah sebagai berikut

  1. Install arduino IDE
  2. Buka arduino IDE dan masuk pada file kemudian preferences
  3. Pada additional board klik kotak disamping text area 
  4. Setelah muncul dialog text area, masukan URL berikut ini lalu klik ok
 

https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json

        5.   Setelah itu, masuk pada tools kemudian board manager kemudian masukan keyword stm32


        6. Pilih versi jika diperlukan, lalu klik install

Thursday, November 17, 2016

Direct Addressing AVR GPIO with C

Pada dasarnya GPIO hanyalah peripheral yang tersambung pada prosesor dengan address tertentu, penulisan terhadap alamat memori ini dapat mengakibatkan perubahan output pada GPIO. Register PORTx, DDRx, dan PINx pada prosesor arsitektur AVR tentu sudah sangat familiar. Namun sudah tahukah kemana definisi PORTx, DDRx, dan PINx ini mengarah? jawabanya ada di datasheet atau di library iomXXX.h misalnya pada arduino Uno ada pada "iom328p.h". berikut ini contoh memory map pada datasheet




Pada kolom address, PORTD ada pada address 0x2B, dan DDRD ada pada address 0x2A. Penulisan pada alamat 0x2A dan 0x2B akan mempengaruhi pin D pada ATMega, dengan kata lain, menuliskan 0x2A=0xFF akan sama dengan menulis DDRD=0xFF dan port D akan berfungsi sebagai output. Tetapi kompiler akan bingung dalam proses kompilasi, untuk itu perlu dilakukan konversi yang menjadikan 0x2A  di anggap kompiler sebagai alamat, bukan sebuah nilai. Untuk itu, dengan menggunakan fitur paling power full yang disediakan bahasa C, yaitu pointer, 0x2A dapat dijadikan sebagai alamat.

Untuk mengingat kembali sistem pointer pada C,berikut ini merupakan contoh penggunaan pointer C secara sederhana

unsigned char *pointer = 0x00;

Inisialisasi diatas akan menyebabkan variabel pointer diatas memiliki alamat yang tidak tetap, tergantung compiler. dan biasanya alamat tersebut akan mendapat alamat terkecil dari RAM. Karena bahasa merupakan bahasa paling fleksibel, maka untuk memberi tahu kompiler bahwa variabel pointer harus berada pada alamat tertentu adalah dengan cara mengkonversi nilai menjadi pointer itu sendiri seperti

unsigned char *pDDRD  = (unsigned char *)0x2A; //agar sesuai dengan alamat DDRD


Setelah inisialisasi diatas maka alamat dari variable pDDRD akan menjadi 0x2A. untuk mengisi nilai dari pDDRD itu sendiri sama dengan pengisian nilai pointer pada umumnya yaitu dengan menggunakan tanda * seperti

*pDDRD = 0xFF;

penulisan diatas akan sama dengan DDRD = 0xFF, sedangkan untuk menulis logika high pada port D, karena port D berada pada alamat 0x2B, maka

unsigned char * pPORTD = (unsinged char *)0x2B;
*pPORTD = 0xFF;

untuk menghindari variable yang digunakan sebagai alamat dari GPIO, sebaiknya gunakan identifier volatile, dimana volatile mencegah kompiler untuk mengoptimasi objek dengan identifier volatile, meskipun dengan tingkat optimasi tertinggi. berikut contohnya:

volatile unsigned char *pPORTD = (volatile unsigned char *)0x2B;

Lalu bagaimana dengan file iom328.h yang disebut sebelumnya, apakah sesuai dengan penjelasan?
Berikut ini isi filenya
 

Kenapa berbeda? kenapa PORTD 0x0B bukan 0x2B seperti yang dibahas sebelumnya??? karena offset dari fungsi _SFR_IO8 sendiri memiliki offset ox20 seperti yang dapat dilihat pada file "avr/sfr_defs.h"

Sekian tutorialnya, semoga bermanfaat

Wednesday, September 23, 2015

WinAVR GPIO (menulis library seperti arduino) ATMega32

GPIO sebenarnya merupakan dasar yang simple dari sebuah mikrokontroler, pengaksesan GPIO bisa dibilang seperti "hello world!"-nya setiap bahasa pemrograman. Dengan arti lain, setidaknya kita harus mengenal GPIO untuk mulai bermain dengan mikrokontroler. Pengaksesan GPIO sendiri cukup mudah, misalnya pada ATMega32 hanya perlu mengatur pin sebagai input atau output dan menulis logika pada pin IO tersebut dengan DDRx = 0xFF untuk output atau DDRx=0x00 sebagai input, PORTx=0xFF(5V) untuk logika tinggi atau PORTx=0x00 untuk logika rendah(0V).  lalu bagaimana agar pemrograman kita dapat terkesan lebih profesional dan dapat digunakan kembali dilain waktu? bagaimana jika kita tidak ingat perbedaan DDRx dan PORTx?

Logika dasarnya register DDRx, PORTx, dan PINx juga memiliki alamat register, jadi inilah yang seharusnya kita simpan kedalam library yang akan kita buat. berikut ini contoh register ATMega32
Selanjutnya karena ATMega32 memiliki 32 pin IO maka buatlah kedalam sebuah array yang setiap 8 byte menyimpan alamat registernya. untuk lebih mudahnya, susun sesuai dengan mapping IO ATMega32 (DIP Package) sehingga akan berurutan PORTB, PORTD, PORTC, PORTA. sehingga array untuk register DDR akan menjadi 
const uint8_t DDRx[32]={
0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, //DDRB
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, //DDRD
0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, //DDRC
0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,//DDRA
};
const uint8_t PORTx[32]={
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,//PORTB
0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,//PORTD
0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,//PORTC
0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B,//PORTA
};
 Setelah mendapatkan array dari register, dua fungsi yang harus di ketahui yaitu _BV(x) dan _SFR_IO8(registerAddress), dua fungsi ini biasanya dipakai pada macro sbi(register,bit) dan cbi(register,bit). oleh karena itu fungsi yang akan dibuat kurang lebih akan sama dengan sbi dan cbi. berikut fungsi pinMode(pinNumber,modePin).

#define INPUT 0
#define OUTPUT 1
#define INPUT_PULLUP
void pinMode(uint8_t pin, uint8_t mode){
uint8_t num_pin = pin%8;
if(mode==OUTPUT){
_SFR_BYTE(_SFR_IO8(DDRx[pin]))|=_BV(num_pin);
}else if(mode==INPUT){
_SFR_BYTE(_SFR_IO8(DDRx[pin]))&=~(_BV(num_pin));
}else{
_SFR_BYTE(_SFR_IO8(DDRx[pin]))&=~(_BV(num_pin));
_SFR_BYTE(_SFR_IO8(PORTx[pin]))|=_BV(num_pin);
}
}

Saturday, September 12, 2015

Arduino dan sensor PIR (Passive Infra Red)

Hampir semua benda yang memiliki suhu diatas nol mutlak (absolute zero) memancarkan energi panas dalam bentuk radiasi gelombang infrared sehingga mata manusia tidak dapat melihat secara langsung. Oleh karena itu digunakan sebuah sensor PIR atau passive infrared. Disebut passive karena sensor ini hanya mendeteksi pancaran infrared yang ada disekitarnya tanpa memancarkan radiasi apapun. Sensor ini cukup mudah ditemukan karena sifatnya yang murah, ukuran kecil, dan hemat daya.

Berikut ini merupakan bagian-bagian dari sensor PIR

Gambar tersebut menunjukan terdapat 3 konektor yang siap disambungkan dengan perangkat lain, 2 diantaranya adalah VCC dan Ground yang mana adalah positif dan negatif power suply untuk sensor, sensor ini bekerja pada tegangan 3-5VDC. 1 pin yang terletak ditengah merupakan output dari sensor. output sensor ini merupakan data digital yang akan bernilai HIGH jika mendeteksi pergerakan objek dan bernilai LOW jika tidak ada objek yang terdeteksi.

Untuk menguji kinerja Sensor ini, kita gunakan alat bantu untuk mengujinya yaitu Arduino board. pin output dari sensor, akan disambung dengan pin no 7 pada board Arduino. berikut ini program untuk pengujianya

void setup() {
  // put your setup code here, to run once:
    pinMode(7,INPUT_PULLUP);
    Serial.begin(9600);
    pinMode(13,OUTPUT);
}
void loop() {
  // put your main code here, to run repeatedly:
    if(digitalRead(7)==LOW){
        digitalWrite(13,LOW);
    }else{
        digitalWrite(13,HIGH);
    }
}

jika ada pergerakan disekitar sensor maka LED user pada board arduino akan menyala dan jika tidak akan tetap mati. Selamat mencoba

Thursday, June 25, 2015

WIN AVR Getting started

WIN AVR merupakan IDE gratis dengan compiler open source GCC sehingga banyak yang menyebut AVR GCC. Tentu kita semua mengenal Arduino yang sedang populer dikalangan pengembang mikrokontroler saat ini. IDE Arduino yang digunakan untuk pengembangan program Arduino juga menggunakan compiler GCC untuk itu, mari kita memulai project baru dengan compiler GCC namun dengan bahasa yang lebih rendah. bahasa yang lebih rendah disini adalah bahasa yang semakin dekat dengan bahasa mesin, biasanya semakin rendah sebuah bahasa pemrograman hasil eksekusi programnya akan lebih optimal

Untuk dapat menggunakan IDE WIN AVR download disini kemudian install. setelah terinstall dengan baik, buka programmer notepad

 sehingga terlihat gambar berikut ini
bagian dengan nomor 1 merupakan project tree yang memuat file-file didalam project yang sedang dibuka.
bagian nomor 2 merupakan source editor atau tempat untuk mengedit program
bagian nomor 3 merupakan bagian notifikasi saat proses kompilasi

untuk membuat project baru klik File->new->project lalu beri nama dan simpan pada direktori yang mudah diingat lihat gambar 1 (bawah)


setelah itu, buat source codenya dengan klik File->new->C/C++ simpan pada direktori yang sama dengan project. untuk pertama kalinya buatlah source code dengan ekstensi .c untuk bhasa C dan .cpp untuk bahasa C++. liat gambar 2(bawah)

selanjutnya buka program untuk membuat makefile yang digunakan untuk memberi informasi tentang mikrokontroler kepada kompiler. carannya klik pada MFile[WinAVR] pada startmenu.

setelah terbuka ada beberapa pengaturan yang harus dikerjakan seperti nama main file, besar clock, dan lainya langsung saja dari makefile klik enable editing

cari dan ganti sesuai dengan mikrokontroler yang digunakan misalnya mikrokontroler yang digunakan adalah ATMega32 dengan clock 12MHz maka MCU name harus atmega32

# MCU name
MCU = atmega32


# Processor frequency.
#     This will define a symbol, F_CPU, in all source code files equal to the 
#     processor frequency. You can then use this symbol in your source code to 
#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
#     automatically to create a 32-bit value in your source code.
#     Typical values are:
#         F_CPU =  3686400
#         F_CPU =  4000000
#         F_CPU =  7372800
#         F_CPU =  8000000
#         F_CPU = 11059200
#         F_CPU = 14745600
#         F_CPU = 16000000
#         F_CPU = 18432000
#         F_CPU = 20000000
F_CPU = 12000000


# Output format. (can be srec, ihex, binary)
FORMAT = ihex

#nama source code yang berisi fungsi main
# Target file name (without extension).
TARGET = main


# Object files directory
#     To put object files in current directory, use a dot (.), do NOT make
#     this an empty or blank macro!
OBJDIR = .


#ganti dengan .cpp jika ingin menggunakan bahasa C++
# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c


setelah pengaturan selesai, save as di direktori yang sama dengan projek dan main file tanpa diganti nama langsung klik save

lalu pada programmer notepad klik tools->[WinAVR]Make All, jika sukses maka akan muncul warning "Program exit code : 0"

Monday, January 19, 2015

Arduino dan RTC DS1307 di Proteus

RTC DS1307 merupakan salah satu jenis RTC yang banyak dijumpai di Indonesia, khususnya jogja:).
RTC ini dapat diakses menggunakan Arduino melalui interface I2C. apa itu I2C? lihat DISINI

Singkat cerita, karena I2C merupakan jalur yang bisa dimanfaatkan untuk banyak slave ada kasus dimana beberapa librari Arduino yang menggunakan Wire.h (library I2C arduino) mengalami crash. sehingga alangkah baiknya untuk menulis sendiri biar enak dan dijamin tidak crash. hehe

Langsung saja keproteusnya


berikut ini contoh program untuk membaca data dari RTC, untuk nulisnya nyusul

#include <Wire.h>

void setup(){
      Serial.begin(9600);
      Wire.begin();
}
void loop(){
      bacaWaktu();
      delay(1000);
void bacaWaktu(){
      Wire.beginTransmission(0x68);
      Wire.write(0x00);
      Wire.endTransmission();
      Wire.requestFrom(0x68,7);
      int data[7];
      for(byte i=0;i<7;i++){
          data[i]=Wire.read();
      }
      for(byte i=0;i<7;i++){
          byte temp = ((data[i]/16)*10)+(data[i]%16);
          Serial.print(temp);
          Serial.print(" ");
      }
      Serial.println();
}

I2C (Inter Intgrated Circuit)

I2C merupakan komunikasi serial dua kabel yang menggunakan SDA sebagai jalur data dan SCL sebagai jalur clock. pada komunikasi ini, clock untuk mengirimkan data bersumber dari master atau host. host lah yang mengatur jalanya aliran data baik mengirim maupun menerima data sampai memilih slave yang akan berkomunikasi dengan host. Karena I2C merupakan komunikasi antar IC maka komunikasi ini mampu digunakan untuk beberapa IC seperti terlihat pada gambar dibawah ini.
SDA dan SCL merupakan pin open drain/kolektor sehingga membutuhkan pull-up agar sinyal dapat dihasilkan dengan baik. keuntungan dari sistem pull-up adalah hanya tinggal mengganti VCC pada pull-up untuk menghasilkan level sinyal yang berbeda.

Agar host (misalnya Device1) mampu menunjuk slave yang akan diajak berkomunikasi, maka masing-masing slave memiliki slave address. slave address ini harus ditunjuk pertamakali sebelum pertukaran data dilakukan. setelah slave addres ditunjuk. misalnya Device2, maka slave lain akan mengabaikan data apapun yang diterimanya.


Frame data pada pengiriman data I2C dapat dilihat pada gambar diatas. pertama-tama, I2C host mengirim sinyal start ataupun repeat start jika start gagal. setelah sinyal start berhasil dikirim, host mengirim addres untuk menunjuk slave. addres slave ini hanya 7 bit MSB tetapi dalam pengirimanya address menjadi 8-bit karena memiliki 1-bit kondisi komunikasi yaitu untuk read (bit 0 = 1) atau write (bit 0 = 0). setelah penunjukan slave address berhasil, slave akan mengirim ACK(ACKnowledge) dan host hanya bisa menerima/ mengirim data setelah ACK ini diterima.  selanjutnya host siap mengirim data.

berikut ini sinyal start dan stop dari I2C
sinyal start ditandai dengan transisi turun pin SDA saat pin SCL masih tinggi sedangkan sinyal stop ditandai dengan transisi naik pin SDA saat SCL masih tinggi. hal ini terjadi karena pada dasarnya SCL merupakan clock yang akan naik dan segera turun setelah sampling selesai sementara SDA hanya akan bertransisi saat sampling sudah selesai atau SCL rendah.