블로그 이미지
송시혁

calendar

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

Notice

Tag

Recent Post

Recent Comment

Recent Trackback

Archive

2013. 5. 21. 10:03 임베디드/Arm2567SAM





1. 하강엣지 설정부분(디텍터)


AIC_ICCR = 1<<PIOA;// 안전을 위해 장치를 끄고,

PIO_IFER=1<<INT_PIN;//해당 핀을 글리치(glitch)한 다음,

AIC_ISCR= 1<<PIOA; //다시 장치를 활성화 시킨다.


위에 선언된 레지스터는 전부 인터럽트 관련된 레지스터





그리고 다음과 같이 PIO와 AIC_IECR를 활성화 한다.


PIO_IER = 1<<INT_PIN;

AIC_IECR= 1<<PIOA;



Aic_Handler()함수 만들기


지역변수는 함수가 종료되면, 사라져버린다.

함수를 빠르게 호출해야 하므로 전역변수를 사용함으로서 함수가

호출될때 마다 static변수는 고정되어 있기 때문에 빠르게 실행할

수 있다. 지역변수는 함수가 호출되면 종료되고 다시 함수가 호출

되어 생성되고 , 즉 생성과 삭제가 반복이 되기 때문에 속도가 느리다

따라서 static 변수를 사용하였다.

그러나, static은 프로그램종료가 되지 않으면, 계속 존재하므로

함부로 쓰지는 않는다. 




volatile static unsigned int uipinstatus;



15번비트자리를 제외하고 모두 0으로 만들기 위해 &연산자를

사용한다. 0이 아닐때, Led_toggle()을 호출하여 스위치를 눌렀을때,

LED를 깜박이게 한다.

if(0!=(uipinstatus&(1<<INT_PIN)))

{

Led_toggle();

}


for(iCnt=0;iCnt<1000000;++iCnt);// 지연시킨다.

스위치에 잡음(?)이 남아있어 원하는 동작이 자연스럽게 나오지

않아 조금 개선하고자, 지연시켜버린다.



uipinstatus= PIO_ISR;

인터럽트 상태 레지스터.


인터럽트는 중첩을 허용할 수도 있다. 지금, 중첩을 허용하지 않기 위해

방지하는 장치가 필요하다. 아래와 같이 선언하면, 허용을 하지 않는다.

AIC_EOICR=0;




'임베디드 > Arm2567SAM' 카테고리의 다른 글

5월 22일 소스 define방법  (0) 2013.05.22
5월 21일 ultra(수정중)  (0) 2013.05.21
5월 20일 AIC  (0) 2013.05.20
5월 16일 타이머 정리2(예정)  (0) 2013.05.16
5월 15일 타이머1.(정리예정)  (0) 2013.05.15
posted by 송시혁
2013. 5. 20. 15:51 임베디드/Arm2567SAM






1.먼저 장치 클럭에 전원을 공급한다.


PMC_PCER =1<<PIOA;


2. PIO안에 값이 AIC로 들어가는 것을 막기 위하여 OUT DISABLE REGISTER를 사용한다. 바로 PIO_ODR를 사용한다.

핀 15번을 사용하기 때문에 헤더파일에  INT_PIN 15로 정의 함.

밑에 활성화를 다시한다. 반드시 기억할 것은 먼저 비활성화하여 값을 깨끗이 

한 다음, 활성화 시킨다. 그래서 여기서 먼저 핀을 비활성화 시킨후 아래에

활성화를 시킨다.

PIO_ODR =1<<INT_PIN; //pin out disable비활성화 


3. 핀을 활성화 시키는 부분이다.INT_PIN이 15번이므로 스위치를 15번 자리에 장착하여 사용하는데 핀 15번을 사용하기 위해서는 이 15번 자리를 활성화 한다.

PIO_PER =1<<INT_PIN; //pin enable


4.인터럽트 값이 남아있을지 모르므로 이 부분을 비활성화시키는 레지스터인

PIO_IDR를 사용한다. 비활성화의 이유는 reset개념으로 생각한다.

