T89C51RD2/AT89C51ED2 관련 질문과 대답 모음

들어가는 말

 

T89C51RD2 / AT89C51ED2 관련하여 실제로 받은 질문과 그에 대답을 모아보았습니다. 도움이 되기를 바랍니다. T89C51RD2와 AT89C51ED2는 큰 차이가 없습니다. 고로 T89C51RD2에 대한 질문과 대답은 AT89C51ED2에도 적용될 수 있습니다.

 

목차

 

Q.01   40MHz 크리스탈을 구할 수 있는지요?     

Q.02   40MHz의 크리스탈을 T89C51RD2에 연결한 뒤 오실로스코프로 클럭 파형을 보니 클럭 주파수가 13.3MHz가 나옵니다. 어디가 잘못 된걸 까요?

Q.03   EEPROM에 데이터를 쓰고 읽는 것이 잘 안되는데...

Q.04   EEPROM 영역과 프로그램을 저장하는 코드 메모리가 메모리 맵상에서 겹쳐있나요?

Q.05   AT89C51ED2와 AT89C51RD2와의 차이점이 무엇인가요?

Q.06   T89C51RD2와 AT89C51RD2는 pin to pin 호환 가능한가요?

Q.07   89C51RD2의 x2 모드에 관한 질문입니다. 이 칩의 최대 동작 주파수가 40 MHz 인데, x2 모드를 사용하면 이 칩을 80MHz로 동작시킬 수 있는지요?

Q.08   어드레스 신호 중 상위 몇 비트를 디코딩하여 주변기기를 선택하려고 합니다. 그런데 오실로스코프 상에 어드레스 신호가 제대로 보이지 않는 것 같습니다. 무엇이 잘못된 것일 까요?

Q.09   AT89C51ED2도 FLIP 프로그램을 사용할 수 있나요?

Q.10   T89C51RD2를 사용할 때 헤더파일은 어떤 것을 사용해야 하나요?

Q.11   T89C51RD2를 이용하여 전광판 프로그램을 짜고 있는데 배열의 크기를 확장하면 프로그램이 정상적으로 동작되지 않아요. 코드 메모리가 부족해서 그런건가요?

 

 

 

Q.01 40MHz 크리스탈을 구할 수 있는지요?

  

국내에 많은 크리스탈 제조사가 있습니다.  그 중 한 곳의 홈페이지를 방문해 보면, 40MHz 크리스탈이 판매되고 있음을 알 수 있습니다. 판매되고 있는 크리스탈의 주파수 범위는 40MHz를 훨씬 넘어서고 있습니다.

(처음 글 올린 날 : 11월/2004, 마지막 수정 : 06/03/2006, r/t/e/l/d )

Q.02 40MHz의 크리스탈을 T89C51RD2에 연결한 뒤 오실로스코프로 클럭 파형을 보니 클럭 주파수가 13.3MHz가 나옵니다. 어디가 잘못 된걸 까요?

  

13.3MHz는 40MHz를 3으로 나누어 얻을 수 있는 값입니다. 사용한 40MHz의 크리스탈이 써드하모닉(3rd harmonic / 3rd overtone)으로 동작되도록 제작되었을 가능성이 높습니다. 크리스탈의 동작 모드는 보통 펀더멘탈(fundamental) 과 써드 하모닉(3rd hamonic)으로 구분됩니다. 크리스탈 스펙을 확인해 보시기 바랍니다.

(처음 글 올린 날 : 11월/2004, 마지막 수정 : 12/09/2004, r/t/e/l/d )

Q.03 EEPROM에 데이터를 쓰고 읽는 것이 잘 안되는데....

  

EEPROM에 데이터를 쓰고 읽는 예제 프로그램을 준비해 두었습니다. 이곳을 클릭하면 해당 페이지로 이동합니다.

(처음 글 올린 날 : 11월/2004, 마지막 수정 : 12/09/2004, r/t/e/l/d )

Q.04 EEPROM 영역과 프로그램을 저장하는 코드 메모리가 메모리 맵상에서 겹쳐있나요?

  

EEPROM과 코드 메모리(플레쉬메모리)는 전원이 꺼지더라도 저장된 내용을 잃어 버리지 않습니다. 그래서 이 둘이 메모리 맵상에서 겹쳐 있고, 이 중 어느 것을 선택할지를 특정 레지스터의 특정 비트에 의해 결정한다라고 생각할 수 있는데, 사실은 그렇지 않습니다.

EEPROM 과 같은 메모리 공간을 차지하는 것은  XDATA 영역입니다. EEPROM에 저장되는 내용이 프로그램이라기 보다는 전원이 꺼지더라도 보관해야 할 데이터라는 점에서 EEPROM과 XDATA 영역을 같은 메모리 공간에 둔 것이 더 타당하다고 볼 수 있습니다. 위에서 말한 것처럼, EEPROM과 XDATA 중 어느 영역에서 값을 읽거나 쓸지는 특정 레지스터의 특정 비트의 상태에 의해 결정됩니다.

(처음 글 올린 날 : 11월/2004, 마지막 수정 : 12/09/2004, r/t/e/l/d )

