Thursday, January 3, 2013

Cara agar nilai dari variable global tidak berubah pada saat reset AVR dengan CVAVR

Cara agar nilai variable tidak di clear pada saat reset pada mikrokontroller AVR dengan menggunakan compiler CVAVR, yaitu
1. Masuk Project -> Configure
2. C Compiler -> Code Generation
3. Hilangkan tanda centang pada checkbox Clear Global Variable at Program Startup


Untuk informasi detail baca di usermanual CVAVR

Semoga bermanfaat

Wednesday, November 30, 2011

Format sprintf





untuk mengaktifkan fitur sprintf pada code vision Avr jangan lupa seting konfigurasinya seperti pada gambar diatas.
selamat mencoba semoga bermanfaat

Monday, February 21, 2011

Timer ATtiny dengan osilator internal


Timer ATtiny menggunakan internal calibrate RC oscilator
Led berkedip dengan frekuensi 1 Hz



Menggunakan internal calibrate RC oscilator 8.000.000 hz, mikrokontroler akan menjalankan timer dan membandingkan dengan nilai 0x7d (decimal 125) bila sama, CPU akan terinterupsi ( = terjadi setiap 1 ms) dan berulang terus-menerus, dengan menggunakan fasilitas interupsi dan menuliskan code pada Timer 0 output compare A interrupt service routine seperti pada potongan program di bawah, maka akan mengakibatkan led yang dipasang pada PORTD.0 menyala berkedip dengan frekuensi  1hz dan duty cycle 50% (low level 500 ms dan high level 500ms). Berikut potongan programnya

#include <tiny2313.h>
Int temp_count= 0;

// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
if (timercount == 500) PORTD.0 = ~PORTD.0;
}
void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
// State6=T State5=T State4=T State3=T State2=T State1=T State0=0
PORTD=0x00;
DDRD=0x01;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x02;
TCCR0B=0x03;
TCNT0=0x00;
OCR0A=0x7D;
OCR0B=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// Global enable interrupts
#asm("sei")
while (1)
      {
      // Place your code here
      };
}

Saturday, November 20, 2010

Jam Digital RTC DS1307 ATmega8535

Saya mencoba untuk share tentang pembutan jam digital dengan RTC DS1307, kenapa menggunakan DS1307, karena bila power padam jam tetap jalan dan komunikasi data menggunakan I2C sehingga menghemat pin.
berikut ini source code nya:
#include <mega8535.h>

// I2C Bus functions
#asm
   .equ __i2c_port=0x18 ;PORTB
   .equ __sda_bit=1
   .equ __scl_bit=0
#endasm
#include <delay.h>
#include <bcd.h>
#include <i2c.h>


unsigned char tahun,bulan,tanggal,hari,jam,menit,detik,temp;
// DS1307 Real Time Clock functions
#include <ds1307.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>

// External Interrupt 2 service routine  // menampilkan jam secara otomatis melalui fasilitas interupsi
interrupt [EXT_INT2] void ext_int2_isr(void)
{
// Place your code here
    tahun = rtc_read(0x06);
    bulan = rtc_read(0x05);
    tanggal = rtc_read(0x04);
    hari = rtc_read(0x03);
    jam = rtc_read(0x02);
    menit = rtc_read(0x01);
    detik = rtc_read(0x00);
    temp = jam >> 4;
    temp = temp + 0x30;
    lcd_gotoxy(4,0), lcd_putchar(temp);
    temp = jam & 0x0f;
    temp = temp + 0x30;
    lcd_putchar(temp);
    temp = menit >> 4;
    temp = temp + 0x30;
    lcd_gotoxy(7,0), lcd_putchar(temp);
    temp = menit & 0x0f;
    temp = temp + 0x30;
    lcd_putchar(temp);
    temp = detik >> 4;
    temp = temp + 0x30;
    lcd_gotoxy(10,0), lcd_putchar(temp);
    temp = detik & 0x0f;
    temp = temp + 0x30;
    lcd_putchar(temp);
  
    lcd_gotoxy(0,1);
    temp = hari;
    if (temp == 1) lcd_putsf("Ahad            ");
    if (temp == 2) lcd_putsf("Senin           ");
    if (temp == 3) lcd_putsf("Selasa          ");
    if (temp == 4) lcd_putsf("Rabu            ");
    if (temp == 5) lcd_putsf("Kamis           ");
    if (temp == 6) lcd_putsf("Jum'at          ");
    if (temp == 7) lcd_putsf("Sabtu           ");
  
    lcd_gotoxy(7,1);
    temp = tanggal >> 4;
    temp = temp + 0x30;
    lcd_putchar(temp);
    temp = tanggal & 0x0f;
    temp = temp + 0x30;
    lcd_putchar(temp);
  
    lcd_putchar('/');
  
    temp = bulan >> 4;
    temp = temp + 0x30;
    lcd_putchar(temp);
    temp = bulan & 0x0f;
    temp = temp + 0x30;
    lcd_putchar(temp);
  
    lcd_putchar('/');
  
    temp = tahun >> 4;
    temp = temp + 0x30;
    lcd_putchar(temp);
    temp = tahun & 0x0f;
    temp = temp + 0x30;
    lcd_putchar(temp);
    
  
    temp = (tanggal - 1) * 5;
    subuh = pntr[temp + 0];
    duhur = pntr[temp + 1];
    asar = pntr[temp + 2];
    maghrib = pntr[temp + 3];
    isya = pntr[temp + 4];
}

