Salam Buat Teman-Teman Robotika, Kali Ini mau share Tentang Baca Nilai ADC di IC Multiplexer 8 Chanel 4051, Mikrokontroller yang kami pakai yaitu ATMEGA 16, nah untuk skematichnya bisa dilihat seperti gambar berikut:
- Bahasa Program yang Kami Pakai yaitu C, untuk membuatnya compiler pakai Software CV AVR.
-IC ATMEGA 16, Crystal 12 MHZ, LCD 16x2 di PORTC ,jadi listingnya kayak gini:
Chip type : ATmega16
Program type : Application
AVR Core Clock frequency: 12,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#include <stdio.h>
#include <delay.h>
#include <math.h>
#include <stdlib.h>
// Alphanumeric LCD functions
#include <alcd.h>
#asm
.equ __lcd_port = 0x15 ;PORTC
#endasm
-sekarang, didefenisikan Port IC ATMEGA 16 yang terhubung ke IC MUX 4051
#define sel1 PORTA.1
#define sel2 PORTA.2
#define sel3 PORTA.3
-Buat Variable dengan Isi 8 bit, yang nantinya akan di tempati 8 kemungkinan data yang akan di terima dari 8 chanel multiplexer, yaitu mulai dari 0 - 7.
unsigned int mux[8];
char temp[8];
-Listing baca nilai ADC 10 Bit
#define ADC_VREF_TYPE 0x40
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
-sekarang buat variable untuk melempar data ke Mux dan di codekan dengan 3 digit, (kenapa mesti 3 digit?, karena selector IC MUX 8 chanel ini selector-nya ada 3, yaitu A, B, dan C, dimana masing-masing kondisi dari selector tersebut bernilai 0/1, sehingga kondisinya nanti data yang dilempar yaitu mulai dari 0,0,0 sampai dengan 1,1,1).
void selector(int a,int b,int c)
{
sel1=c;
sel2=b;
sel3=a;
}
void bacamux()
{
selector(0,0,0);
mux[0]=read_adc(0);
selector(0,0,1);
mux[1]=read_adc(0);
selector(0,1,0);
mux[2]=read_adc(0);
selector(0,1,1);
mux[3]=read_adc(0);
selector(1,0,0);
mux[4]=read_adc(0);
selector(1,0,1);
mux[5]=read_adc(0);
selector(1,1,0);
mux[6]=read_adc(0);
selector(1,1,1);
mux[7]=read_adc(0);
}
oh, iya input ADC-nya ada di PORTA.0, makanya listingya read_adc(0), kalau pakai Port ADC yang lain silakan di ganti saja angka 0, didalm kurungnya sesuai urutan PORT input yang dipakai.
-Berikutnya buat variable untuk tampilkan nilai ADC yang terbaca ke LCD
void tampilmux()
{
bacamux();
itoa(mux[0],temp);
lcd_gotoxy(0,0) ;
lcd_puts(temp);
delay_ms(100);
itoa(mux[1],temp);
lcd_gotoxy(4,0) ;
lcd_puts(temp);
delay_ms(100);
itoa(mux[2],temp);
lcd_gotoxy(8,0) ;
lcd_puts(temp);
delay_ms(100);
itoa(mux[3],temp);
lcd_gotoxy(12,0) ;
lcd_puts(temp);
delay_ms(100);
itoa(mux[4],temp);
lcd_gotoxy(0,1) ;
lcd_puts(temp);
delay_ms(100);
itoa(mux[5],temp);
lcd_gotoxy(4,1) ;
lcd_puts(temp);
delay_ms(100);
itoa(mux[6],temp);
lcd_gotoxy(8,1) ;
lcd_puts(temp);
delay_ms(100);
itoa(mux[7],temp);
lcd_gotoxy(12,1);
lcd_puts(temp);
delay_ms(100);
}
-nah sekarang main programnya kayak gini:
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x20;
DDRB=0x20;
PORTC=0x0B;
DDRC=0x24;
PORTD=0x0F;
DDRD=0xF0;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0xF1;
TCCR1B=0x03;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ACSR=0x00;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
lcd_init(16);
while (1)
{
tampilmux();
}
}
sekian dulu tutorial dari kami, maaf kalau masih kurang bagus listingnya, maaf baru newbie.
thank for : forum.elins.org