digital.h – Makro Praktis Ala Arduino Buatan Ihsan Kehribar


Postingan ini adalah reblog dari blog saya Linux Forte – Linux For Teknik Elektro. Selamat membaca dan semoga bermanfaat.

Pada tulisan sebelumnya: Mencicipi LittleWire – Firmware Multifungsi Untuk ATtiny85, saya mencoba beberapa program yakni blink dan adc. Program blink yang mewakili fungsi GPIO menggunakan library digital.h yang berisi beberapa definisi macro praktis yang sangat menarik untuk dipelajari dan tentunya bisa digunakan pada program kita sendiri.

digital.h menurut pembuatnya adalah termasuk COFFEEWARE – kita bebas menggunakannya asal kredit terhadap pembuatnya tetap kita sebutkan dan bilamana nanti bertemu dengan Ihsan, sudilah kiranya kita mentraktirnya minum kopi. 🙂

Nah, berikut adalah listing program digital.h:

/*
* ----------------------------------------------------------------------------
* “THE COFFEEWARE LICENSE” (Revision 1):
* <ihsan@kehribar.me> wrote this file. As long as you retain this notice you
* can do whatever you want with this stuff. If we meet some day, and you think
* this stuff is worth it, you can buy me a coffee in return.
* -----------------------------------------------------------------------------
*/

#ifndef DIGITAL
#define DIGITAL

#include <avr/io.h>

/*-----------------------------------------------------------------------------
/ Useful symbolic definitions.
/----------------------------------------------------------------------------*/
#define HIGH 1
#define LOW 0
#define OUTPUT 1
#define INPUT 0
#define ENABLE 1
#define DISABLE 0

/*-----------------------------------------------------------------------------
/ Definition: Writes high/low to a digital output pin.
/ Example: 
/
/	digitalWrite(A,6,LOW);
/	digitalWrite(A,7,HIGH);
/----------------------------------------------------------------------------*/
#define digitalWrite(port,pin,state) state ? (PORT ## port |= (1<<pin)) : (PORT ## port &= ~(1<<pin))  

/*-----------------------------------------------------------------------------
/ Definition: Sets the mode of a digital pin as input/output.
/ Example:
/
/ 	pinMode(A,6,OUTPUT);
/	pinMode(A,6,INPUT);
/----------------------------------------------------------------------------*/
#define pinMode(port,pin,state) state ? (DDR ## port |= (1<<pin)) : (DDR ## port &= ~(1<<pin))

/*-----------------------------------------------------------------------------
/ Definition: Reads the value of a digital input pin.
/ Returns: Zero for low, nonzero for high.
/ Example: If PORTA6 high, set pin PORTA7 high; else low.
/
/	if(digitalRead(A,6))
/ 		digitalWrite(A,7,HIGH);
/	else
/		digitalWrite(A,7,LOW);
/----------------------------------------------------------------------------*/
#define digitalRead(port,pin) (PIN ## port & (1<<pin))

/*-----------------------------------------------------------------------------
/ Definition: Toggles the state of a digital output pin.
/ Example:
/
/	togglePin(A,6);
/----------------------------------------------------------------------------*/
#define togglePin(port,pin) (PIN ## port |= (1<<pin))

/*-----------------------------------------------------------------------------
/ Definition: Enables/disables the internal pullup resistor for a digital
/	input pin.
/ Example:
/
/	internalPullup(A,6,ENABLE);
/	internalPullup(A,6,DISABLE);
/----------------------------------------------------------------------------*/
#define internalPullup(port,pin,state) state ? (PORT ## port |= (1<<pin)) : (PORT ## port &= ~(1<<pin))

#endif

Definisi Macro digital.h

digital.h memiliki 5 buah macro, yakni:

  • digitalWrite(port, pin, state)
    #define digitalWrite(port,pin,state) state ? (PORT ## port |= (1<<pin)) : (PORT ## port &= ~(1<<pin))
  • pinMode(port, pin, state)
    #define pinMode(port,pin,state) state ? (DDR ## port |= (1<<pin)) : (DDR ## port &= ~(1<<pin))
  • digitalRead(port, pin)
    #define digitalRead(port,pin) (PIN ## port & (1<<pin))
  • togglePin(port, pin)
    #define togglePin(port,pin) (PIN ## port |= (1<<pin))
  • internalPullup(port, pin, state)
    #define internalPullup(port,pin,state) state ? (PORT ## port |= (1<<pin)) : (PORT ## port &= ~(1<<pin))

