1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.
판매자 | 치토스 | 판매 납포인트 | 무료 | 평점 | 3.8점 / 총 5명 참여 |
---|
회로첨부가 안되서 여기가면 회로볼수있습니다
http://cafe.naver.com/jarb 하드웨어자료-> atmega128자료
실제회로처럼 세그먼트로 가는 부분에 470옴 저항을 연결해야 하는에 없어서 일단 그냥했습니다
나중에 달아야겠습니다 ...
세그먼트는 공통애노드형 3461AG써도 됩니다
그리기 힘들어서. 실은 잘몰라서 세그먼트를 좀 허접하게 그렸습니다 아래6핀 위에 6핀입니다
세그먼트자료는 인터넷에 많이 있으니깐요...
74ls47을 쓰면 포트수도 줄일수 있고 좀 편안하게 소스를 코딩가능합니다 BCD 로 입력을 받기때문입니다
예 ) 10(세그먼트)-> 1010 으로 (PD4~PD7)으로 출력하면 됩니다
DS12C8987은 자동으로 BCD로 출력하기 때문에
PORTC=0X04; //출력할 세그먼트선택 (PC0~PC3)
PORTD= sec/10<<4; //그냥 sec값을 바로포트에 대입했습니다 단 십의 자리 일의 자리구분해야 합니다
//저는 하다보니 포트를 하위비트(PD4~7을 써서 좌로 시프트한것 뿐입니다)
timer_delay_ms(3); // 계속 세그먼트를 4개 돌려야하기에 딜레이 잠시주고 반복적으로 찍음
// 밝기가 완벽히 조화되진 않았네요 저항을 안달아서 그런가....
UART로도 찍을수 있게 되있는데 변환기를 놔두고 와서 .. 테스트하고 올릴까 했는데 생각날때 안하면
카페에 올릴 시간이 없을것 같아서 미완성이지만 올렸습니다 죄송~ 꾸벅
아래 부분은 소스입니다
/*-----------------------------------------------------------------------------------------------------
교수님이 짜신 파일에 세그먼트부분, 딜레이 함수 추가했습니다
세그먼트는 정상적으로 찍힘 , 현재는 분,초만 표시
UART 점검해봐야 함 변환기를 학원에 두고 옴....
mcu: atme128
2010.7.1 전기홍
-----------------------------------------------------------------------------------------------------*/
//-----------------------------------------------------------------------------------------------------
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
//-----------------------------------------------------------------------------------------------------
void port_init();
void Write_Address(unsigned char addr);
void Write_Data(unsigned char addr,unsigned char data);
void rtc_init();
void TX0ch(char ch);
void TX0str(char *str);
void uart0_init();
char Read_Data(unsigned char addr);
void timer_init();
void timer_delay_ms(unsigned int limit);
//-----------------------------------------------------------------------------------------------------
unsigned int count; //오버플로 카운트
unsigned int x; //딜레이 시간결정
unsigned int t_flag=0;
unsigned int flag; //오버플로가 끝나면 timer_delay_sec함수를 빠져나오는 역할
//-----------------------------------------------------------------------------------------------------
SIGNAL(SIG_OVERFLOW0)
{
cli();
count++;
if(count==x)
{
count=0;
t_flag=1;
}
sei();
}
//-----------------------------------------------------------------------------------------------------
int main()
{
char sData[50],sec=0,min=0,hour=0,date=0,mon=0,year=0;
port_init();
rtc_init();
timer_init();
uart0_init();
sei();
TX0str("START");
while(1)
{
sec = Read_Data(0X00);
year = Read_Data(0X09);//year
mon = Read_Data(0X08);//월
date = Read_Data(0X07);//일
hour = Read_Data(0X04);//시
min = Read_Data(0X02);//분
sprintf(sData,"%u-%u-%u %u:%u:%u \n\r",year,mon,date,hour,min,sec);
TX0str(sData);
timer_delay_ms(3); //딜레이추가해야 에러(분의 십의자리 못가져옴)안남
PORTC=0X01;
PORTD=min/10<<4;
timer_delay_ms(3);
PORTC=0X02;
PORTD=min%10<<4;
timer_delay_ms(3);
PORTC=0X04;
PORTD= sec/10<<4;
timer_delay_ms(3);
PORTC=0X08;
PORTD= sec%10<<4;
timer_delay_ms(3);
}
}
//-----------------------------------------------------------------------------------------------------
void port_init()
{
DDRA = 0XFF;
DDRG = 0X07;
PORTG = 0X03;
DDRD=0XF0; //상위 4비트 BCD출력으로 설정(74LS47입력)
PORTD=0X00; //초기화
DDRC=0X0F; //하위 4비트 세그먼트 선택스위치로 설정
PORTC=0X00; //초기화
}
//-----------------------------------------------------------------------------------------------------
void Write_Address(unsigned char addr)
{
DDRA = 0XFF;
PORTA = addr;
PORTG = PORTG | 0X04;
PORTG = PORTG & ~0X04;//어드레스 0X0A LATCH
}
//-----------------------------------------------------------------------------------------------------
void Write_Data(unsigned char addr,unsigned char data)
{
Write_Address(addr);
DDRA = 0XFF;
PORTA = data;
PORTG = PORTG & ~0X01;//데이타 WRITE, RW LOW
PORTG = PORTG | 0X01;//데이타 WRITE, RW HIGH
}
//-----------------------------------------------------------------------------------------------------
void rtc_init() //처음시간셋팅시만 사용할것
{
Write_Data(0X0A,0X20); //RTC 동작 , 4HZ출력
Write_Data(0X0B,0X14); //초기 시간입력시는 SETBIT,DM,12HOUR비트 설정할것
Write_Data(0X09,10); //year
Write_Data(0X08,5); //월
Write_Data(0X07,27); //일
Write_Data(0X04,10); //시
Write_Data(0x02,20); //분
Write_Data(0X00,20); //초
}
//-----------------------------------------------------------------------------------------------------
void TX0ch(char ch)
{
while(!(UCSR0A&0X20));
UDR0 = ch;
}
//-----------------------------------------------------------------------------------------------------
void TX0str(char *str)
{
while(*str)
{
TX0ch(*str);
str++;
}
}
//-----------------------------------------------------------------------------------------------------
void uart0_init()//57600
{
UCSR0B = 0X98;
UBRR0L = 16;
}
//-----------------------------------------------------------------------------------------------------
char Read_Data(unsigned char addr)
{
Write_Address(addr);//초
DDRA = 0X00;
PORTG = PORTG & ~0X02;//데이타 READ LOW
PORTG = PORTG | 0X02;//데이타 READ, RW HIGH
return PINA;
}
//-----------------------------------------------------------------------------------------------------
void timer_init()
{
TCNT0= 6;
TCCR0= 0X24;
TIMSK|= (1<<TOIE0);
}
//-----------------------------------------------------------------------------------------------------
void timer_delay_ms(unsigned int limit) //int 형으로바꾸는 게 변환이 용이하다 char는8비트 128?까지밖에
{
count=0; //초기 카운트 값 초기화
x=limit; //1ms*1000=1초 원하는 값을 설정가능함
while(!(t_flag)); //flag가 1이면 빠과나온다 지연효과를 줌
t_flag=0;
}