Q.05 AT89C51ED2와 AT89C51RD2와의 차이점이 무엇인가요?

  

 

 T89C51RD2의 업버젼 칩은 AT89C51ED2입니다. AT89C51RD2와 AT89C51ED2의 차이는 EEPROM이 있고 없고의 차이입니다. AT89C51ED2가 EEPROM을 가지고 있습니다.

(처음 글 올린 날 : 11월/2004, 마지막 수정 : 12/09/2004, r/t/e/l/d ) 

Q.06 T89C51RD2와 AT89C51RD2는 pin to pin 호환 가능한가요?

  

Ateml 자료에 나와 있듯이 그렇습니다.  

(처음 글 올린 날 : 11월/2004, 마지막 수정 : 12/09/2004, r/t/e/l/d

Q.07 T89C51RD2의 x2 모드에 관한 질문입니다. 이 칩의 최대 동작 주파수가 40 MHz 인데, x2 모드를 사용하면 이 칩을 80MHz로 동작시킬 수 있는지요?

 

그렇지는 않습니다. x2 모드를 사용하던 않하던 이 칩의 최대 동작 주파수는 40MHz입니다. x2 모드를 사용하지 않는 경우 이 칩을 최대 동작 주파수인 40MHz로 동작시키기 위해서는  40MHz의 크리스탈 또는 외부 오실레이터가 필요한데 반해, x2 모드에서는 20MHz의 크리스탈 또는 오실레이터로 칩을 40MHz로 동작시킬 수 있습니다. x2 모드의 장점은 EMI를 줄일 수 있다는 것과 시장에서 더 손 쉽게 구할 수 있는 낮은 주파수의 크리스탈 또는 오실레이터를 사용할 수 있다는 것입니다.

(처음 글 올린 날 : 11월/2004, 마지막 수정 : 12/09/2004, r/t/e/l/d )

Q.08 어드레스 신호 중 상위 몇 비트를 디코딩하여 주변기기를 선택하려고 합니다. 그런데 오실로스코프상에 어드레스 신호가 제대로 보이지 않는 것 같습니다. 무엇이 잘못된 것일 까요?

  

현상을 직접 보지 않아 무엇이 잘못되었는지는 정확히 판단할 수 없으나, 테스트 방법 한 가지를 제안해 드립니다. 0xaaaa와 0x5555번지의 데이타 메모리를 번갈아 가면서 억세스하는 테스트 프로그램을  실행시킨 뒤 각 어드레스 라인이 토글하는지를 관찰해 보세요. 언급한 두 개의 번지의 데이타 메모리를 억세스하기 위해서는 반드시 외부 메모리를 억세스해야 하므로 어드레스신호를 쉽게 관찰하실 수있을 것입니다.

(처음 글 올린 날 : 11월/2004, 마지막 수정 : 12/09/2004, r/t/e/l/d )

Q.09 AT89C51ED2도 FLIP 프로그램을 사용할 수 있나요?

  

 물론 있습니다. Device > Select ...를 선택하신 후 나오는 Device Selection 대화 상자에서 AT89C51ED2를 선택하세요.

(처음 글 올린 날 : 11월/2004, 마지막 수정 : 12/09/2004, r/t/e/l/d )

Q.10   T89C51RD2를 사용할 때 헤더파일은 어떤 것을 사용해야 하나요?

  

헤더 파일은 레지스터의 심볼릭 네임(symbolic name)과 그것의 있는 어드레스를 연관시켜 주는 일을 합니다. T89C51RD2에는 8051/8052 보다 더 많은 레지스터가 있습니다.  8051에 없는 레지스터 모두를 심볼릭 네임으로 사용하기 위해서는 헤더 파일을 <reg51.h>  대신 <./Temic/89c51rd2.h>를 사용하세요.

(처음 글 올린 날 : 12/07/2004, 마지막 수정 : 12/09/2004, r/t/e/l/d )

Q.11   T89C51RD2를 이용하여 전광판 프로그램을 짜고 있는데 배열의 크기를 확장하면 프로그램이 정상적으로 동작되지 않아요. 코드 메모리가 부족해서 그런건가요?

  

질문의 일부를 옮겨 보겠습니다.

    제가 지금 이 보드를 가지고 전광판을 만들고 있습니다.

    아래의 경우와 같이 배열의 크기를 정했을 때에는 전광판에 문제가 생기지 않고 글자가 잘 나옵니다..

    char red_buffer[128];
    char  grn_buffer[128];
    unsigned char  red_data;
    unsigned char grn_data;
    char g[64];
    char r[64];

    char  red_data_1[128]

    char  grn_data_1[128]
     

     

     하지만 다른건 변화없이 배열의 크기를 64->128로 바꾸어도 전광판에 글자가 제대로 들어 오지 않는 문제가 발생합니다..

Program Size: data=9.0 xdata=904 code=1763  <- 용량을 봤을때는 문제가 발생하지 않아야 할꺼 같은데요..

이 경우는 코드 메모리가 부족하다기 보다는, RAM이 부족해 생기는 문제 같습니다. xdata를 904 바이트를 사용했는데 여기서 추가적으로 64*2 바이트를 더 사용한다면, 1024 바이트를 넘어 프로그램이 원하는 데로 동작하지 않는 것처럼 보입니다.

 

(처음 글 올린 날 : 12/07/2004, 마지막 수정 : 12/09/2004, r/t/e/l/d)

(마지막으로 수정한 날자 : 06/03/2006)