Tampilkan postingan dengan label Mikrokontroler. Tampilkan semua postingan
Tampilkan postingan dengan label Mikrokontroler. Tampilkan semua postingan

Minggu, 03 Agustus 2014

SEVEN SEGMEN DENGAN TOMBOL DAN LED


Seven segmen dengan tombol dan LED dengan awal perinsip kerja nilai seven segmen dimulai dari nilai 320 dan LED pertama aktif dan LED lainnya tidak aktif, saat tombol UP ditekan bersamaan dengan tombol Key ditekan maka akan menghasilkan nilai 320 menjadi 330 maka LED kedua aktif dan LED lainnya tidak aktif  sampai dengan nilai 370.



PROGRAM CV AVR

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :   PUSH BUTTON 7seg dan LED
Version :
Date    : 19/11/2013
Author  :
Company : Gunawan Amsari
Comments:


Chip type               : ATmega8535
Program type            : Application
AVR Core Clock frequency: 11.059200 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 128
*****************************************************/
#include 
#include 
unsigned char angka[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
int satuan,puluhan,ratusan,data,data_temp,x;  

void ambil_data()
{
data_temp=data;
puluhan=(data_temp/10)%10;
ratusan=(data_temp/100)%10;
}

void tampilkan_seven_segment()
{
PORTD.0=0;
PORTD.1=0;
PORTD.2=1;
PORTB=angka[satuan];
delay_ms(1);
          
PORTD.0=0;
PORTD.1=1;
PORTD.2=0;
PORTB=angka[puluhan];
delay_ms(1);
            
PORTD.0=1;
PORTD.1=0;
PORTD.2=0;
PORTB=angka[ratusan];
delay_ms(1);
           
}

void main(void)
{
data=320;

PORTA=0xFF;
DDRA=0x00;

PORTB=0xFF;
DDRB=0xFF;

PORTC=0xFF;
DDRC=0xFF;

PORTD=0xFF;
DDRD=0xFF;

while (1)
      {
      for(x=0;x<50 br="" nbsp="" x="">        {
        ambil_data();
        tampilkan_seven_segment();
        } 
      if (PINA.0==0)
      if (PINA.1==0)
        {
        data++;
        if (data>=370)
            data=370;
            PORTC.2=data;
            PORTC.2=0;
            PORTC.3=1;
            PORTC.4=1;
            PORTC.5=1;
            PORTC.6=1;
            PORTC.7=1; 
        }
       else if (data>=370)
       {
            data=370;
            PORTC.2=data;
            PORTC.2=0;
            PORTC.3=1;
            PORTC.4=1;
            PORTC.5=1;
            PORTC.6=1;
            PORTC.7=1; 
        } 
       
      else  if (data>=360) 
        {
            data=360;
            PORTC.3=data;
            PORTC.2=1;
            PORTC.3=0;
            PORTC.4=1;
            PORTC.5=1;
            PORTC.6=1;
            PORTC.7=1;  
        }
        else if (data>=350)    
        {
            data=350;
            PORTC.4=data;
            PORTC.2=1;
            PORTC.3=1;
            PORTC.4=0;
            PORTC.5=1;
            PORTC.6=1;
            PORTC.7=1;  
        }         
        else if (data>=340)   
        {
            data=340;
            PORTC.5=data;
            PORTC.2=1;
            PORTC.3=1;
            PORTC.4=1;
            PORTC.5=0;
            PORTC.6=1;
            PORTC.7=1;  
        }   
        else if (data>=330)    
        {
            data=330;
            PORTC.6=data;
            PORTC.2=1;
            PORTC.3=1;
            PORTC.4=1;
            PORTC.5=1;
            PORTC.6=0;
            PORTC.7=1; 
        }
        else if (data>=320)   
        {
            data=320;
            PORTC.7=data;
            PORTC.2=1;
            PORTC.3=1;
            PORTC.4=1;
            PORTC.5=1;
            PORTC.6=1;
            PORTC.7=0;
        }
      if (PINA.0==0)      
      if (PINA.2==0)
        {
        data--;
        if (data<=320)
            data=320;
            PORTC.7=data;
            PORTC.2=1;
            PORTC.3=1;
            PORTC.4=1;
            PORTC.5=1;
            PORTC.6=1;
            PORTC.7=0;
        }  
        else if (data<=320)
        {
            data=320;
            PORTC.7=data;
            PORTC.2=1;
            PORTC.3=1;
            PORTC.4=1;
            PORTC.5=1;
            PORTC.6=1;
            PORTC.7=0;
        }
      else if (data<=330)
        {
            data=330;
            PORTC.6=data;
            PORTC.2=1;
            PORTC.3=1;
            PORTC.4=1;
            PORTC.5=1;
            PORTC.6=0;
            PORTC.7=1;
        } 
        else if (data<=340)   
        {
            data=340;
            PORTC.5=data;
            PORTC.2=1;
            PORTC.3=1;
            PORTC.4=1;
            PORTC.5=0;
            PORTC.6=1;
            PORTC.7=1;   
        }   
        else if (data<=350)   
        {
            data=350;
            PORTC.4=data;
            PORTC.2=1;
            PORTC.3=1;
            PORTC.4=0;
            PORTC.5=1;
            PORTC.6=1;
            PORTC.7=1; 
        } 
        else if (data<=360)  
       {
            data=360;
            PORTC.3=data;
            PORTC.2=1;
            PORTC.3=0;
            PORTC.4=1;
            PORTC.5=1;
            PORTC.6=1;
            PORTC.7=1;   
        }  
        else if (data<=370)
        {
            data=370;
            PORTC.2=data;
            PORTC.2=0;
            PORTC.3=1;
            PORTC.4=1;
            PORTC.5=1;
            PORTC.6=1;
            PORTC.7=1; 
            }
                  
      };
}
READ MORE - SEVEN SEGMEN DENGAN TOMBOL DAN LED

SENSOR SUHU DAN KELEMBAPAN SHT 11

SENSOR SUHU DAN KELEMBAPAN SHT 11

TAMPIL 1




TAMPIL 2



TAMPIL 3

TAMPIL SHT 11


PROGRAM CV AVR

/*****************************************************
Program SHT11 dengan CodeVision AVR
Programmer : GUNAWAN AMSARI
Company    :
*****************************************************/

#include //crystal 8MHz
#include
#include
#include
#include
#include

//Deklarasi varaibel
unsigned char buf[33];
unsigned char error,checksum;
char inp;
                       
typedef union
{ unsigned int i;
  float f;
} value;
enum {TEMP,HUMI};
#define        DATA_OUT           PORTC.6
#define        DATA_IN            PINC.6
#define        SCK                PORTC.7
#define noACK 0
#define ACK   1       
                            //adr  command  r/w
#define STATUS_REG_W 0x06   //000   0011    0
#define STATUS_REG_R 0x07   //000   0011    1
#define UKUR_SUHU    0x03   //000   0001    1
#define UKUR_HUMI    0x05   //000   0010    1
#define RESET        0x1e   //000   1111    0

unsigned int nilaisuhu[2]={0,0};

//Untuk menulis data ke SHT11
char tulis_SHT(unsigned char bytte)
{
  unsigned char i,error=0; 
  DDRC = 0b11000000;    
  for (i=0x80;i>0;i/=2) //shift bit
  {
    if (i & bytte)      
    DATA_OUT=1;
    else DATA_OUT=0;                      
    SCK=1;      //clk
    delay_us(5); //delay 5 us         
    SCK=0;      
  }
  DATA_OUT=1;                         
  DDRC = 0b10000000;    // DATA Output
  SCK=1;                //clk #9 ack
  delay_us(2);
  error=DATA_IN;       //cek ack (DATA akan di pull down oleh SHT11)
  delay_us(2);
  SCK=0;       
  return error;       //cek jika ada error
}

//Untuk membaca data dari SHT11
char baca_SHT(unsigned char ack)
{
  unsigned char i,val=0;
  DDRC = 0b10000000;    // DATA Input
  for (i=0x80;i>0;i/=2)             //shift bit
  { SCK=1;                          //clk      
    delay_us(2);
    if (DATA_IN) val=(val | i);        //baca bit 
    delay_us(2);
    SCK=0;
  }  
  DDRC = 0b11000000;    // DATA Output
  DATA_OUT=!ack;        //"ack==1" pull down DATA-Line
  SCK=1;                //clk #9 ack
  delay_us(5);          //delay 5 us
  SCK=0;
  DATA_OUT=1;           //DATA-line                                                               
  return val;
}
//----------------------------------------------------------------------------------
// menghasilkan sinyal awal untuk transmisi data
//       _____         ________
// DATA:      |_______|
//           ___     ___
// SCK : ___|   |___|   |______
//----------------------------------------------------------------------------------

//Untuk memulai transmisi data
void start_SHT(void)
{                       
   DDRC = 0b11000000;    // DATA Output
   DATA_OUT=1; SCK=0;   //Inisial state
   delay_us(2);
   SCK=1;
   delay_us(2);
   DATA_OUT=0;
   delay_us(2);
   SCK=0; 
   delay_us(5);
   SCK=1;
   delay_us(2);
   DATA_OUT=1;                  
   delay_us(2);
   SCK=0;     
   DDRC = 0b10000000;    // DATA Input
}
//----------------------------------------------------------------------------------
// reset: DATA-line=1 dengan 9 SCK cycle di awal
//       _____________________________________________________         ________
// DATA:                                                      |_______|
//          _    _    _    _    _    _    _    _    _        ___     ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|   |___|   |______
//----------------------------------------------------------------------------------

//Untuk mereset koneksi dengan SHT11
void reset_SHT(void)
{ 
  unsigned char i;
  DDRC = 0b11000000;    // DATA output
  DATA_OUT=1; SCK=0;                    //Inisial state
  for(i=0;i<9 br="" cycle="" i="" nbsp="" sck="">  { SCK=1;
    delay_us(1);
    SCK=0;
    delay_us(1);
  }
  start_SHT();                   //start transmisi data
  DDRC = 0b10000000;    // DATA Input
}

//Mengecek status register sensor
char StatusReg_SHT(unsigned char *p_value, unsigned char *p_checksum)
{
  unsigned char error=0;
  start_SHT();                   //start transmisi data
  error=tulis_SHT(STATUS_REG_R); //mengirim command ke sensor
  *p_value=baca_SHT(ACK);        //baca status register (8-bit)
  *p_checksum=baca_SHT(noACK);   //baca checksum (8-bit) 
  return error;                     //error=1 jika tidak ada respon dari sensor
}

//Membaca data hasil pengukuran
char ukur_SHT(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
{
  unsigned error=0;
 unsigned int temp=0;
  start_SHT();                   //start transmisi data   

  switch(mode){                     //mengirim command ke sensor
    case TEMP        : error+=tulis_SHT(UKUR_SUHU); break;
    case HUMI        : error+=tulis_SHT(UKUR_HUMI); break;
    default     : break;        
  }                 
  DDRC = 0b10000000;    // DATA input
 while (1)
 {       
   if(DATA_IN==0) break; //tunggu hingga sensor selesai melakukan pengukuran
  }
  if(DATA_IN) error+=1;                // jika sudah timeout (2 detik)    

  switch(mode){                     //mengirim command ke sensor
    case TEMP        : temp=0;
                       temp=baca_SHT(ACK);
                       temp<<=8;
                       nilaisuhu[0]=temp;
                       temp=0;
                       temp=baca_SHT(ACK);
                       nilaisuhu[0]|=temp;
                       break;
    case HUMI        : temp=0;
                       temp=baca_SHT(ACK);
                       temp<<=8;
                       nilaisuhu[1]=temp;
                       temp=0;
                       temp=baca_SHT(ACK);
                       nilaisuhu[1]|=temp;
                       break;
    default     : break;        
  }  
  *p_checksum =baca_SHT(noACK);  //baca checksum    
  return error;
}

const float C1=-4.0;             
const float C2=+0.0405;          
const float C3=-0.0000028;       
const float T1=+0.01;            
const float T2=+0.00008;               
 

float hitung_SHT(float p_humidity, float *p_temperature)
{
  float rh_lin;                     // rh_lin:  Kelembaban linear
  float rh_true;                    // rh_true: Suhu untuk kompensasi kelembaban
  float t_C;                        // t_C   :  nilai Suhu

  t_C=*p_temperature*0.01-40; //mengubah nilai Suhu menjadi derajat Celcius [°C]
  rh_lin=C3*(p_humidity)*(p_humidity) + C2*(p_humidity) + C1; //mengubah nilai kelembaban dalam % [%RH] 
  rh_true=(t_C-25)*(T1+T2*(p_humidity))+rh_lin; //mengkompensasikan nilai suhu dan kelembaban[%RH]
  if(rh_true>100)rh_true=100;
  if(rh_true<0 .1="" br="" rh_true="0.1;">
  *p_temperature=t_C;
   return rh_true;
}                     
                                 

void main(void)
{
value humi_val,temp_val;

PORTA=0x00;
DDRA=0x00;

PORTB=0xFF;
DDRB=0x00;

PORTC=0x00;
DDRC=0xC0;

PORTD=0xF0;
DDRD=0xF0;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;

ACSR=0x80;
SFIOR=0x00;
ADCSRA=0x00;
SPCR=0x00;
TWCR=0x00;

// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
// RD - PORTA Bit 1
// EN - PORTA Bit 2
// D4 - PORTA Bit 4
// D5 - PORTA Bit 5
// D6 - PORTA Bit 6
// D7 - PORTA Bit 7
// Characters/line: 16
lcd_init(16);
lcd_clear();
lcd_gotoxy(3,0);
lcd_putsf("Data Suhu");
lcd_gotoxy(1,1);
lcd_putsf("dan Kelembaban");
delay_ms(1000);

lcd_init(16);
lcd_clear();
lcd_gotoxy(1,0);
lcd_putsf("GUNAWAN AMSARI");
lcd_gotoxy(0,1);
lcd_putsf("===============");
delay_ms(1000);

lcd_init(16);
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("LOADING");
lcd_gotoxy(0,1);
lcd_putsf("WAIT....");
delay_ms(1000);

reset_SHT();   

while (1)
   {
      //delay_ms(500);       
      error=0;           
      error+=ukur_SHT((unsigned char*)( &humi_val.i),&checksum,HUMI);  //mengukur kelembaban
      error+=ukur_SHT((unsigned char*) (&temp_val.i),&checksum,TEMP);  //mengukur suhu              
      error += StatusReg_SHT(&inp, &checksum);
      if(error!=0)
       {
       reset_SHT();                 //jika ada error, reset koneksi
       putsf("Error");  
       }      
      else
       {
       humi_val.f=(float)nilaisuhu[1];                   //mengubah integer menjadi float
       temp_val.f=(float)nilaisuhu[0];                  
       humi_val.f=hitung_SHT(humi_val.f,&temp_val.f);      //menghitung suhu, kelembaban
       //menampilkan pada LCD  
       lcd_clear();
       lcd_gotoxy(0,0);
       sprintf(buf,"SUHU = %0.2f \xdfC",temp_val.f); 
       lcd_puts(buf); 
       lcd_gotoxy(0,1);
       sprintf(buf,"RH   = %0.2f %%",humi_val.f);
       lcd_puts(buf);
       }              
    delay_ms(1000);   
   }
}


 
READ MORE - SENSOR SUHU DAN KELEMBAPAN SHT 11

Sabtu, 26 Mei 2012

KARNAUGH MAP



KARNAUGH MAP

Gara-gara besok saya mau tes yg berhubungan dengan digital saya harus bernostalgia lagi nih ke masa waktu saya masih kuliah untuk kembali belajar lagi dan untuk selalu mengingat biar ngk cepat lupa...dan jg karena catatan-catatan kuliah saya terlalu banyak dan harus pakai cari-cari di lemari yang malah jd bikin repot lebih baik saya cari-cari ke blog-blog orang lain aja yang lebih mudah dan sederhana ngk pakai repot akhirnya saya dapat yg menurut saya blog dia itu bagus untuk saling berbagi ilmu.....langsung aja deh kita bahas tentang  Karnaugh Map...

Karnaugh Map adalah salah satu metode penyerdehanaan sebagai pengganti aljabar boole. Penggunaan karnaugh map akan lebih mempermudah menemukan bentuk sederhana dari suatu persamaan.
contoh:







Cara pengelompokan Variabel:

 1. Pasangan
Adalah suatu pasangan nilai angka 1 dalam posisi horizontal atau vertikal. Jika dalam satu peta karnaugh terdapat lebih dari satu pasangan, kita dapat memperlakukan operasi OR pada hasil kali yang telah disederhanakan.




2. Kuad (Quads)
Adalah kelompok yang terdiri dari empat(4) buah nilai 1 yang tersusun berdampingan dari ujung ke ujung, baik vertikal ataupun horizontal. Kuad diberlakukan untuk menghemat waktu. Kuad ini dapat berarti juga Double pairs.








3. Oktet (Octets)
Adalah kelompok di dalam Karnaugh Map yang berisi nilai 1 yang berdampingan sebanyak 8 (delapan) buah. Penghitungan cara oktet sama halnya dengan double  Kuad (menghitung dengan cara Kuad sebanyak 2 kali, ini tidak efisien).









Dalam menyederhanakan persamaan dalam bentuk aljabar boole, kita terlebih dahulu harus melakukan identifikasi dengan melingkari Pairs, Quads atau Octets sehingga akan lebih mudah untuk menghapuskan variabel mana yang perlu dihapus dan yang tetap digunakan. 
And thanks for mokutonrenchuka atas infonya...semoga bermanfaat untuk diri kita sendiri dan orang lain..
READ MORE - KARNAUGH MAP

Minggu, 22 April 2012

Rangkaian Alarm Rumah berteriak "Maling..!"


Alarm Rumah berteriak "Maling..!"

Berikut adalah rangkaian alarm pengaman rumah yang memanfaatkan perekam suara menggunakan IC ISD1420. Suara yang dipakai sebagai peringatan adalah putar ulang dari suara yang telah kita rekam sendiri sebelumnya. Suara yang direkam bisa berupa alarm kebakaran, alarm polisi dan yang lain ditambah dengan rekaman suara kita misalnya dengan kata kata "Awas ada maling !". Kemudian suara rekaman ini akan diputar berulang ulang untuk menandakan adanya kedatangan orang yang tidak diundang.

IC ISD1420 adalah IC yang berfungsi untuk merekam suara dengan durasi 20 detik, sedangkan tipe yang lain ISD2560 dapat merekam selama 1 menit. Suara ditangkap oleh mikrophone kemudian diubah menjadi sinyal listrik berupa sinyal audio analog, selanjutnya oleh ADC sinyal ini diubah menjadi digital,  sinyal digital disimpan ke dalam memori EPROM yang datanya tidak akan hilang walaupun catu daya dimatikan. Akhirnya data digital ini diubah kembali menjadi sinyal audio analog oleh DAC dan diubah menjadi suara oleh speaker. Ruang memori dan mode perekaman dapat kita akses melalui Pin A0-A9.


Untuk mengontrol IC ini bisa kita akses melalui pin Rec/Play, Start dan Stop. Untuk melalakukan perekaman, tombol Rec/Play dan start ditekan, untuk menghentikan perekaman tombol start dilepas. Untuk memutar rekaman kita tekan tombol start. Terdapat mode untuk melakukan pemutaran ulang otomatis.


Pada aplikasi alarm rumah ini, triger dari rangkaian adalah sebuah saklar magnet yang dipasang pada kusen pintu dan daun pintu. Pada saat pintu tertutup maka saklar akan terbuka, sedangkan saat pintu dibuka oleh pencuri maka saklar akan tertutup dan alaram akan aktif.
Modul ini juga dapat diaplikasikan pada bel kendaraan yang dapat diisi sendiri dengan suara yang kita inginkan. Selain itu modul ini juga bisa diaplikasikan untuk corong penjual gas dan roti keliling.

semoga bermanfaat  dan thanks yyooww buat inovasi atas infonya

READ MORE - Rangkaian Alarm Rumah berteriak "Maling..!"

Sabtu, 04 Februari 2012

Pengujian LCD karakter 2X16 dengan Program Sederhana menggunakan Bahasa Program Assembly



Ngomong-ngomongin mikro jadi inget masa lalu nih saya. Pertama kali saya mencoba LCD 2x16 dengan program Assembly. Langsung aja deh tanpa basa basi yg terlalu panjaaaaang....panjang kaya punya saya yg banyak di sukai bidadari didunia...hehehe..(celana panjang maksudnya)..hehehe. Saya punya contoh program sederhananya nih untuk ngetes LCD berjalan dengan baik atau tidak....mudah-mudahan bermanfaat ye...??

Pengujian LCD karakter 2x16 dengan cara pembuatan perangkat lunak terlebih dahulu untuk Menampilkan Data ke LCD Karakter 2x16. Hal ini dijalankan dengan mengirimkan inisialisasi dan mengkonfigurasikan sejumlah instruksi ke LCD. Antara lain: pengaturan lebar data interface 8 bit atau 4 bit data bus, pemilihan ukuran font karakter 5x8 atau 5x11 dan lain-lain, dengan instruksi sebagai berikut.

Init_lcd:
                mov r1,#00000001b           ;Display clear
                call write_inst ;
                mov r1,#00111000b           ;Function set,
                                                                ;Data 8 bit,2 line font 5x8
                call write_inst ;
                mov r1,#00001100b           ;Display on,
                                                             ;cursor off,cursor blink off
                call write_inst
                mov r1,#00000111b           ;Entry mode, Set increment
                call write_inst
                 ret
           ;
Pada pembuatan perangkat lunak ini akan menuliskan kalimat ”GUNAWAN AMSARI ELEKTRO” yang akan ditampilkan pada layar LCD Karakter dengan menggunakan look up table dan dilakukan proses geser ke kiri atau kekanan sesuai dengan keinginan kita hanya merubah sedikit programnya aja c...dibagian : mov        R1,#geserL ;R1 = GeserLeft.

contoh hasilnya seperti ini :



Untuk melakukan pembuatan perangkat lunak ini harus melakukan beberapa langkah sebagai berikut:
1.       Pasang jumper LCD_EN, yang berfungsi untuk memberikan power supply +5V
2.       Hubungkan modul Mikrokontroler Trainer dengan power supply +5V.
3.      Hubungkan modul Mikrokontroler Trainer dengan rangkaian programmer
4.      Buka Program MCS-51, sebagai editor dan compiler program
5.      Ketik program berikut ini:

$mod52
;
;
DataLCD               equ         30h
geserL                   equ         00011011b ; 0 0 0 1 S/C R/L X X
geserR                   equ         00011111b ; 0 0 0 1 S/C R/L X X
;
org          0h
ljmp        startprogram
;;;;;;;;;;;;;;;;;;;;;;SUBROUTINES;;;;;;;;;;;;;;;;;;;;;;;;;;;
startprogram:      
                                call          init_LCD
                                call          write_char
                                call          geser
                                sjmp       startprogram
                                ret

geser:
                               mov        R6,#34         ;R6 = 34; geser sebanyak 34 karakter
lagi:                        mov        R1,#geserL ;R1 = GeserLeft
                               call          write_inst
                               call          delay
                               djnz        R6,lagi       ;R6=R6-1, jika R6 ? 0 maka lompat ke lagi
                ;
write_char:
                mov        dptr,#word1 ;DPTR = [ address word1 ]
                mov        r3,#35            ;R3=40,number character to be display
                mov        r1,#80h          ;R1=80h,address DDRAM start position
                call          write_inst

           ;
write1:clr               a ; A = 0
           movc           a,@a+dptr  ; A = [A+ DPTR]
           mov             r1,A             ; R1 = A
           inc                dptr             ; DPTR = DPTR +1
           call               write_data  ;
           djnz             r3,write1       ; R3 = R3-1,
           ret
           ;
Init_lcd:
                Mov       r1,#00000001b    ;Display clear
                call          write_inst           ;
                mov        r1,#00111000b    ;Function set,
                                                             ;Data 8 bit,2 line font 5x8
                Call         write_inst ;
                mov        r1,#00001100b    ;Display on,
                                                              ;cursor off,cursor blink off
                Call         write_inst
                Mov       r1,#00000111b    ;Entry mode, Set increment
                Call         write_inst
           ret
           ;
Write_inst:
           Clr                P3.6                 ; RS = P3.6= 0, write mode instruction
           Mov            P0,R1               ; D7 s/d D0 = P0 = R1
           Setb             P3.7                 ; EN = 1 = P3.7
           Call              delay               ; call delay time
           Clr                P3.7                 ; EN = 0 = P3.7
           ret
           ;
Write_data:
           Setb             P3.6                 ; RS = P3.6 = 1, write mode data
           Mov            P0,R1               ; D7 s/d D0 = P0 = R1
           Setb             P3.7                 ; EN = 1 = P3.7
           Call              delay               ; call delay time
           Clr                P3.7                 ; EN = 0 = P3.7
           ret
;
word1:   DB 'GUNAWAN AMSARI ELEKTRO'               
;
Delay:                    push       06h
                               push       07h
                               mov        r6,#080h
LDel:                      mov        r7,#0ffh
                               djnz         r7,$
                               djnz         r6,LDel
                               pop         07h
                               pop         06h
                               ret
                               end

Kalau mau coba silahkan tinggal copy aja. Kalau mau merubah tulisan tinggal edit bagian yang bertulisan GUNAWAN AMSARI ELEKTRO nya.

Semoga Bermanfaat.... 
READ MORE - Pengujian LCD karakter 2X16 dengan Program Sederhana menggunakan Bahasa Program Assembly

Jumat, 03 Februari 2012

RTC DS12C887: Pendahuluan

Real Time Clock merupakan suatu chip (IC) yang memiliki fungsi sebagai penyimpan waktu dan tanggal. Artikel ini membahas sebuah IC RTC yaitu DS12C887 yang memiliki register yg dapat menyimpan data detik, menit, jam, tanggal, bulan dan tahun. RTC ini memiliki 128 lokasi RAM yang terdiri dari 15 byte untuk data waktu serta kontrol, dan 113 byte sebagai RAM umum.

RTC DS 12C887 menggunakan bus yang termultipleks untuk menghemat pin. Timing yang digunakan untuk mengakses RTC dapat menggunakan intel timing atau motorola timing. RTC ini juga dilengkapi dengan pin IRQ untuk kemudahan dalam proses.
Detil dari RTC DS12C887
Berikut ini gambar pin-pin dari RTC DS 12C887, jumlah total pin-nya sebanyak 13 buah :
Gambar 1 Pin RTC DS 12C887
Gambar 2 Diagram Blok DS12C887
Terlihat dari diagram blok tersebut bahwa RTC terbagi menjadi beberapa bagian utama dengan kontrol maupun I/O untuk operasinya.
Berikut ini keterangan dari fungsi masing-masing pin…
  • AD0-AD7 - Multiplexed Address/Data Bus
  • NC - No Connect (tidak dihubungkan kemana-mana)
  • MOT - Pemilih tipe bus
  • CS - Masukan RTC Chip Select
  • AS - Address Strobe (ALE)
  • R/W - Masukan Read/Write
  • DS - Data Strobe
  • RESET - Masukan Reset
  • IRQ - Luaran Permintaan Interupsi
  • SQW - Luaran Gelombang Kotak
  • VCC - +5 Volt Main Supply
  • GND - Ground
Penjelasan singkat dari masing-masing pin RTC DS12C887 sebagai berikut :
  1. AD0 - AD7 (Adrress/Data bus yang ter-multipleks dan dwi-arah)Bus yang ter-multipleks akan menghemat penggunaan pin karena informasi alamat dan data menggunakan jalur sinyal yang sama. Siklus bus pertama digunakan untuk jalur alamat, dan siklus bus kedua digunakan untuk jalur data (bergantian antara alamat dan data). Intinya, kirim alamat melalui AD0-AD7 kemudian lakukan penguncian alamat menggunakan siklus 0-1-0 pada AS/ALE, kemudian dilanjutkan dengan proses pembacaan atau penulisan data ke alamat tersebut. RTC menghasilkan luaran 8 bit data pada saat pin DS dan RD diberi pulsa. Bus akan menjadi berimpedansi tinggi saat pulsa LOW diberikan pada pin DS (motorola) atau pulsa HIGH diberikan pada pin RD (intel).
  2. MOT (Mode Select)Pin MOT memberikan kebebasan untuk memilih dua tipe bus. Ketika pin ini dihubungkan dengan VCC, maka pewaktuan bus Motorolla yang dipilih, sedangkan ketika dihubungkan ke ground atau dibiarkan (tak dihubungkan) maka pewaktuan bus Intel yang dipilih. Pin ini memiliki pull down internal sekitar 20 kOhm.
  3. CS (Chip Select Input)Intinya, CS digunakan untuk aktivasi IC RTC DS12C887, Anda bisa menghubungkan CS ke GND supaya selalu aktif, atau bisa melalui salah satu pin dari mikrokontroler yang digunakan, jika ada beberapa piranti pada modul aplikasi Anda, sehingga kita bisa melakukan aktivasi secara manual di dalam program. Saat Vcc berada dibawah 4.25 volt, maka DS12C887, secara internal, akan menahan akses siklus bus dengan cara menon-aktifkan masukan CS. Aksi ini akan melindungi data jam real time dan isi dari RAM selama terjadi gangguan tegangan.
  4. AS (Address Strobe)Perubahan dari 0 ke 1 pada AS digunakan untuk menghapus alamat sebelumnya. Sedangkan perubahan dari 1 ke 0 akan menyebabkan jalur AD0-AD7 dianggap sebagai alamat memori DS12C887. Perintah akses (apakah baca atau tulis) harus dikirim bersamaan dengan proses ini.
  5. R/W (Read/Write Input)Pin R/W memiliki 2 mode operasi.
    1. MOT dihubungkan ke Vcc, Pewaktuan bus Motorola
      • R/W=HIGH dan DS=HIGH, maka terjadi siklus baca.
      • R/W=LOW dan DS=HIGH, maka terjadi siklus tulis.
    2. MOT dihubungkan ke GND, Pewaktuan Bus Intel
      • R/W aktif LOW, diberi nama WR = WE (write enable) pada RAM-RAM umum.
  6. DS (Data Strobe atau Masukan Baca)Pin DS/RD memiliki 2 mode operasi.
    1. MOT dihubungkan ke Vcc, Pewaktuan bus Motorola
      • DS digunakan sebagai Data strobe,
      • Berkaitan dengan proses baca/tulis
    2. MOT dihubungkan ke GND, Pewaktuan Bus Intel
      • DS/RD aktif LOW sebagai pin RD sama seperti pada RAM-RAM umum
  7. RESET (Reset Input)Pin RESET tidak berpengaruh terhadap jam, kalender atau RAM. Pada saat penyalaan RTC, pin RESET dapat dijaga LOW untuk beberapa saat untuk menstabilkan catu daya. Lamanya waktu pin RESET diberikan low tergantung dari aplikasi yang digunakan. Akan tetapi jika reset digunakan saat power up (penyalaan), waktu RESET dijaga low harus melebihi 200 ms untuk meyakinkan bahwa timer internal dari RTC untuk penyalaan telah cukup.
  8. IRQ (Interrupt Request Output)Pin IRQ adalah keluaran active low dari RTC 12C887 yang digunakan sebagai masukan interupsi pada prosessor. Keluaran IRQ tetap low selama bit status menyebabkan interupsi terjadi dan bit yang berhubungan yaitu interrupt-enable di-set. Untuk menghapus interupsi biasanya dilakukan dengan membaca register C. Pin RESET juga menghapus interupsi yang dilakukan atau yang belum terjadi (pending). Ketika tidak terjadi interupt maka level IRQ berada pada kondisi high impedance. Beberapa peralatan interupsi dapat dihubungkan dengan IRQ bus. Bus IRQ adalah keluaran open drain dan memerlukan tambahan resistor pull-up.
  9. SQW (Square Wave Output)Pin SQW dapat mengeluarkan sinyal kotak, dari satu sampai 13 pembagian yang disediakan oleh 15 buah tingkat pembagi (divider) internal dari RTC. Frekuensi dari SQW dapat dipilih dengan memprogram register A seperti pada tabel. Sinyal SQW dapat dihidupkan dan dimatikan dengan mengatur bit SQWE pada register B. Sinyal SQW tidak hidup ketika VCC dibawah 4,25 volt.
  10. GND, Vcc
    Merupakan pin untuk atu daya RTC. Vcc diberikan input +5volt. Ketika tegangan 5 volt diberikan dalam batas yang normal, RTC bebas diakses dan data dapat ditulis atau dibaca. Sedangkan ketika Vcc dibawah 4.25 volt, maka proses baca dan tulis tidak dapat dilakukan. Akan tetapi, proses pewaktu (timekeeping) tetap dilakukan oleh RTC tanpa dipengaruhi oleh tegangan masukan yang rendah. Saat Vcc turun dibawah 3 volt, catu daya untuk RAM dan pewaktu dipindahkan ke internal lithium batery yang terdapat pada RTC. Fungsi pewaktu dari RTC memiliki akurasi ± 1 menit per bulan pada suhu 250 C walaupun tanpa adanya catu pada Vcc.
Links:
  • RTC DS12C887: Pendahuluan (klik)
  • RTC DS12C887: Register Data dan Kontrol (klik)
  • RTC DS12C887: Contoh Aplikasi (klik)
READ MORE - RTC DS12C887: Pendahuluan

RTC DS12C887: Register Data dan Kontrol

DS12C887 mempunyai 14 buah register yang terdiri dari 4 Register Kontrol dan 10 Register Data. Register Data sendiri terpisah menjadi register waktu dan Register Alarm sebagaimana ditunjukkan pada gambar 1. Setelah Register-register Kontrol diinisialisasi, maka data waktu ataupun alarm dapat dibaca atau ditulisi dengan cara mengakses register-register data yang bersangkutan.


Gambar 1. Pemetaan alamat pada RTC DS12C887
Register-register Kontrol
DS12C887 memiliki empat register kontrol yang bisa diakses sepanjang waktu, meskipun selama siklus pembaharuan (update cycle).
  • UIP : Bit ini digunakan untuk memantau Flag Update In Progress (UIP). Jika bit ini bernilai 1, maka Update Transfer akan segera muncul, namun bila bit ini bernilai 0, maka Update transfer hanya akan muncul setelah 244 uDetik kemudian.
  • DV0, DV1, DV2 : Ketiga bit ini berfungsi untuk mengatur osilator ON atau OFF, dan me-RESET hitung mundur. Kofigurasi 010 digunakan untuk mengatur osilator ON, konfigurasi 11x digunakan untuk mengatur agar perhitungan mundur ditahan.
  • RS0, RS1, RS2 dan RS3 : Bit-bit ini digunakan untuk memilih 15 tingkat pembagi frekwensi yang dapat digunakan untuk membangkitkan sinyal luaran pada pin SQW atau Interupsi periodik. Tabel berikut menunjukkan berbagai macam kemungkinan frekuensi luaran SQW dan laju Interupsi Preiodik berdasar nilai-nilai RS0, RS1, RS2, dan RS3.
  • SET : Apabila bit ini bernilai 0, maka register data dapat diupdate setiap detiknya, namun apabila bit ini bernilai 1, maka register data tidak dapat diupdate. Bit ini tidak akan berpengaruh terhadap kondisi RESET.
  • PIE : Periodic Interrupt Enable, merupakan sebuah bit baca/tulis yang membolehkan bit PF atau Periodic Interrupt Flag pada Register C meng-nol-kan pin luaran IRQ. Jika PIE = 1, maka interupsi periodik akan dihasilkan dengan meng-nol-kan pin luaran IRQ dengan laju yang ditentukan oleh RS0 s/d RS2 (lihat penjelasan sebelumnya).
  • AIE : Alarm Interrupt Enable, bit yang membuat bit Alarm Flag dapat membangkitkan kondisi LOW pada pin IRQ. Kondisi RESET akan mengubah bit ini menjadi clear atau bernilai 0.
  • UIE : Update Ended Interrupt Enable, bit yang membuat bit Update End Flag (UF) dapat membangkitkan kondisi LOW pada pin IRQ. Kondisi RESET atau logika 1 pada bit SET akan membuat bit ini berubah menjadi clear (bernilai 0).
  • SQWE : Apabila bit ini bernilai 1, maka gelombang kotak dengan frekwensi yang ditentukan oleh pembagi frekwensi pada RS0 s/d RS3 akan dihasilakn melalui pin SQW.
  • DM : DM = 1 untuk mode binary dan DM = 0 untuk data BCD pada Register Data.
  • 24/12: Apabila bit ini bernilai 1, maka waktu berjalan berdasarkan 24 jam dan sebaliknya bila bit ini bernilai 0, maka waktu berjalan berdasarkan 12 jam.
  • DSE : Daylight Saving Enable, apabila bit ini bernilai 1, maka akan terjadi proses update pada saat 1:59:59 AM menjadi 3:00:00 AM pada Hari Minggu pertama bulan April dan saat 1:59:59 AM menjadi 1:00:00 AM pada Hari Minggu terakhir Bulan Oktober.
  • IRQF : Interrupt Request Flag, bit ini akan bernilai 1 apabila salah satu dari bit PF, AF dan UF juga bernilai 1.
  • PF : Periodic Interrupt Flag, bit ini akan bernilai 1 secara periodik (tergantung bit RS0 s/d RS3). Apabila bit PIE aktif, maka kondisi SET pada bit PF akan membangkitkan kondisi LOW pada pin IRQ. Bit ini akan bernilai 0 saat pembacaan pada Register C atau kondisi RESET.
  • AF : Alarm Interrupt Flag, bit ini akan bernilai 1 saat waktu sekarang cocok dengan waktu yang diatur pada alarm. Apabila bit AIE aktif, maka kondisi SET pada bit AF akan membangkitkan kondisi LOW pada pin IRQ. Bit ini akan bernilai 0 saat pembacaan pada Register C atau kondisi RESET.
  • UF: Update Ended Interrupt Flag, bit ini siklus update. Apabila bit UIE aktif maka kondisi SET pada bit ini akan membangkitkan kondisi LOW pada pin IRQ. Bit ini akan bernilai 0 (Clear) saat pembacaan pada Register C atau kondisi RESET
  • VRT: Bit The Valid RAM and Time ini merupakan indikator kondisi baterai yang terhubungkan ke pin Vbat. Bit ini tidak bisa ditulisi, dan seharusnya bernilai 1 terus saat dibaca. Jika terjadi nilai 0, artinya terjadi pelemahan arus/tegangan pada baterai, dan simpanan data RTC dan RAM menjadi dipertanyakan. Bit ini tidak dipengaruhi RESET.
READ MORE - RTC DS12C887: Register Data dan Kontrol