출처: http://cafe.naver.com/lazydigital/
과제3] 과제2의 디스플레이가 0.5초마다 깜빡깜빡하도록 해보기
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#define FND_NUMBER PORTC
#define FND_PLACE PORTG
int main(void)
{
int i; // 2byte (16bits) 인트형 변수 i초기값 0, a초기값 1
double t; // double형 8byte (64bits) 1.7E +/- 308(15자리 숫자)
//unsigned char num[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x6f,0x77,0xff,0x39,0xbf,0x79,0x71};
unsigned char place[4] ={0x08,0x04,0x02, 0x01};
unsigned char HELP[4] = {0x76,0x79,0x38,0x73};
DDRC = 0xff; // PORTC의 입출력 상태를 출력으로 모두 설정.
DDRG = 0x0f; // PORTG의 입출력 상태를 하위 4bits만을 출력 설정 상위 4bits는 입력설정.
while(1){
t=6.25;
FND_NUMBER = 0; //PORTC :소등
FND_PLACE = 0; //PORTG :0 으로초기화
_delay_ms(500); //딜레이:0.5sec (500/1000 sec)
for(i=0;i<4;i++){
FND_NUMBER = HELP[i]; //help에 해당하는값 입력
FND_PLACE = place[i]; //FND_SEL 선택 점등.
_delay_ms(t); //지연시간 4*6.25 = 25ms
}
}
}
[과제 2] 4-digit FND에 ‘HELP’라고 디스플레이해 보기
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#define FND_NUMBER PORTC
#define FND_PLACE PORTG
int main(void)
{
int i; // 2byte (16bits) 인트형 변수 i초기값 0, a초기값 1
double t; // double형 8byte (64bits) 1.7E +/- 308(15자리 숫자)
//unsigned char num[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x6f,0x77,0xff,0x39,0xbf,0x79,0x71};
unsigned char place[4] ={0x08,0x04,0x02, 0x01};
unsigned char HELP[4] = {0x76,0x79,0x38,0x73};
DDRC = 0xff; // PORTC의 입출력 상태를 출력으로 모두 설정.
DDRG = 0x0f; // PORTG의 입출력 상태를 하위 4bits만을 출력 설정 상위 4bits는 입력설정.
while(1){
t=4.25;
for(i=0;i<4;i++){
FND_NUMBER = HELP[i];
FND_PLACE = place[i];
_delay_ms(t);
}
}
}
[과제 1] ‘1234’ 디스플레이 예제에서 1루프 소요시간을 조금씩 늘여서 실행해 보고 사람이 잔상효과를 느끼는 한계시간이 얼마인지 알아보기 (20ms? 25ms? 30ms? 50ms? 100ms?)
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#define FND_NUMBER PORTC //포트표현의 편의를 위해 각 포트를 다음과 같이 정의하여 사용
#define FND_PLACE PORTG //PORTC >> FND_NUMBER, PORTG >> FND_PLACE
// FND 표시값 ("0":0x3f,"1":0x06,"2":0x5b,"3":0x4f,"4":0x66,"5":0x6d,"6":0x7c,"7":0x07)
//( "8":0x7f, "9":0x6f,"A":0x77,"B":0x7f,"C":0x39,"D":0x3f,"E":0x79,"F":0x71)
int main(void) //"0"과 "D" 표현값이 같이나와 0.을 D로 표시, 8과 B또한 8.를 B로표현.
{
int i; // 2byte (16bits) 인트형 변수 i초기값 0, a초기값 1
double t; // double형 8byte (64bits) 1.7E +/- 308(15자리 숫자)
unsigned char num[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x6f,0x77,0xff,0x39,0xbf,0x79,0x71};
unsigned char place[4] = {0x08,0x04,0x02, 0x01};
// 동일한 수형의 자료구조가 연속으로 나와 array를 사용 각 값들을 담아놓음.
// ungsined 양수형 8bits (0~255) 표현값 범위
DDRC = 0xff; // PORTC의 입출력 상태를 출력으로 모두 설정.
DDRG = 0x0f; // PORTG의 입출력 상태를 하위 4bits만을 출력 설정 상위 4bits는 입력설정.
while (1)
{
for(i=1;i<5;i++){
t = 6.25; // delay의 인자형이 double형이므로 double형 변수t를 선언 조건값 입력.
FND_NUMBER = num[i]; // 1~4까지 주소값에 대응하는 값을 PORTC로 출력[1.2.3.4]
FND_PLACE = place[i-1]; // 0~3까지 FND 자릿수를 점등.
_delay_ms(t); // 딜레이 20,25,30,35,50,100ms.에 대응되는 계산값을 입력하여 확인.
}
} // FND의 COM은 TR의 collerctor에 연결되어 있고 PORTG의 FND_SEL은 TR의base 에연결되어 있음
// set "1" 주어야 통전하여 점등됨.(회로도 JKIT-128-1을 참고함)
궁금한점이 있습니다!. 코드표현에 관한 부분인데요 과제1번에서 (20ms? 25ms? 30ms? 50ms? 100ms?)
조건을 다르게 하며 시험해보는것이 었는데 제가 해보고 싶었던건 사용자가 조건값을 따로따로 넣고 실행해서
확인하는것이 아니라 각각의 시간조건들에서" 1초나 임의의 지속 시간"을 주고 지속시간이 지나면 다음 단계로 넘어가게 짜보고 싶었습니다 잔상효과의 차이를 지연시간조건에 따라 한눈에 보고 싶은 마음에 한코드 안에서 실행 될수있하는게 목표였는데 해보다 해보다 않되서 이렇게 자문을 구하게됐습니다 아직 C언어표현이나 구문에 있어서 생소하고 이해도가 깊지않아 도움을 구하오니 실마리도 주시면 참고하여 해보겠습니다 ^^
자료출처 http://cafe.naver.com/lazydigital/ 작성자:임베디드 홀릭
t = 6.25;s = 0;
while (1)
{
for(i=1;i<5;i++){
FND_NUMBER = num[i]; // 1~4까지 주소값에 대응하는 값을 PORTC로 출력[1.2.3.4]
FND_PLACE = place[i-1]; // 0~3까지 FND 자릿수를 점등.
_delay_ms(t);
}
s += t; // s는 새로운 delay 가 얼마동안 누적되었는지를 가지고 있음.
if(s >= 1000.0) // 1초 이상이면
{
s = 0;
t += 0.5;
if(t >= 20.0) t = 6.25; // 20 ms 이상의 간격이 되면 다시 6.25로 돌아오기
}
}
아쉽게도 현재 winavr의 double은 float와 같이 32비트입니다.
지연시간 4*6.25 = 25ms
과제 3의 구현에
500ms 동안 끄고, (실제 끌때는 FND_PLACE = 0; 만 하면 되겠죠)
4개의 숫자 출력시간 25ms 켜는 건가요?
float t_tbl[4] = {6.0, 7.0, 8.0, 9.0, 10.0};
int k = 0;
while (1)
{
t = t_tbl[k];
for(i=1;i<5;i++){
FND_NUMBER = num[i]; // 1~4까지 주소값에 대응하는 값을 PORTC로 출력[1.2.3.4]
FND_PLACE = place[i-1]; // 0~3까지 FND 자릿수를 점등.
_delay_ms(t);
}
s += t; // s는 새로운 delay 가 얼마동안 누적되었는지를 가지고 있음.
if(s >= 1000.0) // 1초 이상이면
{
s = 0;
if(++k >= sizeof(t_tbl)/sizeof(t_tbl[0])) k = 0;
i
}
No comments:
Post a Comment