CCP модул

Няма да описвам цялото устройство, тъй като е част от комерсиална разработка. Като цяло устройството е проектирано.

И така, режим на заснемане, CCP модул. Ще разгледаме модула CCP 1, тъй като в устройства с два модула те работят еднакво, с изключение на малък нюанс. За това можете да прочетете в приложението на Microchip на български, което е в прикачения архив към проекта.

Първо, модулът CCP е 8-битов контролен регистър CCP 1 CON, 16-битов работен регистър, състоящ се от два 8-битови регистъра CCPR 1 L и CCPR 1 H, и самия щифт CCP 1, който може да бъде или вход, или изход, в зависимост от режима на работа на модула. В режим на заснемане този щифт е настроен за въвеждане. Също така, модулът, в зависимост от режима на работа, може да взаимодейства както с таймера TMR 1, така и с таймера TMR 2. В режим на улавяне модулът взаимодейства с таймера TMR 1. Смисълът на режима на улавяне е да улови стойността на TMR 1 в момента на пристигането на импулса. Най-простият вариант за измерване на период е да се преброи броя на импулсите с известна продължителност между тези, които пасват между два фронта на един измерен период. Изчислението се състои във фиксиране на текущата стойност на TMR 1 в момента, в който импулсът пристигне на входа на CCP 1.

Ще се опитам да изобразя на фигурата как работи този модул в режим на заснемане.

прекъсване

И така, TMR 1 е конфигуриран да часовник от вътрешен източник. Ако преразпределителят е равен на 1:1, тогава нарастването на таймера при честота на кварцов резонатор (или друг) от 4 MHz ще се извършва на всяка микросекунда. Съответно, това, което отчита таймерът, ще бъде броят микросекунди. Лесно се преобразува в милисекунди и секунди. Нагорната диаграма показва точно тактовата честота на TMR 1. По-долу е входът на CCP, който получава измерения сигнал. Ако настроим улавяне по ръб на входа на CCP, тогава всеки път, когато пристигне импулс, съдържанието на таймера TMR 1 ще бъде записано в CCPR 1 - с други думи, CCPR 1 ще улови съдържанието на таймера. Това е показано на фигурата. Трябва да се отбележи, че на фигурата честотата на входа на CCP е показана условно. С тази честота програмата ще прекъсва твърде често и ще пречи на изпълнението на програмата. Фигурата показва точно този случай. За да избегнете това, можете да настроите заснемането на всеки 4-ти или всеки 16-ти ръб и да настроите предварително скалиращото устройство на таймера на 1:8 и да направите съответните корекции в програмата. Ще разгледаме това в програмата. Така се прави. Като цяло всичко трябва да работи както трябва, но просто не разбирам защо регистърът CCPR1H:L съдържа число, което не съответства на измерения период. Съгласно инструкциите - при пристигането на положителен фронт на CCP1 - регистърът CCPR1H:L трябва да съдържа стойността на TMR1, преброена от последния фронт. Реално - има бройка, по-малка с 3 - 4 единици. На теория това е хардуерен механизъм. Общо взето помислихме и реших, че може да се приложи друг алгоритъм. При прихващане се задава флагът CCP1IF, с който, ако е разрешен, влизаме в прекъсването. В прекъсването ние просто прочитаме стойността на TMR1 и нулираме таймера. Така обратното броене започва отначало и имаме стойността на периода. Тъй като знаем продължителността на цикъла, знаем и периода!

Можете да тествате тази стратегия на малък симулатор, който направих специално за тази статия (трябва да имате инсталиран Flash player за това). В симулатора трябвазадайте битовете, за да разрешите прекъсване, когато се случи улавяне, както и прекъсване, когато таймерът TMR1 препълни. В блока „Обработчик на прекъсвания“ ще трябва сами да нулирате флаговете за прекъсване. Кликнете върху въпросителния знак, за да прочетете помощта.

Тук разглеждаме случая, когато честотата на осцилатора е много по-висока от честотата на входния сигнал. И един момент. Flash технологията не позволява обработка на твърде бързи събития, освен че виждате промени във всички флагове и регистри, трябва да забавите скоростта на изпълнение, което направих. В този симулатор се предполага, че се използва 4 MHz кварц. Следователно 1 машинен цикъл е равен на 1 µs. Но в симулатора 1 µS се приема като единица време, равна на 50 ms. Следователно, ако няма входна честота и таймерът е включен, трябва да изчакате неговото преливане 65535 * 50/1000 = 3276,8 mS

