728x90

카운터와 LED TEST



VCC는 빨간선, GND는 검은색 선임을 잘 확인하고 기판에 연결



seven segment에 00 이 출력된다.






 3

 2

 1

 0

 3

 2

 1

 0

 J

 1

 9

 L

 L

 L

 L

 H

 L 

 L 

 H 


0 | 9

09를 출력하기 위해선 PORTA에서 J19에 연결되는 핀을 위와 같이 연결한다. 






프로그래밍을 통한 숫자 바꾸기


숫자 34 출력



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

#define DDRA (*((volatile unsigned long *)0x21)) #define PORTA (*((volatile unsigned long *)0x22)) #define PINA (*((volatile unsigned long *)0x20)) int main(void) //void 안적으면 컴파일시 warning isn't a prototype { volatile unsigned long uiCnt; DDRA=0xFF; // 모두 출력으로 쓴다. PORTA=0x00; PORTA=((34/10)<<4)|34%10; while(1) { } return 0; }


십자리에 3을 출력

34/10=3

3=0011  

0011<<4=00110000  // 0011의 비트를 왼쪽으로 4칸 이동 (shift 연산자)


일자리에 4를 출력

34/10의 몫은 3이고 "나머지는 4"


0011 0000

0000 0100

------------------비트 or연산 (논리합)

0011 0100




카운터 


#define DDRA	(*((volatile unsigned long *)0x21))
#define PORTA	(*((volatile unsigned long *)0x22))
#define PINA	(*((volatile unsigned long *)0x20))


int main(void) //void 안적으면 컴파일시 warning isn't a prototype
{
	volatile unsigned int uiCnt;
	volatile unsigned int uiLoop;

	DDRA=0xFF; // 모두 출력으로 쓴다.	
 	PORTA=0x00;

	uiCnt=0;
	while(1)
	{	
		for(uiLoop=0;60000>uiLoop;++uiLoop);
                PORTA=((uiCnt/10)<<4)|(uiCnt%10);
		++uiCnt;
	}
	return 0;
}



위 소스 그대로 프로그래밍시 카운터 앞자리가 사라지는 문제가 생긴다.



해결을 위해 while문 사이에 소스를 추가  if(uiCnt>99) { uiCnt=0; }
#define DDRA	(*((volatile unsigned long *)0x21))
#define PORTA	(*((volatile unsigned long *)0x22))
#define PINA	(*((volatile unsigned long *)0x20))


int main(void) //void 안적으면 컴파일시 warning isn't a prototype
{
	volatile unsigned int uiCnt;
	volatile unsigned int uiLoop;

	DDRA=0xFF; // 모두 출력으로 쓴다.	
 	PORTA=0x00;

	uiCnt=0;
	while(1)
	{	
                if(uiCnt>99)
		{
			uiCnt=0;
		}

		for(uiLoop=0;60000>uiLoop;++uiLoop);
                PORTA=((uiCnt/10)<<4)|(uiCnt%10);
		++uiCnt;
	}
	return 0;
}

앞자리 문제 해결



if, else문 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main()
{
	int iNum;
	printf("숫자를 입력하시오: \n");
	scanf("%d", &iNum);
	
	if(100<iNum)
	{
		printf("100보다 큰수입니다\n");
	}
	else
	{
		printf("100보다 작은수입니다\n");
	}
	return 0;
}

if()에서 괄호안이 조건


조건이 참일때 if {}의 내용들 수행

거짓일때 else {}의 내용들 수행



Output:





LED 교차 점등 TEST


#define DDRA (*((volatile unsigned char *)0x21)) #define PORTA (*((volatile unsigned char *)0x22)) #define PINA (*((volatile unsigned char *)0x20)) int main(void) //void 안적으면 컴파일시 warning isn't a prototype { volatile unsigned int uiCnt; unsigned int uiPos; uiPos=0; int iDir=1; DDRA=0xFF; // 모두 출력으로 쓴다. PORTA=0x00; // LED를 끈다. while(1) { if(1==iDir)// iDir(direction)이 1일때 { PORTA=~(1<<uiPos); //순방향 } else { PORTA=~(0x0080>>uiPos); //역방향 0x0080=1000 0000 } for(uiCnt=0;60000>uiCnt;++uiCnt); uiPos=uiPos+1; if(7<uiPos) { iDir=iDir*-1; // iDir이 -1이 되고 else{} 수행 uiPos=0; } } return 0; }


19번째 줄 PORTA=~(1<<uiPos);

~( )은 NOT 연산자


1<<uiPos   0000 0001을 왼쪽으로 uiPos(0~7)의 bit만큼 옮김

끝의 LED는 1000 0000이며, NOT 연산자인 ~()가 붙어서 0111 1111이 됨