PIO_IDR=1<<INT_PIN;//pin 15 interrupt disable


5.당연히 AIC 또한 인터럽트 비활성화를 시켜서 리셋한다.

AIC_IDCR =1<<PIOA;//aic interrupt disable


6.ARM칩에 풀업저항기능을 하는 회로가 존재한다. 그 기능을 활성화하기 위해서

풀업저항의 관련된 레지스터인 PIO_PUER을 사용한다.

PIO_PUER =1<<INT_PIN;// pull up register enable 회로안에  풀업저항 활성화



AIC_SVR[PIOA]= (unsigned int)Aic_Handler;

// 타이머 카운터 0 인터럽트 핸들러 등록(AIC_SVR[AT91C_ID_TC0],Timer_Handler)



AIC_SMR [PIOA]=(0<<PRIOR)|( 1<<SRCTYPE);

// 타이머 카운터 0 인터럽트 모드 설정(AIC_SMR[TC0],AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,AT91C_AIC_PRIOR_LOWEST)


아래표를 참고하면은 일단 풀업저항이므로 클럭을 생각했을때, high신호가 된다.

스위치를 누르면, low edge가 되면서, led가 반응하므로 negative edge를 사용한다.



AIC_ICCR = 1<<PIOA; // 장치번호 PIOA를 비활성화.


스위치 내부에는 버튼을 눌렀다 뗐다했을 때, 스프링 작용을 하는 것이 있다.

그 때, 눈에 보이지 않는 전류가 발생하는데, 그것을 잡음으로 본다. 그것을 제거

하기 위한 기능이 ARM칩내부에 존재하며, 그 기능을 사용하면, 일부 차단시켜준다.

그기능을 ARM에서는 glitch라고 한다. 그래서 관련된 레지스터를 사용한다.

PIO_IFER= 1<<INT_PIN;









아래는 헤더파일이다.








'임베디드 > Arm2567SAM' 카테고리의 다른 글

5월 21일 ultra(수정중)  (0) 2013.05.21
5월 21일 AIc 2.(수정중)  (0) 2013.05.21
5월 16일 타이머 정리2(예정)  (0) 2013.05.16
5월 15일 타이머1.(정리예정)  (0) 2013.05.15
5월 14일 타이머 정리  (0) 2013.05.15
posted by 송시혁
2013. 5. 16. 10:19 임베디드/Arm2567SAM

Timer.c

1.

2.

3.

4.

5.

6.



Timer.h




posted by 송시혁
2013. 5. 15. 20:40 임베디드/Arm2567SAM


이코드는 타이머 카운트를 비활성화 시켜서 초기화 시키는 부분이다.

(참고로 헤더파일에 정의(define)한다.)





1.TC0_SR; = Status Register 상태레지스터를 초기화한다. 그냥 읽기만 하면 되기

때문에 ';'만 붙이면 된다.

2. TC0_CMR = 채널 모드 레지스터

 이 레지스터에서 클럭이 발생했을 때, 비교방식을 사용하겠다고

 설정하는 부분이다.
















TC0_CMR =  (TIMER_CLOCK4<<TCCLKS)|(1<<CPCTRG);

CPCTRG = 같아질 때 까지 비교한다. =>이부분 보류





TC0_RC= 375;

위의 엑셀 파일 캡쳐를 잘보면 mck인 48Mhz를 분주비로 나눈다.

그러면 해당 주파수가 나온다. 1주기를 구하기 위해서 공식은

1/주파수 이다. 그래서 1/375000이며, 이것을 1000을 곱하여

m/s단위로 변환한다. 1m/s로 나오기 위하여 배수를 


AIC_IDCR = (1<<TC0);


AIC의 레지스터에 AIC_IDCR은 타이머 카운트를

비활성화 하는 레지스터이다.(데이터 시트 참고)

TC0를 사용하기 위해서 TC0를 비활성화 하여 초기화한다.


인터럽트 핸들러 등록

