AVR2012.02.11 14:28


 

E클럭의 시간이 꽤 길어서

LCD_E=1; delay_us(1); LCD_E=0;

이런 식으로 딜레이를 주는 소스를 본적이 많을 겁니다.

 

Busy 체크를 안하면 회로나 코드가 간단 해지므로

딜레이로 대신 하는 소스가 많습니다. 

 

LED 백라이트는 노란색 LED가 직렬로 두개 들어가 있으므로

순방향 전압이 4.2V입니다.

5V에 정류 다이오드를 1개 넣어서 공급 하기도 하고

10옴 정도의 저항을 넣기도 합니다.

 

 

 

10장. LCD 표시 장치의 제어

파일 형식: PDF/Adobe Acrobat - 빠른 보기
←2열 DDRAM 주소. ➢ DDRAM의 주소와 LCD 표시장치와의 관계 (20문자ⅹ2라인을 사용하는 경우 ..... LCD_STR(str);. // 문자열 str을 LCD 출력 while(1);. } 10.5 LCD 인터페이스와 구동 프로그램 .... “김치”라는 한글을 LCD에 표시하는 프로그램 작성 ...
121.143.152.79/down.../10장_LCD%20표시%20장치의%20제어.pdf
 
이 글에 예제 프로그램과 설명이 있습니다.
 
Posted by 콩알은
전자2012.02.09 18:24

Google에서 입사 문제로 냈다고 소문이 돌고 있는 문제이다.


문제를 푸는데 있어서 직접적으로 패리티 비트와 관련 되어 있다고는 할 수 없지만,

어느정도 맞아 들어가는 것 같아 정리 해본다.


문제는 다음과 같았다.



 키가 모두 다른 100명의 사나이가 있는데, 이들을 키 순서대로 세운 뒤(맨 앞에 제일 작은 사나이),

 다음과 같이 발표를 합니다.


 "이제 당신들에게 흰 모자와 검은 모자 도합 100개를 분배하여 한 사람 당 하나씩  무작위로 

  씌울 것이다. 그리고 뒤(제일 키가 큰 사람)에서부터 한 사람씩 자신이 쓴 모자의 색이 무엇인지 

  질문을 받게 될 것이다. 모자는 위에서 내려오기 때문에 당사자는 자신의 모자색을 알 수 없다. 

  그래도 맞춰야 한다.  맞추지 못하면 탈락할 것이다.

  대신, 여러분은 모자를 쓰기 전에 한번 모두 모여 토의를 할 시간을 얻는다.

  이 토의 시간 동안 최대한 많은 인원이 살아 남을 수 있는 방법을 고안하라.

  단, 일단 모자를 쓰고 질문을 받은 이후에는 '검정색', '흰색'이라는 두 단어 이외에는 

  다른 말을 할 수가 없다는 점에 유의하고 신중하게 답하도록. 줄을 서 있는 상황에서는 상호 간에 

  아무런 대화도 할 수 없으니 토의 때 열심히 이야기하길 바란다."


  그래서 이 사나이들은 모두 모여서 열심히 토의를 했습니다. 그리고 다시 키 순서대로 

  줄을 좌악 선 뒤에 모자가 위에서 내려왔고, 맨 뒤의 제일 키가 큰 사람부터 한 명씩 

  자신의 모자 색을 이야기했습니다. 그리고 99명의 사나이가 시험에 합격했습니다. 

  한번 더 시험을 치뤘을 때에는 100명이 모두 합격하기도 했습니다. 

  아무튼 100명 모두가 합 격하거나 한 사람을 제외하고는 모두 합격할 수 있는 방법을 

  고안해 낸 것입니다. 과연 이들이 고안한 그 방법이란 과연 무엇일까요?


  추가 설명 조건 - 키 순서대로 서 있으므로, 나는 나보다 키가 작은 사람들의 모자 색을 

                         모두 알 수 있습니다. 100명이 좀 많은 숫자이긴 하지만, 제일 키가 큰 사나이는

                         제일 키가 작은 사나이의 모자 색도 알 수 있을 만큼 이 사나이들의 눈이 모두

                         좋다는 점을 전제로 합니다.


출처 : http://kldp.org/node/81176


여기서 패리티 비트를 적용 시켜보면 제일 뒤의 키가 큰 사람이 패리티 비트가 된다고 생각했다.

가장 키가 큰 사람은 자신의 앞에 보이는 모자 중 검은색의 모자 수를 세어 개수가 홀수 이면 "검은색"

이라고 말하고 짝수이면 "흰색" 이라고 말을 한다고 모든 사람이 토의를 했다고 가정을 한다.


여기서 검은색을 1로 흰색을 0으로 두었을 때, 검은색(1)의 개수가 홀수 일때 검은색(1) 이라고

말한다면, 가장 키가 큰 사람은 짝수 패리티가 되고, 검은색(1)의 개수가 짝수 일때 검은색(1) 

이라고 말한다면, 홀수 패리티가 된다고 생각했다. 


99번째 사람은 100번째 사람의 말을 듣고 자신의 앞에 보이는 검은색 모자의 수를 센다.

만약 100번째 사람이 검은색 이라고 말했다면 검은색 모자의 수가 홀수개라는 말인데,

만약 자신의 앞에 보이는 검은색 모자의 수가 홀수개이면 자신의 모자는 흰색이 되므로

흰색이라고 말한다. 마찬가지로 98번째 사람은 100번째 사람이 검은색 모자의 수가 홀수개라는 

것을 알렸고, 99번째 사람이 자신의 모자색이 흰색이라고 말했으므로 98번째 사람 앞에 보이는 

검은 모자의 개수가 그대로 홀수개 이면 자신의 모자는 흰색이고 짝수개 이면 자신의 모자가 

검은색인 것이다.


이런식으로 한다면 맨뒤의 사람이 자신의 모자색깔을 맞출확률은 50%이며

최대 100명, 최소 99명은 자신의 모자 색깔을 맞출 수 있을 것이다.


직접 연관되지 않은 것도 같지만, 마지막 사람이 패리티 비트가 될 수 있다는 사실에서 

연관을 지어보았다.

Posted by 콩알은
AVR2012.02.04 11:24

[AVR Essay 13] 인터럽트 이야기

 

 

지금까지 기본적인 I/O에 대해서 대부분 이야기 한 것 같다.

 

이제, ATmega 8535에 있는 조금은 더 특수한 기능을 다루게 될 것이다.

 

타이머, 카운터, PWM, USART, SPI, TWI, A/D 컨버터, 아날로그 비교기가 있다.

 

이들 중 대부분은 인터럽트를 사용한다.

 

그래서 간단하게나마 인터럽트가 무엇인지 이해하고 진행해야 할 것 같다.

 

 

인터럽트는 프로그램이 실행 중에 외부의 장치 등에서 요구가 있으면

 

실행중의 프로그램을 일시 중단하고 요구에 따라 다른 처리를 수행 한다.

 

간단히 아래 그림을 보면 된다.

 

프로그램이 잘 실행되고 있다가 인터럽트가 요청되면 나중에 되돌아올 return address를 스택에 저장 한 후

 

interrupt service routine에서 인터럽트를 처리한 후 인터럽트 발생전 위치로 돌아 오는 것이다.

 

대충 이정도 개념만 알고 넘어 가자. 이론적으로 인터럽트를 풀어 나가면 할 말이 너무 많다.

 

 

ATmega 8535에는 SREG 레지스터(Status Register)가 있다.

 

여기서 Bit 7이 지금 다루고 있는 인터럽트 관련 레지스터다.

 

그것도 시스템 전체 인터럽트를 제어한다. Global Interrupt Enable이라는 의미이고

 

인터럽트를 사용하기 위해서는 우선 이를 1로 해 설정 해야 한다.

 

이 레지스터를 직접 건들여서 제어할 수도 있지만 주로 WinAVR에서는 sei();, cli(); 명령을 사용한다.

 

전체 인터럽트를 사용하기 위해서는 sei();, 전체 인터럽트를 중지 할려면 cli(); 명령을 사용하면 된다.

 

대충 set interrupt, clear interrupt 하면 명령어 외우는데는 문제 없을 것이다.

 

(사실 이 명령은 SEI, CLI로 어셈블리에 근거 한 것이다.)

 

나머지 Bit들도 상당히 중요한 것이지만 인터럽트와는 관계 없기 때문에 생략 하겠다.

 

(데이터 시트에 설명이 아주 훌륭하게 되어 있다.)

 

 

각 장치 별로 인터럽트를 사용하기 위해서는 각 장치에 해당하는 레지스터마다

 

인터럽트 사용 유무를 결정 할 수 있는 부분이 있다.

 

이들에 대해서는 해당 장치가 나올 때마다 다룰 예정이다.

 

인터럽트가 발생 했을 때 어떤 장치가 인터럽트를 발생 했는지 판단하는 인터럽트 벡터가 있다.

 

인터럽트 벡터는 인터럽트 마스크 레지스터를 통해서 각각 개별적으로 허용여부를 설정할 수 있다.

 

ATmega 8535에는 다음과 같이 인터럽트 벡터가 정의 되어 있다.

 

(AVR에서는 인터럽트가 동시에 발생하면 아래 순서대로 우선순위가 결정 된다.)

 

여기서 각각 인터럽트는 Program Address를 통해서 접근하는데,

 

역시 사람은 숫자에 약하기 때문에 WinAVR의 avr/iom8535.h 파일에 다음과 같이 #define 되어 있다.

 

 

이하 부분은 생략 했으니 직접 파일을 열어서 어떻게 되어 있는지 확인 해 보도록 해라.

 

 

인터럽트가 발생 했을 때 interrupt service routine으로 점프 하는데 여기서 할 일을 정해 주면 된다.

 

interrupt service routine은 WinAVR에서는 함수와 유사하게 작성하면 된다.

 

 

ISR(인터럽트 벡터)

{

   ...

}

 

 

예를 들어 타이머0 오버플로우 인터럽트의 interrupt service routine을 구현 할려면 다음과 같이 하면 된다.

 

 

ISR(TIMER0_OVF_vect)

{

   // 할일

}

 

 

그리고 인터럽트를 사용하기 위해서는 avr/interrupt.h를 #include 해 줘야 한다.

 

경우에 따라 interrupt service routine을 ISR 대신 SIGNAL이나 INTERRUPT로 처리하기도 하는데,

 

WinAVR에서는 앞으로 없엘 명령이기 때문에 사용하지 않는 것이 좋다.

 

자세한 내용은 avr/interrupt.h 파일을 참조 하도록 하라.

 

 

인터럽트와 대비되서 사용되는 말은 폴링(polling)이 있다.

 

인터럽트는 프로그래머가 모르는 시점에서 발생하는 것이지만

 

폴링은 프로그래머가 원하는 시점에 처리하는 것 이다.

 

텀즈에는 폴링을 다음과 같이 설명하고 있으니 참조 하도록 하라.

 

 

통신에서, "폴링"은 한 프로그램이나 장치에서 다른 프로그램이나 장치들이 어떤 상태에 있는지를

 

지속적으로 체크하는 전송제어 방식으로서, 대체로 그들이 아직도 접속되어 있는 지와 데이터 전송을 원하는지 등을 확인한다.

 

명확히 말하면, 여러 개의 장치가 동일 회선을 공유하는 멀티드롭이나 멀티포인트 통신에서,

 

제어 장치는 각 장치에 한번에 하나씩 메시지를 보내어, 전송할 데이터가 있는지(즉, 회선을 사용하기 원하는지)를 묻는다.

 

 

일단 이 정도 하면 인터럽트가 무엇인지 감을 잡았다고 믿고 싶다.

 

구체적인 예제는 앞으로 쭉~~~ 나올 것이다.

Posted by 콩알은