Teknik Elektro LinksBarrier-Gate & Turnstile Interface, Thermostat, Relay Driver, Microcontroler Board

digital.h – Makro Praktis Ala Arduino Buatan Ihsan Kehribar

Ini adalah reblog dari blog saya Linux Forte. 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.

Add a Comment

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>