PORTA


 L

 H

 H

 H

 H

 H

 H

 L

 0

 1

 1

 1

 1

 1

 1

 0



if(7<uiPos) { iDir=iDir*-1; uiPos=0; }

uiPos가 7을 초과할 시, iDir은 -1이 되고 else{} 수행


LED TEST



'Study > Embedded' 카테고리의 다른 글

20160316-LCD출력  (0) 2016.03.17
20160315-펌웨어 분석 및 학습  (0) 2016.03.16
20160314-펌웨어 분석(외부 인터럽트)  (0) 2016.03.15
20160310-CPU 모듈2  (0) 2016.03.10
20160309-CPU 모듈  (0) 2016.03.09
728x90

2016-03-10 <CPU 모듈>


Atmel ATmega 2560


Brown-out Detection 

특정 전압 이하로 떨어지는걸 방지, 자동으로 CPU를 리셋하는 회로.


Watchdog 

특정한 시간동안 시스템이 응답없으면 리셋시킴.


86 Programmable I/O Lines

86개의 제어가능한 입출력(Input/Output) 라인.



칩의 심박수가 곧 "Clock"


발진기(오실레이터)

발진회로 혹은 클럭발생기라고도 함


Crystal - XTAL  

수정발진자 혹은 수정진동자라고 함



16.000 MHz  

소수점 이하 0이 많이 붙을수록 정확한 진동자


1초에 16000000 개를 센다.


타이머 카운터(T/C) - 시간 측정회로, 기준이 되는 것은 동작 주파수




GPR(General Purpose Register)과 Data SRAM간의 Direct Addressing 

: Memory와 Register간 직접 주소 연결




AVR memories

256kb Flash Memory



0x7FFF(0~)-> 0x8000   -> 32768 /1024  -> 32

0xFFFF     -> 0X10000 -> 65536 /1024  -> 64

0x1FFFF    -> 0X20000 -> 131072/1024 -> 128


flash memory 한 Section에 2byte 공간을 가지기에 128 x 2 = 256kbyte를 가짐





인텔 CPU는 폰 노이만 구조. 폰 노이만은 컴퓨터 설계의 기본을 만든 천재 수학자.

하바드(Harvard) 구조는 양방향이라 효율적이고 빠르지만 단가가 비싸다. 



DDRA - Port A  Data Direction Register

데이터의 방향을 결정하는 레지스터


0-7번 비트까지 8bit Register를 가지며, 읽고 쓰기가 가능하다.

initial value(초기값)는 0이고 0과 1에 따라 Direction이 바뀐다. 


Port-출력과 방향

DDR-방향을 결정


Port에 값을 줄건지 말건지에 따라 5V 또는 0V 가 출력.




LED 두개, 교차 깜박임 실습


LED 두개의 한쪽 선을 각각 PORT A의 1번, 5번에 꼽음 (나머지 한쪽선은 각각 GND에 꼽음)




PORTA의 1번


 7

 6

 5

 4

 3

 2

 1

 0

 0

 0

 0

 0

 0

 0

 1

 0


0 | 2  


PORTA의 5번


 7

 6

 5

 4

 3

 2

 1

 0

 0

 0

 1

 0

 0

 0

 0

 0


| 0  




소스

#define DDRA	(*((volatile unsigned long *)0x21))
#define PORTA	(*((volatile unsigned long *)0x22))
#define PINA	(*((volatile unsigned long *)0x20))


int main(void) //void 안적으면 컴파일시 warning isn't a prototype
{
	volatile unsigned long uiCnt;
	DDRA=0xFF; // 출력으로 쓴다.	

	while(1)
	{
		for(uiCnt=0; 100000>uiCnt;++uiCnt);
		PORTA=0x02; //2번
		for(uiCnt=0; 100000>uiCnt;++uiCnt);
		PORTA=0x20; //5번		
	}
	return 0;
}



결과 - LED 두개가 번갈아 깜박거리는 것을 볼 수 있다.





전해 콘텐서는 순간적으로 전압이 떨어지는 걸 방지한다. (일종의 배터리)




'Study > Embedded' 카테고리의 다른 글

20160316-LCD출력  (0) 2016.03.17
20160315-펌웨어 분석 및 학습  (0) 2016.03.16
20160314-펌웨어 분석(외부 인터럽트)  (0) 2016.03.15
20160311-펌웨어분석 (FND, LED Test)  (0) 2016.03.12
20160309-CPU 모듈  (0) 2016.03.09
728x90


CPU 모듈


실습에 사용하는 장비 : Atmel ATmega 2560


135 instruction  - Cpu에게 내릴 수 있는 기계어 명령어 수


주파수 -> 초당 진동수, 이 주파수는 cpu에서 초당 계산 능력과도 연관된다.

 "주기(cycle)"가 1초에 몇번이냐에 따라 - Hz 등으로 표현  



