쉬발 분명 저렇게 회로 연결 완벽하게 다 햇고!! 어??
가변저항 돌리면 그 값을 ADC로 읽어서 LCD에 출력하면 되는데 어?? 쉬바 왜 값이 255로 나오고 안나오는거지??
#include <stdio.h>
#define F_CPU 16000000UL
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
#define lcd_data(i) (PORTC = i) // LCD에 데이터 출력
typedef unsigned char byte;
void delay_500m()
{
byte k;
for(k=0; k<50; k++)
_delay_ms(10);
}
void lcd_iw(byte inst) // LCD 명령 출력함수
{ // 4비트 모드
PORTA = 0x04; // LCD 명령 쓰기 이네이블
lcd_data(inst & 0xf0); // 명령어 상위 4비트를 LCD에 출력
PORTA &= 0xfb; // LCD Disable
PORTA = 0x04;
lcd_data(inst<<4); // 명령어 하위 4비트를 LCD에 출력
PORTA &= 0xfb;
_delay_ms(200);
}
void lcd_dw(byte dw) // LCD 데이터 출력함수
{
PORTA = 0x05; // LCD 데이터 쓰기 이네이블
lcd_data(dw & 0xf0); // 데이터 상위 비트 LCD에 출력
PORTA &= 0xfb; // LCD Disable
PORTA = 0x05;
lcd_data(dw<<4); // 데이터 하위 4비트를 LCD에 출력
PORTA &= 0xfb;
_delay_us(400);
}
void init_lcd(void) // LCD 초기화
{
lcd_iw(0x20);
lcd_iw(0x28); // 4 비트 모드, 2 줄로 표시하며, 5x7 도트
lcd_iw(0x06); // 문자를 오른쪽으로 이동시키면서 표시
lcd_iw(0x0c); // 화면 표시, 커서 표시 안함
lcd_iw(0x01); // LCD 화면을 클리어
}
void lcd_str(char *str) // 문자열 출력함수
{
while(*str){
lcd_dw(*str++);
}
}
void htoa(byte hh)
{
lcd_dw((hh00)/100+'0');
lcd_dw((hh0)/10+'0');
lcd_dw(hh+'0');
}
// ADC 인터럽트 서비스 루틴
SIGNAL(SIG_ADC)
{
lcd_iw(0xca); // LCD 두 번째줄에 커서 위치
htoa(ADCW>>2); // 10비트 데이터 중 하위 2비트를 버리고, 8비트만 사용
// winavr/avr/include/avr/iom128.h를 보면 ADCL과 ADCW는 같은 주소
}
int main(void)
{
char *str1="<ADC Conversion>";
char *str2="< A/D = >";
DDRC = 0xf0; // 포트 C의 상위 4비트를 출력으로 설정
DDRA = 0x07; // 포트 A의 하위 3비트를 출력으로 설정
init_lcd();
lcd_str(str1);
lcd_iw(0xc0);
lcd_str(str2);
// ADC 이네이블, 오른쪽 정렬, 분배비 64로 250kHz ADC 클럭 주파수 설정
ADCSRA=0x8E;
sei();
SREG |=0x80; // 전체 인터럽트 이네이블
do {
// 데이터를 오른쪽 정렬, 입력채널은 ADC0
ADMUX = 0x00;
// 단일 모드로 컨버팅 시작
ADCSRA |= 0x40;
// 500ms delay
delay_500m();
} while(1);
}
이럭게 코드까지 다 넣어서 햇는데 외 안되는거죠?? 이거 안되서 암걸릴거같은데 억덕게 해야댐;;
댓글 0