하드웨어 설계에 관련한 공개 강좌를 게재하는 공간입니다.
운영진에 의해 강좌글은 편집되며, 공익을 위한 게시글은 '하드웨어 강좌'란으로 이동될 수 있습니다.
판매자 | 아크마 | 판매 납포인트 | 무료 | 평점 | 1.0점 / 총 1명 참여 |
---|
/*****************************************************
Project :
Version :
Date : 2006-02-25
Author : JanusK
Company : arcs
Comments:
Chip type : ATmega128
Program type : Application
Clock frequency : 16.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 1024
*****************************************************/
/* polling 방식으로 adc 값을 읽어 lcd에 순차적으로 출력하는 프로그램
가변저항의 전압값이나 센서등을 부착하면 되고
하이패스 필터가 달리면 작동이 안된다.
*/
#include <mega128.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
#include <delay.h>
#include <stdio.h>
#define ADC_VREF_TYPE 0x00
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void start_adc()
{
// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Voltage Reference: AVREF pin
// ADC High Speed Mode: Off
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x87;
SFIOR=0xEF;
delay_ms(100); // adc가 초기화될때까지 잠시 기다림
}
void main(void)
{
char lcd_buf[16];
int adc_data;
int adc_cnt;
DDRG = 0x18;
DDRF = 0x00;
adc_cnt =0;
// LCD module initialization
lcd_init(8);
lcd_gotoxy(0,0);
lcd_putsf("adc test");
start_adc();
while (1)
{
adc_data = read_adc(adc_cnt);
sprintf(lcd_buf, "%d : %4d", adc_cnt, adc_data);
lcd_gotoxy(0,1);
lcd_puts(lcd_buf);
adc_cnt++;
if(adc_cnt==8)adc_cnt=0;
delay_ms(1000); //1초 지연
};
}