AIC_SVR[TC0]= (unsigned int)Timer_Handler;


AIC_SVR[TC0]는 















posted by 송시혁
2013. 5. 15. 11:18 임베디드/Arm2567SAM


Timer.c 소스

PMC_PCER = 전원공급

타이머 클럭을 비활성화 시키기 위해서 CLKDIS를 왼쪽으로 1밀어준다.

TC_CCR 의 clkdis = 1로 해야 비활성화 된다.



Timer.h 소스 정의 부분 







아래그림은 TC0-CR의 레지스터

핀은 0,1,2를 사용하며 각핀의 사용은 아래 빨간네모를 참조

해석은 알아서.....ㅋㅋㅋㅋ



헤더파일에서 TC0_IDR이 인터럽트를 비활성화하는 레지스터이다.

T타이머 인터럽트를 비활성화 하기 위해 TC0-ICR의 해당하는

레지스터를 찾아서 OR비트 연산시켜서 활성화 한것이다.

위의TIMER.C에 2번 참조

아래는 TIMER.C에 레지스터








TC0_CCR= TC에 0번 채널을 define한것. 참고로 TC장치번호는 0,1,2이다.



























TC0_SR= 읽기로 끝난다. 그래서' ;'하면 된다.

TC0_CMR

TC0_RC

AIC_IDCR

AIC_SVR[TC0]













posted by 송시혁
2013. 4. 29. 16:23 임베디드/Arm2567SAM




1.위의 타이밍도를 살펴보면 가장먼저 봐야할 부분은 ADC_CR이다.

먼저 ADC_CR에 해당하는 레지스터를 데이터 시트에서 찾고

START를 1로 왼쪽으로 밀어준다.

ADC_CR=1<<START;


2. 파란색 동그라미를 주목한다. EOCx와 DRDY가 CONVERSION TIME 시작

시에는 LOW상태로 있다가 EOCx와 DRDY가 동시에 HIGH가 된다.

그러나 ADC_CDRx(노란색 네모)가 읽기를 수행이 끝나면,  EOCx는

LOW가 되고 DRDY는 HIGH를 유지한다.

뒤에 ADC_lCDR은  EOCx와 DRDY가 똑같이 반응하였다.(연두색 원)

여기서 CDRx와 LCDR이 서로 다르다라는 것을 알 수 있다.

ADC_CDRx의 의해 EOCx가 변했으므로 EOCx는 ADC_CDRx의

전용채널인 것을 짐작할 수 있다.(보라색 동그라미 부분)




ADC_CHSR=

ADC_SR = 


ADC_SR =

ADC_CDRx


1. ADC_CR 

ADC_LCDR = 최근 컨버전 데이터 레지스터.









ADC_MR에서 PRESCAL과 LOWRES주목한다.


LOWRES = 10비트, 분해와 8비트 분해가 있다.

이왕 더욱 디테일하게 표현하기 위해서 10비트를 사용.

그래서 해당 소스에는 0으로 되어있을것이다.

#define LOWRES 0 -> ADC.C파일에 정의한다.



TRGEN 

= 오른쪽부터 3 2 1이라고 생각한다.

TRGEN은 자세한 설명은 패스한다.



PRESCAL의 구하는 공식이다.

ADCCLOCK이 몇번 깜빡이냐의 따라서 ??????






'임베디드 > Arm2567SAM' 카테고리의 다른 글

5월 15일 타이머1.(정리예정)  (0) 2013.05.15
5월 14일 타이머 정리  (0) 2013.05.15
4월 29일 ADC컨버전 함수만들기  (0) 2013.04.29
4월 26일 숫자를 lcd에 출력하기  (0) 2013.04.26
4월 26일 ADC  (0) 2013.04.26
posted by 송시혁
2013. 4. 29. 16:07 임베디드/Arm2567SAM













0과 1번 2비트만 사용.

- 는 사용하지 않는것. (무엇을 넣어도 동작X)

위 그림을 참조하여 아래와 같이 함수를 만들어야

한다.






