2010-04-12 5 views
21

나는 이미 데이터 시트와 구글을 읽었지만 나는 아직도 이해하지 못한다. 제 경우PIC에서 포트와 래치의 차이 18F

, I 입력 모드에서의 PIN PIC18F26K20 RC6을 설정

TRISCbits.TRISC6 = 1;

그런 다음 PORT 및 LATCH로 값을 읽었으며 값이 다릅니다!

v1 = LATCbits.LATC6;

v2 = PORTCbits.RC6; V2 1.

을 제공 정상적인 형입니다

V1은 나에게 공을 준다? 어떤 경우에는 PORT를 사용해야하고 어떤 경우에는 LATCH입니까?

답변

29

래치는 값이 기록되는 출력 출력입니다. 포트는 실제 핀의 전압입니다.

상황이 다를 수있는 경우가 있습니다. 내가 가장 자주 접하게되는 것은 당신이 핀을 (실수로) 땅에 단락시키는 것입니다. 래치를 높게 설정하면 래치가 하이로 읽히지 만 핀의 전압이 대략 접지되기 때문에 포트는 로우로 읽습니다.

설명한 또 다른 상황은 포트 핀이 올바르게 구성되지 않은 경우입니다. 필자 (그리고 내가 함께 일하는 모든 사람들)는 PIC가 기대에 미치지 못하는 이유를 알아 내려고 노력하면서 결국 아날로그 모듈을 끄는 것보다 더 많은 시간을 보냈습니다. I/O 포트 -> PORT?, TRIS?, LAT 섹션을 확인하십시오. 데이터 시트에 등록하십시오. 용량 성 부하에 연결된 핀에 출력을 작성한 직후에 잘못된 값을 읽는 것에 대해 설명하는 Microchip wiki page에서 더 많은 정보를 얻을 수 있습니다.

위키 페이지는 설명한다 : 포트 레지스터의 읽기가 핀에서 볼 수있는 로직 레벨을 반환 동안

포트 래치 레지스터의 읽기, 출력 드라이버의 설정을 반환합니다. 또한

, 여기 18F14K50의 I/O 포트 부로부터 니펫 (여기서는 18F 시리즈의 나머지와 동일하여야 할)

각 포트에 대한 세 개의 레지스터를 가지고 그 작업. 이러한 레지스터는 :

  • TRIS 레지스터 (데이터 방향 레지스터)
  • PORT 레지스터
  • LAT 등록 (출력 래치)

(디바이스의 핀의 레벨을 판독) 따라서 대부분의 경우 래치에 쓰고 포트에서 읽습니다.

+0

PIN이 입력 모드 인 경우 사용해야하는 항목은 무엇입니까? 래치 또는 포트? PIN이 Ouput 모드 인 경우 무엇을 사용해야합니까? 래치 또는 포트? – acemtp

+0

@acemtp : 답변이 업데이트되었습니다. –

10

다음은 데이터 시트의 유용한 요약입니다.

11.2.3 LAT 레지스터
가 I/O 핀과 관련된 레지스터 LATx는 읽기 - 수정 - 쓰기 지침에 발생할 수있는 문제를 제거합니다. LATx 레지스터를 읽으면 I/O 핀의 값 대신 포트 출력 래치에있는 값이 반환됩니다. I/O 포트와 연결된 LAT 레지스터의 읽기 - 수정 - 쓰기 작업은 입력 핀 값을 포트 래치에 쓸 가능성을 방지합니다. LATx 레지스터에 대한 쓰기는 PORTx 레지스터에 대한 쓰기와 동일한 효과가 있습니다. PORTx에

  • 기입이 포트 래치에 데이터 값을 레지스터에 기록 다음과 같이 포트와 레지스터 사이 LAT

    차이점은 요약 될 수있다.

  • LATx 레지스터에 쓰면 데이터 값이 포트 래치에 기록됩니다.
  • PORTx 레지스터 읽기는 I/O 핀의 데이터 값을 읽습니다.
  • LATx 레지스터를 읽으면 포트 래치 에 저장된 데이터 값을 읽습니다.