void main(void)
{
PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0xB0;

PORTC=0x03;
DDRC=0x03;

PORTD=0x80;
DDRD=0x80;

TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;



// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: On
// INT1 Mode: Falling Edge
// INT2: On
// INT2 Mode: Falling Edge
GICR|=0xE0;
MCUCR=0x0A;
MCUCSR=0x00;
GIFR=0xE0;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// I2C Bus initialization
i2c_init();

// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: On
// Square wave frequency: 1Hz
rtc_init(0,1,0);
temp = rtc_read(0);
if ((temp & 0x80) == 0x80) rtc_write(0,0);

// LCD module initialization
lcd_init(16);

// Global enable interrupts

bulan = rtc_read(0x05);
tanggal = rtc_read(0x04);
jam = rtc_read(0x02);
menit = rtc_read(0x01);
 
#asm("sei")
lcd_gotoxy(0,0), lcd_putsf("      :  :      ");

while (1) ;
}

jam digital akan ditampilkan secara otomatis melalui fasilitas interupsi external yang akan terjadi setiap detik, karena interupsi external dihubungkan ke SQR out dati RTC.
berikut ini gambar rangkaiannya
terimakasih telah berkunjung, bila ada saran untuk perbaikan konten, dipersilahkan...

Friday, August 27, 2010

LM331 sebagai ADC alternatif

Pemanfaatan LM331 yang merupakan piranti untuk mengubah tegangan ke frekuensi dapat dimanfaatkan sebagai alternatif ADC (Analog to Digital Convertion) dengan cara yang sangat sederhana, yang dibutuhkan hanyalah mikrokontroler yang memiliki fasilitas timer. langkah - langkahnya sebagai berikut
  1. Buatlah rangkaian LM331 sesuai dengan yang ada dalam data sheet. Perhatikan rumus hubungan antara tegangan input dengan frekuensi yang akan dihasilkan, gunakanlah resistor dengan toleransi 1%.
  2. Tegangan suplay(Vcc) minimal harus 1,5 dari tegangan input maksimal, misalkan tegangan input maksimal adalah 5V, maka Vcc minimal adalah 7,5V.
  3. Antarmuka antara LM331 dengan mikrokonroler sebaiknya menggunakan interupsi untuk mencacah jumlah pulsa dari output LM331, baik interupsi eksternal maupu memanfaatkan fasilitas counter pada timer.
  4. Buatlah program timer pada mikrokontroler sebagai waktu sampling, misalnya waktu sampling adalah 1 detik, maka program yang dijalankan mikrokontroler akan membaca jumlah pulsa yang yang masuk selama 1 detik.
  5. Sesuai dengan rumus konversi yang ada pada datasheet, sebagai contoh konversi yang dipakai adalah 1Volt = 1000 Hz, maka hasil pembacaan pada mikrokontroler akan menghasikan angka 1000 bila inputnya 1V dan akan menghasilkan angka 10 bila tegangan inputnya adalah 10mV.
  6. Dari sini kita sudah bisa membaca data analog menjadi data digital
selamat berkreasi...semoga membantu..

Wednesday, August 11, 2010

salam pembuka

dengan rahmat Tuhan Allah SWT, saya mulai membuat blog yang nantinya banyak mengandung konten tentang apa saja yang berhubungan dengan digital elektronik dan mikrokontroler, beragam aplikasi dan penjelasannya....
semoga bermanfaat bagi perkembangan teknologi Indonesia tercinta....
amin....