안녕하세요 쭌지입니다.

3일만에 글쓰네요. 학교 생활 하다보니 조금씩 틀어지네요.


그리고 이렇게 부족한 블로그를 찾아와서 보시는 모든 분들 감사합니다.

글쓰는것에도 재주가 없고 블로그라는것도 처음 해보는거라 얼마나 찾아 오갰나 했는데

이러게 많이 찾아와 주셔서 (하루 30명 남짓에 총 400명밖에 안되는데 머가 많냐고 하시겠지만 저에겐 정말 많은 숫자입니다 ㅎㅎㅎ ) 정말 감사합니다.








자 그럼 저번엔 led제어를 해봤으니 led로 만든 fnd(7-segment)를 배워봅시다.

요즘이야 fnd를 잘 안쓴다해도 아직도 많이 보입니다.

그리고 led제어를 하는데 fnd만큼 공부가 잘되는것도 잘없거든요(제생각)


먼저 회로도를 보고 보드를 만들어야 겠지요?



 

저거 핀번호가 밀리는게 pdf로만 만들면 밀리는데 어떻게 수정해야 할지 모르겠네요ㅜㅜ


회로도 대로 빵판에다 꾹꾹 삽입하거나 열심히 납땜을 해서 보드를 만듭니다

저는 공통 이미터 fnd를 사용했습니다. 그리고 좌우보다는 상하로 되어있는걸 사시는걸 추천합니다.

트렌지스터 위치를 모르시는 분이 있으실수도 있으니(전 어디에 vcc 해야하는지도 모르는 상태에서 무턱데고 뛰어들었습니다 ㅎㅎ) 간단히 알려드리자면 화살표가 이미터, atmega와 연결된곳이 베이스, 남은 다리하나가 콜렉터 입니다.


그리고 주의!! 할점이 있습니다. 지금 쓴 트렌지스터가 KTA1266인데요. 얘가 데이터시트와 안맞습니다.


KTA1266.pdf

여기를 보시면 1. 이미터 2. 콜렉터 3. 베이스 라고 되어 있지만

실제로 해본결과 1. 베이스 2.콜렉터 3.이미터 였습니다. 

이 트렌지스터를 쓰실분은 주의해 주세요.

이것 땜에 몇시간동안 삽질만 했더랬죠 ㅜㅜㅜ 

데이터시트가 오류가 날줄은 상상도 못했는데 가끔 그런경우가 있는것 같더라고요 (0.001% 정도??)



빌드도 다만들었으면 이제 작동을 시켜봐야 겠죠

먼저 fnd 헤더파일을 받고 시작합시다. >>  fnd.h


fnd 4개 순서대로 0~9까지 나타내기


#include <avr/io.h>

#include "./../../../header/delay.h"//자신의 환경에 맞게 수정

#include "./../../../header/fnd.h"  //자신의 환경에 맞게 수정

#define f_cpu 16000000ul //16MHZ


int main(void) {

DDRB= 0xFF; 

DDRC= 0xFF; //port B C 를 출력으로 설정 합니다.

while(1) {

//portB: 표시할위치 portC: 숫자모양

   PORTC= NUMBER_0; PORTB= FND0; delay_ms(300);

PORTC= NUMBER_1; PORTB= FND1; delay_ms(300);

PORTC= NUMBER_2; PORTB= FND2; delay_ms(300);

PORTC= NUMBER_3; PORTB= FND3; delay_ms(300);

PORTC= NUMBER_4; PORTB= FND0; delay_ms(300);

PORTC= NUMBER_5; PORTB= FND1; delay_ms(300);

PORTC= NUMBER_6; PORTB= FND2; delay_ms(300);

PORTC= NUMBER_7; PORTB= FND3; delay_ms(300);

PORTC= NUMBER_8; PORTB= FND0; delay_ms(300);

PORTC= NUMBER_9; PORTB= FND1; delay_ms(300);

}

return(1);

}



모든 fnd가 0~9까지 한번에 출력

 fnd1.zip



#include <avr/io.h>

#include "./../../../header/delay.h"//자신의 환경에 맞게 수정

#include "./../../../header/fnd.h"  //자신의 환경에 맞게 수정


