2017-10-19 21 views
-1

지연 시간이 0.25 초인 타이머 1을 설정하려고하는데 어려움이 있습니다.PIC16F723에 타이머 설정

FCPU = FOSC/4 =/4 = 4 MHz의 16 MHz의

Ftimer = FCPU/프리스케일러 = 4MHz의/8 = 0.5 MHz의

:

난 레지스터 값을 얻기 위해 다음 계산을 사용

Ttimer = 1/Ftimer = 1/0.5 = 2 MHz의 우리

카운트 = 원하는 지연/Ftimer = 0.25/2 = 125000 우리

이 특정 칩 다음 presc을 갖는다 의 aler 값 :

타이머 0 : 2, 4, 8, 16, 32, 64, 128, 256

타이머 1 : 1, 2, 4, 8

타이머 2 : 1, 4, 16

이 계산은 16 비트 레지스터에 비해 너무 큽니다. 계산이 잘못 되었습니까? 아니면 내가 원하는 특정 지연과 함께 운이 좋지 않을까?

+0

타이머 1의 프리스케일러 '8'이 충분하지 않은 경우 : 타이머 2 또는 타이머 0을 사용하십시오. –

+0

이 계산에 사용 된 실제 코드를 게시하십시오. 문제는 FP 수학이 예상되는 정수 수학을 포함 할 수 있습니다. – chux

+0

Chux 이들은 아직 코드가 없도록 타이머를 설정하는 데 사용되는 계산입니다. – Schwagmister

답변

0

순수한 하드웨어 솔루션을 원할 경우 불행합니다. 생각만큼 멀리 떨어져있는 것은 아니며 응용 프로그램에서 허용하는 경우 CPU 속도를 절반으로 줄이면 원하는 간격을 확보 할 수 있습니다. 또 다른 옵션은 소프트웨어 카운터를 사용하여 오버플로 횟수를 추적하는 것입니다. 위의 예에서 두 번째 오버플로를 수행하려고합니다.

+0

데이터 시트에서 PLLEN 비트를 1로 설정하고 OSCCON 레지스터의 IRCF 비트를 변경하면 클럭 속도를 변경할 수 있음을 발견했습니다. 11 = 16 10 = MHz의 8 MHz의 01 = 4 MHz의 00 = 2 메가 헤르츠 I이 다운을 느리게하고 I는 레지스터의 값이 실제로 맞는 것 얻는 경우 재 계산. 이것은 귀하의 의견에 실행 가능한 해결책입니까? – Schwagmister

+0

이것은 특정 응용 프로그램에 따라 다릅니다. 여분의 속도가 필요하지 않다면 절대적으로 실행 가능한 옵션입니다. 어떤 상황에서는 얻을 수있는 모든 처리 능력이 필요하지만 종종 CPU 속도를 늦출 수 있으며 문제가 발생하지 않습니다. –

0

항상 타이머에 연결된 인터럽트를 사용할 수 있습니다.

해당 인터럽트에 카운터를 설정하고 카운터가 필요한 수에 도달하면 프로세스를 실행하십시오.

가장 세련된 솔루션은 아니지만 PIC의 경우 매우 효과적입니다.

+0

데이터 시트에서 PLLEN 비트를 1로 설정하고 OSCCON 레지스터의 IRCF 비트를 변경하면 클럭 속도를 변경할 수 있음을 발견했습니다. 11 = 16 10 = MHz의 8 MHz의 01 = 4 MHz의 00 = 2 메가 헤르츠 I이 다운을 느리게하고 I는 레지스터의 값이 실제로 맞는 것 얻는 경우 재 계산. 이것은 귀하의 의견에 실행 가능한 해결책입니까? – Schwagmister

+0

물론 다른 곳에서는 처리 능력이 필요하지 않은 경우에만 가능합니다. 모범 사례는 전력 소비를 줄이기 위해 다시 작동해야 할 때까지 더 높은 처리 력으로 실행하고 작업을 수행 한 다음 잠자기 모드로 전환하는 기술에 대해 알려줍니다. 전력 소모에 신경 쓰지 않거나 매우 복잡하지 않은 작업을 수행하면 낮은 클럭 속도로 실행해도 문제가되지 않습니다. – GMoney

0
  1. 누구든지 downvoted 이유에 관해서 의견을 제공하십시오. 질문에 연구가 표시되지 않거나 명확하지 않거나 유용하지 않은 경우 다운 다운하십시오. 내 질문은이 카테고리에 해당하지 않습니다. 보시다시피, 눈이 멀지 않으면 다른 사람들이 내가 무엇을 묻고 있는지 이해합니다.

  2. 내 원래의 생각에 대한 대답은 원래의 사고 방식으로 하드웨어에서 원하는 지연 만 생성하고있었습니다. mplab이 호출 할 때 "틱 카운터"사용에 관해 생각조차하지 않았습니다. 기본적으로 틱 카운터는 원하는 지연에 최대한 가깝도록 최대 지연이 발생하는 횟수를 계산합니다. I는 32 MHz의 발진기, (4)의 클럭 분할기 (4)의 프리스케일러 8

    의 레지스터 크기를 갖는 경우에는 예를 들어

,

I는 것이다 :

32/4 = 8 MHz (클럭 분배기) 8/4 = 2 MHz (프리스케일러)

그래서 내 명령 주파수는 2 MHz입니다. 이것은 지시 기간입니다 1/8000000 = 0.0000005 초. 이것은 또한 현재 발진 주파수, 클럭 분배기 및 프리스케일러를 부여 할 수있는 최소 지연 시간입니다.

나는 256 의 최대 진수 값이있는 8 비트 레지스터를 가지고 있기 때문에 나는 256 * 0.0000005 = 0.000128 초

내 원하는 지연이가이 범위 내에 속하지 않는 경우

의 최대 지연 시간을 가질 것 너무 커서 부정적인 레지스터 값을 얻을 것입니다.

지연 횟수 = 원하는 지연/타이머 기간 0.25/0.0000005가 될 250ms 지연이 필요하면 8보다 훨씬 큰 값이됩니다. 비트 레지스터가 유지됩니다.

PR 레지스터 값의 경우 최대 레지스터 값보다 훨씬 큰 경우 음수가되는 256 - count를 사용합니다.

최대 지연을 고려하여 원하는 지연을 생성하는 데 필요한 틱 값을 계산하려면 원하는 지연/최대 지연이 필요합니다.

그래서 0.25/0.000128 = 1,953.125 반올림/아래 우리 얻을 다음 값

최대 1954 : 0.250112

아래 1953 : 0.249984

그래서 따라 어떻게 정확하게 우리가 필요 1954가 올바른 틱 카운터가 될 것 같습니다.

32MHz 오실레이터, 클럭 분배기 4, 프리스케일러 4, 레지스터 크기 8의 최대 값이 256 인 경우 우리는 최대 지연 시간이 0.000128 초이며, 1954 년 틱 카운터가

1954 * 0.000128 = 0.250112 초 인한 지연 얻기 위해

  1. 나는 주어진 내용에 따라이 모든 것을 계산하는 윈도우 GUI 응용 프로그램을 만든 . 값이 변경되면 자동으로 모든 것을 계산합니다. 따라서 레지스터 크기를 변경하면 최대 지연 및 PR 값이 자동으로 다시 계산됩니다. 누구든지 관심이 있다면 나는 공공 repo를 기꺼이 할 것입니다.

도움 주셔서 감사합니다.