위의 소스는 헤더파일

LIGHT에 PIOA와 겹치지 않는 번호인 4, 5, 6, 7 번중에서

ADC4번을 사용. 그래서 LIGHT 에 CH4라고 정의

#define LOWRES 4는  아래그림으을 보면 4번채널을

사용되므로 4라고 정의한다.












CH0 ~CH7까지 활성화 변환 채널.


posted by 송시혁
2013. 4. 26. 16:34 임베디드/Arm2567SAM



short형으로 선언한 이유는 ??????



arm칩은 C언어 처럼 %d처럼 10진수 숫자를 출력을 하는

것은 불가능하다. 그래서 2자리이상의 숫자를 나타내기위해서는

문자열 배열을 선언한 다음, 출력하고자 하는 아스키코드를

선언한다면 가능한다. 아래는 Lcd.c의 해당하는 소스이다.


ucString[0]에서 '0'이라는 아스키코드에 usNum/10000에 몫이 더해지면

결과에 해당하는 숫자의 아스키코드를 받아 Lcd로 전송될 것이다.

main()함수에서 인자에 65535를 넣어 각자리에 해당하는 6,5,5,3,5를 출력한다.

출력 방법은 위의 소스를 참조한다. 또한가지의 방법이 더 있다.


(usNum/1000)%10으로 나누어도 같은 숫자가 나온다.

예를 들어서 usNum이 65535라고 가정한다면, 65535/1000 = 65이다.

65를 10으로 나눈 나머지는 5이다.

이런식동일한 방법으로 위의 소스를 보고 적용한다면 결국 차례대로

6,5,5,3,5의 나머지가 올것이다. 단, 맨처음과 마지막은 적용되지 않는다.

위의 소스이든, 다른 방법이든 2가지는 예외.



 

posted by 송시혁
2013. 4. 26. 16:28 임베디드/Arm2567SAM

일단 메모리의 기준주소를 찾고나서

세부적인 주소를 찾는다.(아래그림)







위의 그림을 헤더파일의 전부 정의 한다.

#define ADC_CR = 0xFFFFF8000; 이런식으로 정의









makefile에도 붙여넣는다. 당연히 파일에 해당하는 이름을 

붙여야 한다.






이것은 장치번호이다.

장치번호에 1을 넣어야 동작한다. 해당비트를 뜻한다.









posted by 송시혁
2013. 4. 23. 14:42 임베디드/Arm2567SAM

확장자 S = 어셈블리

 : (라벨)은 글자형태의 주소

ldr = load rge, 레지스터를 load한다.


pc, reset_handler

pc = program counter = 실행하다

메모리에 code영역에서 주소를 받아와서 해석한다.

즉, 파일을 실행한다는 의미.

인텔 = ip

확장= 32비트 EIP

arm칩에서 reset은 0번지

reset_handler 호출= cpu를 깨우고 reg를 정렬한다.

   그제서야 main()호출

_low level_init

   ->low_level_init(위의 init과는 다름.)

-> void lowlevel_init(void)(lowlevel.c)


branch =b, ldr과 만찬가지로 점프하는 역할


vector talble = 점프하는 위치를 저장해 놓은 영역

사용자가 주소를 잘못 사용시 이곳으로가서 pc가 

vector table에가서 수행한다. 예)undefines =에러 메시지


ELF32(링커)

파일의 포맷, 파일의 저장형태

실행되기전 실행을 하기위해 준비하는 단계

ENTRY point = 진입점

(제일 처음 수행된다.)

code영역 = text




 

'임베디드 > Arm2567SAM' 카테고리의 다른 글

4월 26일 숫자를 lcd에 출력하기  (0) 2013.04.26
4월 26일 ADC  (0) 2013.04.26
4월 22일 makefile전체적인 흐름.  (0) 2013.04.22
4월 16일 임베디드 LCD정리  (0) 2013.04.16
4월 15일 임베디드 timing 분석방법  (0) 2013.04.15
posted by 송시혁
prev 1 2 3 next