Karena saya tidak memiliki pemahaman yang baik dengan makro bahasa C, maka dari macro-macro inilah saya mendapat pengetahuan bahwasanya kita bisa menggabungkan “string” sebagai berikut:

PORT ## port

Pada definisi di atas, jika port bernilai B, maka PORT ## port akan dikenali sebagai PORTB. Jadi berasa katrok banget, perlu belajar lebih banyak. 😀

Contoh Penggunaan

Untuk menguji digital.h, saya buatkan program sederhana dengan rangkaian sistem seperti gambar berikut ini.

ledbutton

Program akan menyalakan LED Merah secara berkedip-kedip dengan durasi nyala/mati 500ms. LED Merah adalah LED yang terdapat pada board Digispark ATtiny85 yang terhubung ke P1. Durasi nyala/mati LED Merah akan berubah menjadi 100ms jika TOMBOL ditekan. Kondisi TOMBOL akan terus-menerus dibaca oleh mikrokontroler.

ledbutton

Selain perubahan durasi nyala/mati, penekanan TOMBOL akan menyalakan LED Hijau yang terhubung ke P4 – LED ini akan terus menyala selama TOMBOL ditekan.

Berikut adalah kode programnya (digitaltest.c):

/*
 * digitaltest.c
 * Chandra MDE
 * chandra@teknikelektrolinks.com
 * http://linux.teknikelektrolinks.com
 */

#define F_CPU 16500000L
#include <util/delay.h>
#include "digital.h" //by ihsan kehribar

#define LED_MERAH   1
#define LED_HIJAU   4
#define TOMBOL      0

int main() 
{
    pinMode(B, TOMBOL, INPUT);
    internalPullup(B, TOMBOL, ENABLE);
    pinMode(B, LED_MERAH, OUTPUT);
    pinMode(B, LED_HIJAU, OUTPUT);

    while(1) 
    {
        togglePin(B, LED_MERAH);

        if (digitalRead(B, 0))
        {
            digitalWrite(B, LED_HIJAU, LOW);
            _delay_ms(500);
        }
        else
        {
            digitalWrite(B, LED_HIJAU, HIGH);
            _delay_ms(100);
        }
    }

    return 0;
}

Sangat praktis… dan mirip Arduino, bukan? 😀

Nah, sekian tulisan saya dan terima kasih Ihsan Kehribar untuk digital.h – nya.

Selamat belajar dan selamat berkarya.

Iklan
Perihal

Cek situs kami di http://teknikelektrolinks.com. Blog Raspberry Pi: http://raspi.teknikelektrolinks.com

Tagged with: , ,
Ditulis dalam ATtiny45/85

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

Kategori

Bergabunglah dengan 2.503 pengikut lainnya

Hot Links




Display Counter 3-Digit Dengan Koneksi Wi-Fi
Display Nomor Antrian WiFi Android
Mengontrol Relay Via USB/Serial dan Wi-Fi
USB Relay USB-2REL
USB Relay USB-4REL
Water Level Control WLC-02
Serial Relay SER-4REL
NEO STARDUINO SMS ALARM

Alarm SMS Berbasis NEO STARDUINO

1 PC – 6 Unit USB-2REL

Testing 6 USB-2REL Pada 1 Komputer

Standard Pengujian USB-2REL

Pengujian USB-2REL Sebelum Dikirim

LPT-4REL on Knoppix 7.0.5

Testing LPT-4REL on Knoppix Linux

T101 Inkubator Telur

T101 Inkubator Penetas Telur

KONTROL PERALATAN LISTRIK VIA PORT LPT KOMPUTER

Demo Kontrol Kontaktor via Port LPT

STARDUINO meets ANDROID

Demo Kontrol Bluetooth Relay Android

STARDUINO SMS RELAY

Kontrol Relay Via SMS Dengan Starduino

STARDUINO WEB RELAY

Demo Kontrol Relay Via Web/Internet

JustBASIC USB-2REL Control

Demo Kontrol USB-2REL + JustBASIC

STARDUINO + GPS + LCD

Demo Starduino GPS Dengan LCD

USB-2REL EXTREME TEST

Demo Kontrol On/Off Lampu USB-2REL

THERMOSTAT T101 IN ACTION

Demo Thermostat T101 Pada SV=37.5°C

WATER LEVEL CONTROL WLC-02

Demo Kontrol Level Air Tandon WLC-02

HUMIDITY CONTROLLER H103

Demo Kontrol Kelembaban H103 (DHT11)

%d blogger menyukai ini: