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
Sebagai Pengingat
Biar Bisa mengingat kembali ide yang pernah terlintas dipikiran, ilmu yang pernah kita peroleh, maupun kritik saran yang pernah orang lain berikan kepada kita. Dan semoga bermanfaat bagi sesama
Thursday, January 3, 2013
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...
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
- 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%.
- Tegangan suplay(Vcc) minimal harus 1,5 dari tegangan input maksimal, misalkan tegangan input maksimal adalah 5V, maka Vcc minimal adalah 7,5V.
- Antarmuka antara LM331 dengan mikrokonroler sebaiknya menggunakan interupsi untuk mencacah jumlah pulsa dari output LM331, baik interupsi eksternal maupu memanfaatkan fasilitas counter pada timer.
- 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.
- 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.
- Dari sini kita sudah bisa membaca data analog menjadi data digital
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....
semoga bermanfaat bagi perkembangan teknologi Indonesia tercinta....
amin....
Subscribe to:
Posts (Atom)