메모리 위치 확인----------------
<소스>
#include <stdio.h>
int D;
int E = 99;
int F;
int G = 98;
int H;
int main()
{
int A = 0;
int B;
int C = 100;
printf("---------Code 영역---------\n");
printf("|printf의 주소: %p \n", &printf);
printf("|main의 주소: %p \n", &main);
printf("---------Code 영역---------\n");
printf("---------Data 영역---------\n");
printf("G의 주소: %p \n", &G);
printf("E의 주소: %p \n", &E);
printf("---------Data 영역---------\n");
printf("---------BSS 영역---------\n");
printf("D의 주소: %p \n", &D);
printf("F의 주소: %p \n", &F);
printf("H의 주소: %p \n", &H);
printf("---------BSS 영역---------\n");
printf("---------Stack 영역---------\n");
printf("A의 주소: %p \n", &A);
printf("B의 주소: %p \n", &B);
printf("C의 주소: %p \n", &C);
printf("---------Stack 영역---------\n");
return 0;
}
<출력 결과>
<메모리 위치 이론>
(그림)
카운터 멈춤------------------------
<main.h의 소스>
#ifndef __MAIN_H__ //여긴 그냥 써도 됨.
#define __MAIN_H__ //나중에 이름이 중복될까봐.
void Init(void);
void Port_Init(void);
void INT_Init(void);
#define PINA (*((volatile unsigned char *)0x20))
#define DDRA (*((volatile unsigned char *)0x21))
#define PORTA (*((volatile unsigned char *)0x22))
#define EICRA (*((volatile unsigned char *)0x69))
#define EICRB (*((volatile unsigned char *)0x6A))
#define EIMSK (*((volatile unsigned char *)0x3D))
#define SREG (*((volatile unsigned char *)0x5F))
#define INT7 7
#define INT6 6
#define INT5 5
#define INT4 4
#define INT3 3
#define INT2 2
#define INT1 1
#define INT0 0
#define ISC7 6
#define ISC6 4
#define ISC5 2
#define ISC4 0
#define ISC3 6
#define ISC2 4
#define ISC1 2
#define ISC0 0
#define sei() __asm__ __volatile__ ("sei" ::) //7번비트만 1로 만들어줌.어셈블리코드
#define sleep() __asm__ __volatile__ ( "sleep" "\n\t" :: )
void __vector_1(void) __attribute__((signal, used, externally_visible)); //인터럽트 신호를 받는다,사용된다,외부에서 이걸 볼 수 있어야한다.(호출가능하다) INT0를 뜻함.
void __vector_2(void) __attribute__((signal, used, externally_visible)); //인터럽트 신호를 받는다,사용된다,외부에서 이걸 볼 수 있어야한다.(호출가능하다) INT1를 뜻함.
#endif //__MAIN_H__
<main.c의 소스>
#include "main.h"
volatile unsigned int uiState;
int main(void)
{
volatile unsigned int uiCnt; //타이머. 변수선언 다음은 DDRA를 출력으로 바꿔줘야함
volatile unsigned int uiloop;
uiCnt = 0;
Init();
uiState = 1;
while(1)
{
PORTA = ((uiCnt/10)<<4)|(uiCnt%10); //세그먼트에 3 0을 출력, 3이라는 수를 왼쪽으로 4칸 밀어라.|34를 10으로 나눈 나머지(4)를 첫자리부터 출력.
for(uiloop = 0; uiloop < 45000; ++uiloop); //세미콜론을 닫으므로써 지역문이 된다.
for(uiloop = 0; uiloop < 50000; ++uiloop);
if(1==uiState)
{
++uiCnt;
}
if(uiCnt > 99) //세그먼트에서 앞자리가 9를 넘어가면 지워지는 이유는 uiCnt가 100을 넘어갔을 때이다. 그래서 if문으로 재정의.
{
uiCnt = 0;
}
}
return 0;
}
void Init(void)
{
INT_Init();
Port_Init();
}
void Port_Init(void)
{
DDRA = 0xff;
PORTA = 0x00; //모든 포트 출력을 0으로 바꾼다. 그러므로 판때기에는 00이 출력
}
void INT_Init(void)
{
EICRA=(3<<ISC0)|(3<<ISC1); //ISC0==INT0, 상승엣지이므로 3을 쓴다.
EIMSK=(1<<INT0)|(1<<INT1); //==EIMSK=1;<- 이건 or 쓰기 전에만. INT0만 열고 나머지문은 다 닫는다.만약 다른것도 열고 싶으면 (1<<INT0) | (1<<INT3);이렇게 쓴다.
SREG=SREG|(1<<7); //어셈블리보다 코드보다 느리다.SREG=SREG | (1<<7)==sei(); 이건 전체 인터럽트 켜는 것.
}
void __vector_1(void)
{
volatile unsigned int uiCnt;
for(uiCnt = 0; 30000>uiCnt ; ++uiCnt);
uiState = 1;
}
void __vector_2(void)
{
volatile unsigned int uiCnt;
for(uiCnt = 0; 30000>uiCnt ; ++uiCnt);
uiState = 0;
}
아쉽게도 ATmega가가 작동하는걸 동영상으로 찍는다는걸 깜빡했습니다...ㅠㅠ
다음에 시간 날 때 따로 찍도록 하겠습니다.
앞으로 메모장을 졸업하고 Source Insight로 찾아 뵙겠습니다.
'코스웨어 > 16년 스마트컨트롤러' 카테고리의 다른 글
20160315-이보원 AVR2560 LCD 실험 준비 (2) | 2016.03.16 |
---|---|
20160314_박진한_업무일지_펌웨어 분석 (1) | 2016.03.16 |
20160310_노유찬_CPU모듈 (0) | 2016.03.16 |
20160315_업무일지_정우민_인터럽트(FND실습) (0) | 2016.03.16 |
20160315_최기영_업무일지_펌웨어분석3 (1) | 2016.03.16 |
20160315_김가연_업무일지_전역변수 (2) | 2016.03.16 |
2016-03_15_인터럽트_노태경_업무일지 (0) | 2016.03.16 |
2016_3_15_전역변수_노태경_업무일지 (0) | 2016.03.16 |