+0

답변 해 주셔서 감사합니다. 내가 데이터 시트 및이 부분을 읽었지만 질문에 대답하지 않습니다 : 언제 핀 (입력 모드), 나는 래치 또는 포트를 사용해야하고 핀 (출력 모드) 내가해야 사용자 래치를 작성해야 읽을 또는 포트. – acemtp

3

예, PORTx 및 LATx를 읽는 것이 일반적이며 다른 값을 갖는 경우가 종종 있습니다.

일부 외부 하드웨어가 핀을 하이 또는 로우로 구동하는지 여부를 읽으려면 핀을 입력 모드 (TRIS 또는 DIR 레지스터 사용)로 설정해야하며 PORTx를 읽어야합니다. 핀의 실제 전압이 높거나 낮은 지 여부를 알려줍니다.

핀을 높게 또는 낮게 구동하려면 핀을 출력으로 설정해야합니다 (TRIS 또는 DIR 레지스터 사용). 비트를 LATx 레지스터에 써야합니다.

(이 비트를 PORTx 레지스터에 쓰는 것은 일 수 있습니다. 올바른 일을하려면 일 것입니다 : 그 핀은 결과적으로 높거나 낮게 갈 것입니다. 그러나 다른 핀들 이 포트는 오픈 콜렉터 버스에 연결됩니다. PORTx 레지스터의 한 비트에 쓰면 해당 포트의 다른 핀 상태가 엉망이되어 디버깅하기 어려운 문제가 발생할 수 있습니다.

Open Circuits: read before write

3

나의 추천 읽기 전용으로 포트 값을 생각하는 것입니다. LAT 값은 읽히거나 쓰여질 수 있지만 읽은 값은 핀의 입력 값이 아니라 마지막으로 쓰여진 값이 될 것이다.

오래된 PIC에서는 LATx 값이 존재하지 않습니다. 포트에 쓰는 유일한 방법은 PORTx 레지스터를 사용하는 것이 었습니다. 흥미롭게도, 정말로 오래된 PIC 중 일부는 General Instruments (Microchip 이전) 시대부터 LATx를 지원했지만 Microchip은 PIC18x 회선까지는이 기능을 추가하지 않았습니다.

10

전기 공학부에서 my answer을 사용하겠습니다.

는의 수동에서 그림을 사용하자 :

Generic I/O Port Operation

당신이 I/O 핀의 비트를 쓰기

, 당신은 데이터 레지스터 ( D-FlipFlop)에 데이터 버스에서이 비트를 저장하고 있습니다. 이 비트의 TRISx가 0이면, 데이터 레지스터의 Q로부터의 데이터는 I/O 핀에있게된다. LATx 또는 PORTx에서 쓰기가 동일합니다. 빨간색으로 아래를 참조

Generic I/O Port Operation Write

을 LATx에서 읽을 반면,은 PORTx 읽기의 다릅니다.

LATx에서 읽을 때 데이터 레지스터 (D-FlipFlop)에있는 내용을 읽는 것입니다.

Generic I/O Port Operation Read LATx

을 그리고 당신은 PORTx에서 읽을 때, 당신은 실제 I/O 핀의 값을 읽고 : 녹색으로 아래 그림을 참조하십시오. 파란색은 아래를 참조하십시오 :

Generic I/O Port Operation Read PORTx

PIC 사용하여 읽기 - 쓰기 수정 작업을 작성하고 이것이 problem 할 수 있습니다, 그래서 그들은이 그림자를 방지하기 위해 등록을 사용합니다.

0

다른 PORTx Rj (예 : PORTC RC0)가 이미 설정되었을 때 PIC18F14K50의 PORTx Ri (예 : PORTC RC1)에 대한 쓰기가 효과가없는 것으로 나타났습니다. PORTx Ri에서 오실로스코프를 들여다 보았지만 출력을 유지할 수 없었습니다. LATx를 쓰자 마자이 문제가 사라졌습니다.

PAT18 및 PORTx 쓰기에는 LATx 쓰기가 필수로 보입니다.