전류 - 전기의 흐름

전압 - 전기의 압력


물탱크의 수압과 꼭지를 통해 흐르는 물을 생각하고 대입하면 이해하기 쉽다.


V=IR - 저항이 클수록 전류는 적게 흐름


일반적으로 한국은 AC(Alternating Current) 220v 60hz 

이는 1초동안 60번 +,- 극성이 바뀌는 것을 의미



P = VI

   = 220v * 1A

   = 220W = 0.22 KW



Atmel ATmega 2560 실습


개발 환경 구축


AVR Studio 설정




선이 연결되는 위치와 기반의 방향에 주의.

어댑터를 연결할 때는 전원을 꼭 내린채로 연결! 절대 주의!


windows 10 dll FILE

msys-1.0.zip

winavr문제해결.txt



AVR Studio 설정



Tools-Program AVR-Connect...  선택




STK500-COM3 연결

포트 연결은 시스템-장치관리자의 포트 항목에서도 확인 가능하다. 



Atmega2560을 선택한 후, Read Signature를 눌렀을 때 모두 OK!가 나오는지 확인.



Makefile 

각종 명령어가 담겨있으며 아래 항목들을 메모장으로 열어 환경에 맞게 수정해준다.


# MCU name

MCU = atmega2560  


# Processor frequency.

F_CPU = 16000000


# Target file name (without extension).

TARGET = main  // 항상 main.c를 기준으로 한다면 바꾸지 않음. main.c로 코딩하는 이유



LED제어를 위한 예제.

DDRA, PORTA, PINA 기능과 주소 부분은 Atmega25060의 datasheet 파일에서 확인 가능하다.


main.c 파일로 아래와 같이 소스를 짠다.

1
2
3
4
5
6
7
8
9
10
11
12
#define DDRA	(*((volatile unsigned char *)0x21))
#define PORTA	(*((volatile unsigned char *)0x22))
#define PINA	(*((volatile unsigned char *)0x20))

int main(void) //void 안적으면 컴파일시 warning isn't a prototype
{
	DDRA=0xFF; // 출력으로 쓴다.
	PORTA=0xFF; //모든 다리를 5v로 만듬
	
	while(1); //초기상태로 돌리지 않기위해 항상 씀. 	
return 0;
}


명령창에서 make를 입력후 엔터하면 위와 같이 파일들이 생성된다.



int main() 에서 괄호안에 void를 안 적으면 아래와 같이 Warning message가 출력




make clean은 main.c와 Makefile을 제외하고 모두 지우는 명령어



int main(void)라고 수정후 make.  Warning 뜨지 않음


컴파일이 성공적으로 되었으면 Program탭에서 Flash 항목에  HEX File을 선택후 Program을 누른다. (당연히 전원 들어온 상태에서만 쓰기가능)



LED 제어 실습

먼저 LED를 10번 GND부터 연결, 극성과 위치를 설계도를 보며 잘 확인할 것!


설계도를 볼때는 x,y축을 통해 원하는 정보의 위치를 대략적으로 찾을 수도 있다.



메인보드 뒤쪽에도 번호가 적혀있다.



LED가 극성에 맞게 모두 잘 연결되었다면 위와 같이 LED에 불빛이 들어온다.



깜박거리는 LED 만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define DDRA	(*((volatile unsigned char *)0x21))
#define PORTA	(*((volatile unsigned char *)0x22))
#define PINA	(*((volatile unsigned char *)0x20))

int main(void) //void 안적으면 컴파일시 warning isn't a prototype
{
	volatile unsigned int uiCnt;
	DDRA=0xFF; // 출력으로 쓴다.

	while(1)
	{
		for(uiCnt=0; 60000>uiCnt;++uiCnt); //숫자가 낮으면 빨리 깜박임
		PORTA=0xFF;
		for(uiCnt=0; 60000>uiCnt;++uiCnt);
		PORTA=0x00;
	}
	return 0;
}


어제 배운 volatile을 응용한 예제이다. 의도적인 지연을 통해 불빛이 들어오고 나가는 시간을 조절할 수 있다.


make clean후 다시 make.

아까전 Program탭에서 Flash 항목에서 다시 Program을 누른다.


실습 결과 LED가 일정한 간격으로 깜박거리는 것을 볼 수 있다.




'Study > Embedded' 카테고리의 다른 글

20160316-LCD출력  (0) 2016.03.17
20160315-펌웨어 분석 및 학습  (0) 2016.03.16
20160314-펌웨어 분석(외부 인터럽트)  (0) 2016.03.15
20160311-펌웨어분석 (FND, LED Test)  (0) 2016.03.12
20160310-CPU 모듈2  (0) 2016.03.10

+ Recent posts