54 мин. Можете да следвате това, ако стартирате това видео на вашия компютър. В уеб браузър таймерите за филми не работят правилно, така че ще видите нещо различно, ако очаквате TMR1H:L да е правилната стойност. Затова, ако искате да тествате видеото, пуснете го на вашия компютър, като изтеглите архива с програмата и диаграмата. Можете също така да зададете TMR1 таймер prescaler за проучване. Като цяло, учете.

'Проект: Използване на модула за улавяне за изчисляване на импулсния период

ДеклариранеSHOW_SYSTEM_VARIABLES= ИЗКЛЮЧЕНО;' Не показвайте вътрешни променливи при симулиране в Proteus

ДеклариранеНапомняния= ИЗКЛЮЧЕНО' Изключване на напомнянията на компилатора

ДеклариранеПредупреждения=Включено' Изключване на предупрежденията на компилатора

Устройство=16F877A' Използван микроконтролер

ДекларирайтеXtal=20' Честота на осцилатора 20MHz

' Колкото по-висока е честотата, толкова по-висока е точността на измерване

КонфигурацияCP_ALL, DEBUG_OFF, WRT_OFF, CPD_ON, LVP_OFF, BODEN_OFF, PWRTE_ON, WDT_OFF, HS_OSC

DeclareAll_Digital=On' Задайте всички портове на Digital I/O

DimPERIODAs Word' Променлива за улавяне на стойността на периода

DimFREQUENCYAs Dword' Променлива за изчисляване на честотата

DimDigitDispAs Byte' Променлива за извеждане на текущата цифра към порт

DimiAs Byte' Променлива на брояча

DimjКато байт' Променлива на брояча

СимволЧисло =2*20000000/4' Постоянна стойност - честота на осцилатора, разделена на 4

' и умножено по 2 (като предскалер TMR1 = 1:8,

' и улавянето се прави на всеки 16-ти фронт)

СимволPortOut = PORTC' Порт за сегменти

СимволCCP1IE = PIE1.2' CCPбит за разрешаване на прекъсване

СимволPEIE = INTCON .6' Бит за разрешаване на периферно прекъсване

СимволGIE = ​​​​INTCON .7​​​​' Бит за разрешаване на глобално прекъсване

СимволТАЙМЕР = TMR1L.Дума' 16-битова променлива TMR1

СимволCAPTURE = PIR1.2' CCPфлаг за прекъсване

On_InterruptGoToInt_Label' Ако възникне прекъсване, отидете на Int_label

PORTA =%00000000' Нулирайте PORTA

PORTB =%00000000' PORTB

PORTC =%00000000' PORTC

PORTD =%11111111' Изключване на индикаторните катоди

TRISA =%00000000'Порт A - изход

TRISB =%00000000' Порт B - изход

TRISC =%00000100' Порт C - изход, с изключение на CCP1

TRISD =%00000000' Порт D - управление на анода

TRISE =%000' Порт E - изход

OPTION_REG =%00100111' Нямаме нужда от този регистър

INTCON =0' Деактивиране на всички прекъсвания

CCP1CON =%00000111' CCP модул - в режим на заснемане на всеки 16-ръб

T1CON =%00110001' TMR1 тактова честота от вътрешен източник предскалер 1:8

uot;;цвят:черен; ">GIE = ​​​​1' Разрешаване на глобално прекъсване

АкоCAPTURE =1Тогава' Проверете флага за прекъсване

ПЕРИОД = ТАЙМЕР' Улавяне на преброената стойноств променлива

' TMR1 от последното прекъсване

ТАЙМЕР =0' Нулирайте TMR1, така че да брои отново от нула

CAPTURE =0' Нулирайте флага за прекъсване

Възстановяване на контекст' Връщане от манипулатора на прекъсване

' с възстановяване на регистрите W и Status

АкоПЕРИОД >0Тогава' Както помним от училище, не можете да делите на нула

ЧЕСТОТА = Число/ПЕРИОД' Вземете стойността на честотата - обратната функция на периода

Заi =1До10'

', през който стойността на периода може да се променя

' Но вече сме изчислили честотата!

PORTD =%11111110' За индикатори с OK - включете нулевия бит на индикатора

Заj =0До7​​​​' И последователно включване на следващия бит,

DigitDisp =DigFREQUENCY, j' присвоява текущата позиция на числото към променливата и

GoSubDisplay' го показва в текущия бит на индикатора

PORTD = ( PORTD1) +1'

' запалване на следващия разряд

' Стойностите на сегмента са изчислени с помощта на

' на този инструмент, тъй като сегментите са непоследователни

DelayMS2' Закъснение за видимост на дисплея

PortOut =0' Гасим сегменти, за да елиминираме последващото сияние

Можете да изтеглите архива с материалите на статията тук