안녕하세요 (--)(__)
제가 그동안 참으로 많은 질문을 통하여 AVR을 점차 만들어 가고 있습니다. (전공분야가 아니어서 많이 헤맸거든요 ㅜㅜ)
도움을 주셔서 감사합니다.!
그런데...
제가 지금 atmega16으로 적외선 센서를 통한 FND 한개를 카운트하는 것과 가변저항으로 LED 8개를 가변저항에 따라 불이 켜지고 꺼지게 하는 것을 하고있습니다. 회로도 다짜서 빵판에 만들었고 소스를 넣었는데.. 가변저항을 통하여 LED 제어하는 것은 되는데... 왜 적외선을 통해 FND제어는 안되는 건지.. 감이 안옵니다..
FND불은 들어오는데..왜 작동을 안할가요..
아참 그리고 회로도에서 FND는 4개 붙어있는 형식으로 나오는데 나중에 이것은 만들 것이구요.. 일단 FND 1개로 실험중에있습니다.
소스랑 회로도 첨부 하였습니다 .ㅜㅜ
아직 소스부분 어떻게 수정을 해야할지 모르겠어요.. 딱히 틀렸다고 나오지는 않는데.. FND 불조차 들어오지 않으니..ㅜㅜ
#include <inttypes.h>
#include <stdlib.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
void delay_us(unsigned char);
void delay_ms(unsigned int);
void FndDisplay1(char byteData);
void ADC_level( void );
void IR_sensor(void);
//ADC 데이터를 표현하기 위한 데이터들
unsigned char ADC_L = 0x00 ; //ADC0의 하위바이트 결과저장
unsigned char ADC_H = 0x00 ; //ADC0의 상위바이트 결과저장
unsigned int ADC_RESULT = 0x00 ; //ADC의 결과저장
unsigned int i, j ;
unsigned int count =0;
unsigned int new_sensor=0;
unsigned int old_sensor=0;
int main(void)
{
//SFR 초기화
MCUCR = 0x00 ;
DDRA = 0xFF ;
DDRB = 0xFF ;
PORTB = 0xFF ;
// init_ADC();
while(1){
ADC_level();
IR_sensor();
}
}
void ADC_level( void )
{
while(1)
{
ADCH = 0x00 ; //변수 초기화
ADCL = 0x00 ; //변수 초기화
ADMUX = 0x00 ; //(0000 0000) 외부 ARE, 좌정렬
ADCSRA = 0xC7 ; //ADC enable, ADC clock 125kHz, ADC변환종료 인터럽트 활성화
SFIOR &= 0xEF ; //ADC not high speed
while((ADCSRA & 0x10) == 0); //변환 완료까지 기다림
ADC_L = ADCL ; // ADC0의 하위 바이트 결과
ADC_H = ADCH ; // ADC0의 상위 바이트 결과
//ADC0로 입력된 값을 10비트로 복원
ADC_RESULT = 0x00 ;
//ADC 상위바이트 값을 저장
ADC_RESULT = ADC_RESULT | ADC_H ;
// ADC_H 값은 ADC의 결과값 10비트 중 상위 바이트에 위치하고 상위 바이트중 0, 1 비트만
// 유효하므로 8비트 만큼 좌측으로 이동한 후 0h03000을 AND연상하여 저장
ADC_RESULT = 0x0300 & (ADC_RESULT << 8);
//ADC_L 값은 ADC의 결과값 10비트 중 하위 바이트에 위치하므로 바로 OR 연산한다.
ADC_RESULT = ADC_RESULT | ADC_L ;
if(ADC_RESULT < 128) PORTB = 0xFE ;
else if(ADC_RESULT < 256) PORTB = 0xFC ;
else if(ADC_RESULT < 384) PORTB = 0xF8 ;
else if(ADC_RESULT < 512) PORTB = 0xF0 ;
else if(ADC_RESULT < 640) PORTB = 0xE0 ;
else if(ADC_RESULT < 768) PORTB = 0xC0 ;
else if(ADC_RESULT < 869) PORTB = 0x80 ;
else PORTB = 0x00;
delay_ms(100) ;
}
}
void delay_us(unsigned char time_us)
{ register unsigned char i;
for(i=0; i < time_us; i++)
{
asm volatile(" push R0 ");
asm volatile(" pop R0 ");
asm volatile(" push R0 ");
asm volatile(" pop R0 ");
asm volatile(" push R0 ");
asm volatile(" pop R0 ");
}
}
void delay_ms(unsigned int time_ms)
{ register unsigned int i;
for(i=0; i < time_ms; i++)
{ delay_us(1);
delay_us(1);
delay_us(1);
delay_us(1);
}
}
void FndDisplay1(char byteData){
switch( byteData){
case 1: PORTC = 0b00000110; break;
case 2: PORTC = 0b01011011; break;
case 3: PORTC = 0b01001111; break;
case 4: PORTC = 0b01100110; break;
case 5: PORTC = 0b01101101; break;
case 6: PORTC = 0b01111101; break;
case 7: PORTC = 0b00000111; break;
case 8: PORTC = 0b01111111; break;
case 9: PORTC = 0b01100111; break;
case 0: PORTC = 0b00111111; break;
default : PORTC = 0b10000000; break;
}
}
void IR_sensor(void)
{
unsigned char chLastPinB=0;
char byteC=0;
DDRC=0xFF;
DDRB=0x00;
new_sensor = PINA & 0x02;
if( old_sensor != new_sensor ) count++;
old_sensor = new_sensor;
FndDisplay1( new_sensor );
}
가변저항 값 읽어서 led 에 출력하는 내용도 "공학도임다"님께서 올리시거군요^^
[프로그램 제작요청] 게시판은 글쓴이를 알 수 없어서
다른 분이 올린 내용인줄 알았습니다.~~
올려 주신 회로도는 너무 작아서 안보이고요^^
new_sensor = PINA & 0x02;
에서 new_sensor 값은 0 이나 2 만 들어오게 되는데
IR 센서를 ON/OFF 형태로 처리하려고 하신건지요?
그리고, PORTA 를 입력으로 사용하려면
DDRA = 0 으로 처리해 줘야 합니다.~