728x90
반응형
UltraSonic(초음파 센서)
오늘도 초음파 센서와 오전을 보냈다. 일단 초음파 센서의 작동 법은 이랬다.
1) 빨간 스피커? 에서 초음파를 발사하는 즉시 타이머를 누른다.
2) 초음파가 벽에 맞고 파란 스피커? 로 돌아오면 타이머를 스톱 한다.
3) 스톱한 타이머를 읽어 거리를 계산한다.
작동법은 크게 3가지로 요약이 되는것 같다. 어째 보면 참 간단하다. 요 세가지 절차만 코드로 옮기면 우리도 박쥐 처럼 거리를 측정할수 있다. 하지만 우리에겐 아직 멀고도 먼 암사마 님은 결코 박쥐의 능력을 쉽사리 내어주지 않는다.ㅠ;
자! 데이터 시트속의 명화 한점을 살펴보자.
음. 각선미 라곤 눈씻고 찾아봐도 없다. 이런걸 즐겨 봐야 한다니 참 서글픈 현실이다. 자 정신 차리고 잘보면 엣지가 돋보이는 위 명화를 분석해 보자.
일단 위 그림은 SRF05 초음파 센서의 동작 타이밍에 관해서 그려놓은 그림이다. 자! 우리는 이 그림을 보고 찾아야 할것이 있다. 그것이 무엇이냐.. 바로 위에서 설명한 세가지의 동작 절차다. 이 그림만 보고 어떻게 찾으란 말인가 하겠지만 우리는 무슨 수를 써서라도 찾아야 한다.
오늘 오후 자율학습? 시간에 CM 선생님 께서 들어오셨다. 그리고 위 그림에 대한 명쾌한 해답을 내놓으시고 홀연히 사라 지셨다. 우린 이제 저 그림을 분석해 볼수 있게 되었다. 저 그림에서 그 세가지 절차를 찾아 낼수 있게 되었다.!
자.. 다시한번 찾아보자.
예상치 못했다. 0번 절차가 있을 줄이야.ㅜ 잘 봐달라고 이름도 멋들어지게 크게 적어 놓았다. 발사요청! 이제 발사요청을 포함한 네가지 절차를 그림에서 찾아 버렸다. 자 우리는 말로만 쉬운 이 그림을 힌트 삼아 코딩을 하면된다.
자 그럼 코딩을 해보자. 먼저 0번 부터 시작한다. 일단 코드 부터 본다.
이 함수가 바로 발사요청 함수다. 코드는 단 3줄! 분석해 보자. 일단 PIOA 의 트리거(7번핀)핀을 셋(1) 해주고 있다. 그리고는 10us 시간 지연! 그리고는 트리거(7번핀)핀을 클리어(0) 를 해주고 있다. 이것이 0번 절차의 전부다. 음음.. 여기 까진 쉽다.
다음은 1번 절차! 역시 코드부터 보자.
읔! 길다. 길어도 봐야한다. 찬찬히 뜯어 보자. 대충 보면 뭔가 눈에 띄는 주석이 3개가 있다. 뭔가 중요한 주석일 것이다. 먼저 첫번째 주석은 고정코드??? 다. 코드 내용은 그저 PIOA_ISR 을 읽어 주고만 있다. 참 황당한 코드다. 그럼 이 코드의 본래 의미가 무엇인지 살펴보자.
이 코드는 해석해보면 병렬 PIOA 포트의 인트럽터 상태 레지스터다. 아마 무엇인가의 상태를 저장하는 레지스터인데 인트럽터의 상태를 저장하는것 같고 또한 병렬I/O(32개)에 관련된 인트럽터 상태를 저장하는 것인가 싶다. 음.. 그래도 잘 모르겠다. 그래서 책을 찾아 보았다. 책 116 페이지 (7)번 두번째 줄 끝에서 부터 읽어보면 다음과 같이 적혀 있다.
" 이러한 입력 신호의 상태 변화는 PIO_ISR 레지스터에 저장되어 인터럽트를 요청하며, 소프트웨어로 이 레지스터를 읽으면 모든 비트가 클리어된다."
라고 되어 있는데... 음... 읽어봐도 잘 이해가 되지 않는다. 그래도 우린 이해 해야만 한다.ㅠ 다시 힘을 모아 위의 파란 글씨를 또박또박 읽어보자. 이러한 입력 신호의 상태 변화? 가 무엇인지 부터 생각해 보면 보통 외부 인트럽터는 입력 으로 PIOA 포트를 통해 들어 오게 된다. 그렇다면 PIOA 로 들어 올수 있는 값은 두가지 인데 그 하나는 0 이요 나머지 하나는 1이다. 즉 0V/3.3V 중에 하나가 들어 온다. 그렇다면 신호의 상태가 변했다는 말은 0 에서 1, 또는 1에서 0 으로 변했다는 소리다. 뭔가 PIOA 포트에 외부로 부터 어떠한 이벤트가 전달 되었다는 말이 아닌가!? 왠지 이벤트 하니까 인트럽터 냄새가 난다. 나만 그런것인가...; 자..좀더 읽어 보자.
읏! 역시 인터럽트 요청이다. 입력 변화가 발생하면 PIO_ISR 레지스터에 저장되어 인트럽터를 요청 한다고 되어 있다.!! 입력 변화란 앞에서 생각했던 0 에서 1, 1에서 0으로의 변화다. 음음. 역시 입력에 변화가 생겨나면 여기에 저장이 되며 이것은 즉 인트럽터를 요청할수 있는 상태를 말하는것 같다.
마지막 힘을내서 ,(콤마) 다음을 읽어보면 이 레지스터를 읽으면 모든비트가 클리어 된다고 한다. 앗! 그러고 보니 위 코드 맨 앞에서 이 레지스터를 읽어 버렸다. 그렇다면 확실한것은 이 레지스터의 값은 모두 0, 즉 0x00000000 라는 것이다. 다 분석 된듯하다.
이제 내용을 조합하여 결론을 내려보자. 먼저 저위의 함수가 실행이 되었다는 말은 외부로 부터 인트럽터가 발생했다는 말이다. 늦은 감이 팍팍 들지만은 UltraIRQ 함수는 외부로 부터 인트럽터가 발생했을때 실행되는 함수다. 어쨌든 그렇다! 외부로 부터 인트럽터가 발생했다는 말은 입력의 변화가 있었다는 말이다. 그래서 아마도 PIOA_ISR 에는 32개의 핀중 외부에서 인트럽터를 받은 핀의 번호를 표기해 두었을 것이다. 표기까지 해 두었으니 정말 소중한 자료일지 모른다. 그러나 우리의 코드는 소중하지 않은가 보다. 그냥 읽어서 0으로 만들어 버렸다. 읽은 값을 변수에 저장하지도 않는다. 그렇다! 이 값은 쓸모가 없다. 왜냐면! 우린 8번핀에서만 인트럽터가 걸리기 때문이다. 예전 인트럽터 수업을 할때 잠깐 저 코드를 활용했던 적이 있었다. 그 코드는 if 문 으로 다음과 같았다.
주석에 참 잘 적어 놓았다. 몇번 핀에서 인트럽터가 들어왔는지 체크 할수 있다고 한다. 이 레지스터의 쓰임은 원래 외부로부터 몇번 핀을 통해 인트럽터가 들어왔는지 확인할수 있는 레지스터다. 그리고 우리의 코드에서는 들어오는 인트럽터가 오직 8번 핀 뿐임으로 몇번핀에서 인트럽터가 들어왔는지 확인할 필요가 없었던 것이다.!
그렇다면 굳이 확인할 필요도 없는데 안적으면 안될까 싶다. 실험 정신을 살려 살짝 테스트 해 주었다. 그 결과는?? 안된다.ㅜ 왜 안되냐고 물어보면 할 말이 없다. 잘 모르겠다. 그저 짐작 가는건 외부 인트럽터가 걸렸을때 저걸 안 읽으면 두번다시 인트럽터가 안걸린다는 것이다.ㅠ 왜그런지 잘모르겠다. 악! 너무 길어졌다. 겨우 한줄 코드 때문에 이런 사태가 벌어질 줄이야! 빨리 다음 코드로 넘어가자.
자 다시! 1번 절차를 수행하는 코드를 보자. 먼저 위의 저 함수는 1번 2번 3번을 다 수행한다. 오호! 그말은 저것만 해석하면 우리는 박쥐의 능력을 얻을수 있는 것이다! 위 코드에서 1번에 해당하는 부분만 때왔다.
음.. 주석을 보니 상승 엣지 처리 루틴이라 되어 있다. 저~ 위에있는 엣지 넘치는 명화의 1번 부분을 잘 보면 0 에서 1 로 뿅! 하고 뛰고 있다. 이것이 무엇이냐! 바로 상승 엣지다. 그렇다! 바로 저 부분에서 이 루틴이 실행 되는 것이다. 그렇다면 이 루틴에서는 분명 타이머를 스타트 시키고 있을 것이다. 정말 그런지 보면... 역시나 그렇다. 주석에도 되어 있다. 타이머 스타트! 라고. 타이머 스타트를 위해 ICNT 값을 0 으로 초기화 시켜주고 있다. 그리고 타이머 카운터 0 번에 클럭을 공급해 주고 있다. 이렇게 되면 똑딱똑딱 타이머가 작동할 것이다.
그리고 절차 외의 코드가 몇개 더 보인다. 주석으로 트리거 변경 된 코드 부분과 플래그, 그리고 AIC_EOICR = 0 부분이다. 먼저 트리거 변경 부터 보면 일단 이 코드를 왜 적어야 하는지 알아야 한다. 우리는 1번을 완료 했고 다음은 2번 절차를 수행해야 된다. 그렇다면 2번 철차는 어떤 상황에서 발생해 어디서 처리되는지 알아야 한다. 자..먼저 어떤 상황이다. 다시 저~위에있는 명화를 보자. 그리고 2번을 보자. 1 에서 0으로 바뀌고 있다. 그렇다. 이것은 폴링 엣지! 바로 이 상황에서 발생한다. 이제 어디서 처리되는지 보자. 역시 이 함수 안이다. 그렇다면 2번의 처리를 위해 우리는 2번 상황에 반응할수 있도록 수정해 주어야 한다. 그 수정 사항이 바로 트리거 변경 부분과 플래그 부분이다. 이 함수는 플래그 덕분에 상승 엣지 부분과 하강 엣지 부분이 번갈아 수행된다. 그렇다.번갈아 수행되어야 1번과 2번이 처리된다. 마지막 AIC_EOICR = 0 부분. 주석에도 되어 있다. 자세히는 모르지만 주석의 의미 정도만 이해하고 있으면 될듯하다.
자. 서둘러 2번 절차로 넘어가자. 여기서는 한큐에 3번 절차까지 수행할수 있다. 2번 3번도 코드를 때서 보자.
2번 절차는 1번 절차에서 말했듯이 하강 엣지에서 걸린다. 위 코드가 수행해야 할 일은 타이머 값을 읽고 거리 계산해서 눈에 보이도록 출력해 주는 일이다. 그 일을 하는 부분이 어디에 있는지 살펴 보자. 뭐 주석으로 다되어 있다. 타이머 카운터 값 읽기!! 거리 출력!! 주석 아래의 코드들이 바로 그 일들을 해주시는 분들이다. 그외 코드들은 역시나 주석으로 되어 있고 잠깐 보면 타이머 카운터를 그만 카운팅 하라고 클럭을 끊어 주고 트리거를 다시 상승 엣지로 돌려주고 있다. 그리고 플래그도 변경해 주고, 마지막으로 인트럽터 처리 완료를 표시해 주고 있다.
자! 이로서 모든 철차가 끝이 났다. 우리의 계산 대로라면 우리는 박쥐의 능력을 갖게 되었을 것이다. 음.. 아쉬운 마음에 엣지 넘치는 명화로 상황을 정리하고 끝을내자.
그림이 좀 바뀌었다. 뭔가 화살표가 생겼으며 2번이 네개나 더 그려져 있다. 이건 거리 측정에 관련된 부분이다. 이 그림은 2번이 발생하는 시기는 언제나 변할수 있다는 것을 보여 준다. 1번에서 2번 사이의 시간을 카운팅 하여 거리는 재는데 이 2번의 발생 시기가 짧을수록 거리가 짧다. 반대로 2번의 발생시기가 크면 거리가 멀다는 것이다. 너~무 멀어져 버리면 측정을 할수 없다고 나와 있다. 만약 2번을 완벽하게 완성하려면 최대로 잴수 있는 상황에서만 3번을 수행하게 해야될 것이다.
------------------------------흑 초기화 코드가 없다. 어떻게 보면 제일 중요한데; 일단 급하게 붙여 넣어 본다.
뭐 이렇다. 위 코드는 특별히 주의 해야할 부분이 있다. 코드를 빨간색으로 표시해 두었으며 잠깐 본다면은 3 << SRCTYPE 는 최초 외부 인트럽터에 대해서 상승 엣지에 반응하게 해주는 코드다. 그리고 주석으로 처리된 AIC_ISCR = 1 << PIOA 는 빼야 하는 부분이다. 왜 빼야 하는지 까지는 알아보지 못했다. 단지 테스트 해본 결과 위 코드주석을 풀면 오작동! 주석을 하면 정상 작동 하였다.
위 코드는 UltraInit 함수 안에 있는 TimerInit0 함수의 내용이다. 역시 주의해야 할 부분은 빨간 색으로 칠해 놓았다. 빨간색 코드는 주석으로 되어 있으며 왜 주석 처리 했냐고 물어 본다면은, 위에서 1번 절차에 해당하는 쏘자 마자 카운터 해야 된다는 점에서 쏘지 않았을때는 카운팅을 하지 않게 하기 위해서다. 그러나 위 코드의 주석을 푼다고 해서 안되는것은 아니다. 그저 조금더 정확하게 측정하기 위해서다.
WINAPI
음 .. 그렇다. 오늘은 한게 없다.! 숙제 였지만 혹시나 참고가 되실까 해서 정말로 소스코드만 올린다.
main.cpp
MsgProc.cpp
MsgProc.h
오늘도 초음파 센서와 오전을 보냈다. 일단 초음파 센서의 작동 법은 이랬다.
1) 빨간 스피커? 에서 초음파를 발사하는 즉시 타이머를 누른다.
2) 초음파가 벽에 맞고 파란 스피커? 로 돌아오면 타이머를 스톱 한다.
3) 스톱한 타이머를 읽어 거리를 계산한다.
작동법은 크게 3가지로 요약이 되는것 같다. 어째 보면 참 간단하다. 요 세가지 절차만 코드로 옮기면 우리도 박쥐 처럼 거리를 측정할수 있다. 하지만 우리에겐 아직 멀고도 먼 암사마 님은 결코 박쥐의 능력을 쉽사리 내어주지 않는다.ㅠ;
자! 데이터 시트속의 명화 한점을 살펴보자.
음. 각선미 라곤 눈씻고 찾아봐도 없다. 이런걸 즐겨 봐야 한다니 참 서글픈 현실이다. 자 정신 차리고 잘보면 엣지가 돋보이는 위 명화를 분석해 보자.
일단 위 그림은 SRF05 초음파 센서의 동작 타이밍에 관해서 그려놓은 그림이다. 자! 우리는 이 그림을 보고 찾아야 할것이 있다. 그것이 무엇이냐.. 바로 위에서 설명한 세가지의 동작 절차다. 이 그림만 보고 어떻게 찾으란 말인가 하겠지만 우리는 무슨 수를 써서라도 찾아야 한다.
오늘 오후 자율학습? 시간에 CM 선생님 께서 들어오셨다. 그리고 위 그림에 대한 명쾌한 해답을 내놓으시고 홀연히 사라 지셨다. 우린 이제 저 그림을 분석해 볼수 있게 되었다. 저 그림에서 그 세가지 절차를 찾아 낼수 있게 되었다.!
자.. 다시한번 찾아보자.
예상치 못했다. 0번 절차가 있을 줄이야.ㅜ 잘 봐달라고 이름도 멋들어지게 크게 적어 놓았다. 발사요청! 이제 발사요청을 포함한 네가지 절차를 그림에서 찾아 버렸다. 자 우리는 말로만 쉬운 이 그림을 힌트 삼아 코딩을 하면된다.
자 그럼 코딩을 해보자. 먼저 0번 부터 시작한다. 일단 코드 부터 본다.
void UltraTRG(void) |
이 함수가 바로 발사요청 함수다. 코드는 단 3줄! 분석해 보자. 일단 PIOA 의 트리거(7번핀)핀을 셋(1) 해주고 있다. 그리고는 10us 시간 지연! 그리고는 트리거(7번핀)핀을 클리어(0) 를 해주고 있다. 이것이 0번 절차의 전부다. 음음.. 여기 까진 쉽다.
다음은 1번 절차! 역시 코드부터 보자.
void UltraIRQ(void) |
읔! 길다. 길어도 봐야한다. 찬찬히 뜯어 보자. 대충 보면 뭔가 눈에 띄는 주석이 3개가 있다. 뭔가 중요한 주석일 것이다. 먼저 첫번째 주석은 고정코드??? 다. 코드 내용은 그저 PIOA_ISR 을 읽어 주고만 있다. 참 황당한 코드다. 그럼 이 코드의 본래 의미가 무엇인지 살펴보자.
이 코드는 해석해보면 병렬 PIOA 포트의 인트럽터 상태 레지스터다. 아마 무엇인가의 상태를 저장하는 레지스터인데 인트럽터의 상태를 저장하는것 같고 또한 병렬I/O(32개)에 관련된 인트럽터 상태를 저장하는 것인가 싶다. 음.. 그래도 잘 모르겠다. 그래서 책을 찾아 보았다. 책 116 페이지 (7)번 두번째 줄 끝에서 부터 읽어보면 다음과 같이 적혀 있다.
" 이러한 입력 신호의 상태 변화는 PIO_ISR 레지스터에 저장되어 인터럽트를 요청하며, 소프트웨어로 이 레지스터를 읽으면 모든 비트가 클리어된다."
라고 되어 있는데... 음... 읽어봐도 잘 이해가 되지 않는다. 그래도 우린 이해 해야만 한다.ㅠ 다시 힘을 모아 위의 파란 글씨를 또박또박 읽어보자. 이러한 입력 신호의 상태 변화? 가 무엇인지 부터 생각해 보면 보통 외부 인트럽터는 입력 으로 PIOA 포트를 통해 들어 오게 된다. 그렇다면 PIOA 로 들어 올수 있는 값은 두가지 인데 그 하나는 0 이요 나머지 하나는 1이다. 즉 0V/3.3V 중에 하나가 들어 온다. 그렇다면 신호의 상태가 변했다는 말은 0 에서 1, 또는 1에서 0 으로 변했다는 소리다. 뭔가 PIOA 포트에 외부로 부터 어떠한 이벤트가 전달 되었다는 말이 아닌가!? 왠지 이벤트 하니까 인트럽터 냄새가 난다. 나만 그런것인가...; 자..좀더 읽어 보자.
읏! 역시 인터럽트 요청이다. 입력 변화가 발생하면 PIO_ISR 레지스터에 저장되어 인트럽터를 요청 한다고 되어 있다.!! 입력 변화란 앞에서 생각했던 0 에서 1, 1에서 0으로의 변화다. 음음. 역시 입력에 변화가 생겨나면 여기에 저장이 되며 이것은 즉 인트럽터를 요청할수 있는 상태를 말하는것 같다.
마지막 힘을내서 ,(콤마) 다음을 읽어보면 이 레지스터를 읽으면 모든비트가 클리어 된다고 한다. 앗! 그러고 보니 위 코드 맨 앞에서 이 레지스터를 읽어 버렸다. 그렇다면 확실한것은 이 레지스터의 값은 모두 0, 즉 0x00000000 라는 것이다. 다 분석 된듯하다.
이제 내용을 조합하여 결론을 내려보자. 먼저 저위의 함수가 실행이 되었다는 말은 외부로 부터 인트럽터가 발생했다는 말이다. 늦은 감이 팍팍 들지만은 UltraIRQ 함수는 외부로 부터 인트럽터가 발생했을때 실행되는 함수다. 어쨌든 그렇다! 외부로 부터 인트럽터가 발생했다는 말은 입력의 변화가 있었다는 말이다. 그래서 아마도 PIOA_ISR 에는 32개의 핀중 외부에서 인트럽터를 받은 핀의 번호를 표기해 두었을 것이다. 표기까지 해 두었으니 정말 소중한 자료일지 모른다. 그러나 우리의 코드는 소중하지 않은가 보다. 그냥 읽어서 0으로 만들어 버렸다. 읽은 값을 변수에 저장하지도 않는다. 그렇다! 이 값은 쓸모가 없다. 왜냐면! 우린 8번핀에서만 인트럽터가 걸리기 때문이다. 예전 인트럽터 수업을 할때 잠깐 저 코드를 활용했던 적이 있었다. 그 코드는 if 문 으로 다음과 같았다.
static volatile unsigned int uiIsr; uiIsr = PIOA_ISR; // 먼저 몇번 핀에서 인트럽터가 들어왔는지 체크(현재는 7번) |
주석에 참 잘 적어 놓았다. 몇번 핀에서 인트럽터가 들어왔는지 체크 할수 있다고 한다. 이 레지스터의 쓰임은 원래 외부로부터 몇번 핀을 통해 인트럽터가 들어왔는지 확인할수 있는 레지스터다. 그리고 우리의 코드에서는 들어오는 인트럽터가 오직 8번 핀 뿐임으로 몇번핀에서 인트럽터가 들어왔는지 확인할 필요가 없었던 것이다.!
그렇다면 굳이 확인할 필요도 없는데 안적으면 안될까 싶다. 실험 정신을 살려 살짝 테스트 해 주었다. 그 결과는?? 안된다.ㅜ 왜 안되냐고 물어보면 할 말이 없다. 잘 모르겠다. 그저 짐작 가는건 외부 인트럽터가 걸렸을때 저걸 안 읽으면 두번다시 인트럽터가 안걸린다는 것이다.ㅠ 왜그런지 잘모르겠다. 악! 너무 길어졌다. 겨우 한줄 코드 때문에 이런 사태가 벌어질 줄이야! 빨리 다음 코드로 넘어가자.
자 다시! 1번 절차를 수행하는 코드를 보자. 먼저 위의 저 함수는 1번 2번 3번을 다 수행한다. 오호! 그말은 저것만 해석하면 우리는 박쥐의 능력을 얻을수 있는 것이다! 위 코드에서 1번에 해당하는 부분만 때왔다.
/*--------------------------------------------------------------------*/ // 상승 엣지 처리 루틴 (초음파 발사로 인한 인트럽터 처리) |
음.. 주석을 보니 상승 엣지 처리 루틴이라 되어 있다. 저~ 위에있는 엣지 넘치는 명화의 1번 부분을 잘 보면 0 에서 1 로 뿅! 하고 뛰고 있다. 이것이 무엇이냐! 바로 상승 엣지다. 그렇다! 바로 저 부분에서 이 루틴이 실행 되는 것이다. 그렇다면 이 루틴에서는 분명 타이머를 스타트 시키고 있을 것이다. 정말 그런지 보면... 역시나 그렇다. 주석에도 되어 있다. 타이머 스타트! 라고. 타이머 스타트를 위해 ICNT 값을 0 으로 초기화 시켜주고 있다. 그리고 타이머 카운터 0 번에 클럭을 공급해 주고 있다. 이렇게 되면 똑딱똑딱 타이머가 작동할 것이다.
그리고 절차 외의 코드가 몇개 더 보인다. 주석으로 트리거 변경 된 코드 부분과 플래그, 그리고 AIC_EOICR = 0 부분이다. 먼저 트리거 변경 부터 보면 일단 이 코드를 왜 적어야 하는지 알아야 한다. 우리는 1번을 완료 했고 다음은 2번 절차를 수행해야 된다. 그렇다면 2번 철차는 어떤 상황에서 발생해 어디서 처리되는지 알아야 한다. 자..먼저 어떤 상황이다. 다시 저~위에있는 명화를 보자. 그리고 2번을 보자. 1 에서 0으로 바뀌고 있다. 그렇다. 이것은 폴링 엣지! 바로 이 상황에서 발생한다. 이제 어디서 처리되는지 보자. 역시 이 함수 안이다. 그렇다면 2번의 처리를 위해 우리는 2번 상황에 반응할수 있도록 수정해 주어야 한다. 그 수정 사항이 바로 트리거 변경 부분과 플래그 부분이다. 이 함수는 플래그 덕분에 상승 엣지 부분과 하강 엣지 부분이 번갈아 수행된다. 그렇다.번갈아 수행되어야 1번과 2번이 처리된다. 마지막 AIC_EOICR = 0 부분. 주석에도 되어 있다. 자세히는 모르지만 주석의 의미 정도만 이해하고 있으면 될듯하다.
자. 서둘러 2번 절차로 넘어가자. 여기서는 한큐에 3번 절차까지 수행할수 있다. 2번 3번도 코드를 때서 보자.
/*--------------------------------------------------------------------*/ // 하강 엣지 처리 루틴 (초음파 돌아옴 으로 인한 인트럽터 처리) |
2번 절차는 1번 절차에서 말했듯이 하강 엣지에서 걸린다. 위 코드가 수행해야 할 일은 타이머 값을 읽고 거리 계산해서 눈에 보이도록 출력해 주는 일이다. 그 일을 하는 부분이 어디에 있는지 살펴 보자. 뭐 주석으로 다되어 있다. 타이머 카운터 값 읽기!! 거리 출력!! 주석 아래의 코드들이 바로 그 일들을 해주시는 분들이다. 그외 코드들은 역시나 주석으로 되어 있고 잠깐 보면 타이머 카운터를 그만 카운팅 하라고 클럭을 끊어 주고 트리거를 다시 상승 엣지로 돌려주고 있다. 그리고 플래그도 변경해 주고, 마지막으로 인트럽터 처리 완료를 표시해 주고 있다.
자! 이로서 모든 철차가 끝이 났다. 우리의 계산 대로라면 우리는 박쥐의 능력을 갖게 되었을 것이다. 음.. 아쉬운 마음에 엣지 넘치는 명화로 상황을 정리하고 끝을내자.
그림이 좀 바뀌었다. 뭔가 화살표가 생겼으며 2번이 네개나 더 그려져 있다. 이건 거리 측정에 관련된 부분이다. 이 그림은 2번이 발생하는 시기는 언제나 변할수 있다는 것을 보여 준다. 1번에서 2번 사이의 시간을 카운팅 하여 거리는 재는데 이 2번의 발생 시기가 짧을수록 거리가 짧다. 반대로 2번의 발생시기가 크면 거리가 멀다는 것이다. 너~무 멀어져 버리면 측정을 할수 없다고 나와 있다. 만약 2번을 완벽하게 완성하려면 최대로 잴수 있는 상황에서만 3번을 수행하게 해야될 것이다.
------------------------------흑 초기화 코드가 없다. 어떻게 보면 제일 중요한데; 일단 급하게 붙여 넣어 본다.
void UltraInit(void) |
뭐 이렇다. 위 코드는 특별히 주의 해야할 부분이 있다. 코드를 빨간색으로 표시해 두었으며 잠깐 본다면은 3 << SRCTYPE 는 최초 외부 인트럽터에 대해서 상승 엣지에 반응하게 해주는 코드다. 그리고 주석으로 처리된 AIC_ISCR = 1 << PIOA 는 빼야 하는 부분이다. 왜 빼야 하는지 까지는 알아보지 못했다. 단지 테스트 해본 결과 위 코드주석을 풀면 오작동! 주석을 하면 정상 작동 하였다.
void TimerInit0(unsigned int uiRate, unsigned int uiRc, void(*Handler)(void)) |
위 코드는 UltraInit 함수 안에 있는 TimerInit0 함수의 내용이다. 역시 주의해야 할 부분은 빨간 색으로 칠해 놓았다. 빨간색 코드는 주석으로 되어 있으며 왜 주석 처리 했냐고 물어 본다면은, 위에서 1번 절차에 해당하는 쏘자 마자 카운터 해야 된다는 점에서 쏘지 않았을때는 카운팅을 하지 않게 하기 위해서다. 그러나 위 코드의 주석을 푼다고 해서 안되는것은 아니다. 그저 조금더 정확하게 측정하기 위해서다.
WINAPI
음 .. 그렇다. 오늘은 한게 없다.! 숙제 였지만 혹시나 참고가 되실까 해서 정말로 소스코드만 올린다.
main.cpp
#include <windows.h> |
MsgProc.cpp
#include "MsgProc.h" |
MsgProc.h
#ifndef __MSGPROC_H__ |
728x90
'코스웨어 > 11년 내장형하드웨어' 카테고리의 다른 글
[내장형]박춘우_2011년 9월 20일 화요일 Daily Report (26) | 2011.09.21 |
---|---|
[내장형]한원우_9월19일 보고서 (36) | 2011.09.20 |
[내장형]이동현_0916일일보고서 (23) | 2011.09.17 |
9월 15일 일일보고서-[내장형]김정우 (19) | 2011.09.15 |
[내장형]정선주 2011년 9월 9일 (10) | 2011.09.10 |
[내장형]심재원_2011년09월08일 (10) | 2011.09.08 |
[내장형]이수란_2011년9월7일 (9) | 2011.09.07 |
[내장형]김동화_2011년_9월6일_일일보고서 (17) | 2011.09.06 |