int main(void) {

DDRB= 0xFF; 

DDRC= 0xFF; //port B C 를 출력으로 설정 합니다.

while(1) {

//portB: 표시할위치 portC: 숫자모양

PORTB= FND0 & FND1 & FND2 & FND3; //모두 출력

PORTC= NUMBER_0;  delay_ms(300);

PORTC= NUMBER_1;  delay_ms(300);

PORTC= NUMBER_2;  delay_ms(300);

PORTC= NUMBER_3;  delay_ms(300);

PORTC= NUMBER_4;  delay_ms(300);

PORTC= NUMBER_5;  delay_ms(300);

PORTC= NUMBER_6;  delay_ms(300);

PORTC= NUMBER_7;  delay_ms(300);

PORTC= NUMBER_8;  delay_ms(300);

PORTC= NUMBER_9;  delay_ms(300);

}

return(1);

}




fnd led 같이 제어   fnd2.zip





#include <avr/io.h>

#include "./../../../header/fnd.h"

#include "./../../../header/delay.h"

#include "./../../../header/led.h"

#define f_cpu 16000000ul //16MHZ


//가독성을 높이기 위해 따로 선언을 해줬습니다.


void display_fnd(unsigned char number, unsigned char fnd)

{

PORTB= fnd;

PORTC= number;

}


int main(void)

{

DDRB= 0xFF;

DDRC= 0xFF;

unsigned char count=0;

unsigned char number[16]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};

unsigned char fnd[4]= {0,0,0,0,};

number[0]= NUMBER_0;

number[1]= NUMBER_1;

number[2]= NUMBER_2;

number[3]= NUMBER_3;

number[4]= NUMBER_4;

number[5]= NUMBER_5;

number[6]= NUMBER_6;

number[7]= NUMBER_7;

number[8]= NUMBER_8;

number[9]= NUMBER_9;

number[10]= NUMBER_A;

number[11]= NUMBER_B;

number[12]= NUMBER_C;

number[13]= NUMBER_D;

number[14]= NUMBER_E;

number[15]= NUMBER_F;

fnd[0]= FND0;

fnd[1]= FND1;

fnd[2]= FND2;

fnd[3]= FND3;

while (1)

{

display_fnd(number[1],fnd[0]); delay_ms(100);

display_fnd(FULL_OFF, fnd[0]); delay_us(10);

display_fnd(number[2],fnd[1]); delay_ms(100);

display_fnd(FULL_OFF, fnd[1]); delay_us(10);

display_fnd(number[0],fnd[2]); delay_ms(100);

display_fnd(FULL_OFF, fnd[2]); delay_us(10);

display_fnd(number[8],fnd[3]); delay_ms(100);

display_fnd(FULL_OFF, fnd[3]); delay_us(10);

count++;

if((count>100)&(count<200)){

PORTB= 0b11110110; delay_ms(200);

}

else{

PORTB= 0b11111001; delay_ms(200);

}

}return 1;

}


3번째 함수를 보면 선언 부분이 엄청 긴데요.

저렇게 해두면 fnd 위치나 출력 번호를 수정하는데 아주 유용합니다 . 괄호안의 숫자만 바꿔주면 되기 때문에 알파벳을 나타낼때도 숫자를 입력하면 가능하게 됩니다. 그리고 조건이나 for문안에서 작업할때에도 유용하게 쓰이게 됩니다.


그리고 외부 크리스탈을 쓰실때에는 f_cpu를 따로 지정해줘야 하는데요.

이게 소스 짤때마다 바꿔줘야 하는데 매번 까먹고 안쓰는경우가 생겨서 저걸 자동으로 입력 시켜 놓는방법을 알아볼게요. 


그럼 다음엔 f_cpu방법과 같이 fnd를 for문과 함께 제어하는 방법에 대해 쓰도로 할게요




그때 까지 다들 안녕히~~~~~  

'avr 기초' 카테고리의 다른 글

avr 모터제어의 꽃 PWM제어를 알아보자  (0) 2016.04.27
귀찮은 avr F_CPU설정 한번에 해버리자!  (0) 2016.03.21
atmega led switch  (0) 2016.03.07
atmega로 led켜기  (0) 2016.03.04
delay.h 헤더파일 소스 설명  (1) 2016.03.03
Posted by 탕구이

블로그 이미지
엔지니어를 꿈꾸는 공대생
탕구이

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

최근에 올라온 글

글 보관함