아트메가128을 이용한 과제 하고 있는데


가변저항값을 조절하고 그걸 LCD에 값을 출력하는거거든


근데 연결 다 하고 LCD를 보면 가변저항값이 변동이 안되고 255에서 멈춰있음..






회로는 LCD의 RS RW E를 A0 01 02에 연결했고


D0~D7을 PC 0~7까지 연결 했어


가변저항은 가운데 PF0에 꽂고 나머지는 전원이랑 GND에 꽂고


회로구성에는 문제가 없는듯함





코드는 밑에 적어놓을게






#include <stdio.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.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 0 =      >";
    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);
}






내가 짠 코드는 아니라서 문제는 없을거같은데 회로는 몇번이나 다시 봤는데도 잘못된부분이 없고 작동이 안되네 뭐가 문젠지 모르겟어...