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
- Install arduino IDE
- Buka arduino IDE dan masuk pada file kemudian preferences
- Pada additional board klik kotak disamping text area
- 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
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
Wednesday, September 23, 2015
WinAVR GPIO (menulis library seperti arduino) ATMega32
const uint8_t DDRx[32]={0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, //DDRB0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, //DDRD0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, //DDRC0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,//DDRA};
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).const uint8_t PORTx[32]={0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,//PORTB0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,//PORTD0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,//PORTC0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B,//PORTA};
#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)
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
Untuk dapat menggunakan IDE WIN AVR download disini kemudian install. setelah terinstall dengan baik, buka programmer notepad
sehingga terlihat gambar berikut ini
Monday, January 19, 2015
Arduino dan RTC DS1307 di Proteus
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();
}