Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Глава 14

.pdf
Скачиваний:
26
Добавлен:
18.02.2016
Размер:
1.11 Mб
Скачать

CCP1CON (0x17)

 

7

6

5

4

3

2

1

0

 

 

 

 

 

 

 

 

 

 

 

 

x

x

DC1B1

DC1B0

CCP1M3

CCP1M2

CCP1M1

CCP1M0

 

 

 

 

 

 

 

 

 

 

 

не использу-

два младших

0000 – режим ШИМ ВЫКЛЮЧЕН

разряда 10-ти

ется,

1100 – режим ШИМ ВКЛЮЧЕН

разрядного зна-

читается как

чения длительно-

«0»

сти импульса

 

 

ШИМ

Рис. 166 Назначение битов регистра CCP1CON (0x17)

-включает/выключает режим ШИМ, иные комбинации бит запрещены, а их наличие связано с режимами работы микроконтроллера 16F877 аппаратно не используемыми в контроллере TTF 5.0. При этом на контакте RC1,2 начинается генерация импульсов;

-аппаратно «добавляет» 2 младших бита к значению длительности положительного импульса, хранящегося в 8-ми разрядном регистре CCPR1L, обеспечивая, таким образом, 10-ти разрядную дискретность изменения длительности выходного положительного импульса ШИМ. Эти биты DC1B1-DC1B0 логически хранятся в регистре CCP1CON.

Регистр CCPR1L (0x15) является регистром, который хранит 8 старших разрядов значения длительности импульса ШИМ. Он доступен для записи и чтения в любой момент времени. В процессе работы модуля в него записывают следующее требуемое значение длительности, которое необходимо для получения нового значения скважности. Фактически этот регистр является промежуточным буфером между шиной данных микроконтроллера и рабочим регистром длительности CCPR1H (см. рис. 164), с которым сравниваются показания таймера TMR2. Наличие такого регистра позволяет заранее подготовить следующее «новое» значение длительности импульса при широтно-импульсной модуляции прямо в процессе формирования импульса со «старой» предыдущей длительностью не «мешая» работе 10-ти разрядного компаратора. Это позволяет устранить задержки в процессе изменения скважности и сделать форму выходного напряжения более «гладкой».

Регистр CCPR1H (0x16) является фактически 10-ти разрядным т.к. в него переписывается группа из 8 бит регистра CCPR1L и 2-х бит из регистра CCP1CON. Этот регистр недоступен для записи стандартным образом (по ШД через W) и доступен только для чтения. В нем хранится 10-ти разрядное значение длительности выходного импульса, с которым сравниваются текущие показания таймера TMR2. Обновление этого регистра происходит автоматически при обнулении таймера в конце каждого нового периода. При этом содержимое регистра CCPR1L (и двух бит CCP1CON) переписывается в CCPR1H и следующий импульс может быть сформирован уже с другой длительностью (если она пред-

варительно была записана в регистр CCPR1L). Можно сказать, что при работе в режиме ШИМ регистр CCPR1H содержит значение «текущей» длительности, а регистр CCPR1L – «новую» длительность выходного импульса.

Регистр периода PR2 (0x92) является регистром, который хранит 8-ми разрядное значение периода выходных импульсов. Он доступен для записи и чтения в любой момент времени. В процессе работы модуля в него записывают требуемое значение периода, которое необходимо для получения необходимого значения скважности. Как правило, в процессе работы ШИМ модуля значение периода не меняется, т.к. переменную скважность стараются получить путем вариации длительности импульса, а не периода. Это связано с тем, что дискретность изменения длительности (0,25 мкс в контроллере TTF) в 4 раза меньше дискретности изменения периода (1 мкс). Как следствие, в этом случае можно получать значения скважности (а в конечном итоге и постоянной составляющей и формы выходного сигнала) более точно, чем при аналогичном изменении периода. Хотя, строго говоря, при необходимости эти два способа можно сочетать.

Регистр TMR2 (0x11) - выходной регистр таймера доступен для записи и чтения обычным образом. При работе модуля ШИМ необходимости в непосредственной работе с этим регистром нет.

Рассмотрим подробнее работу модуля ШИМ по структурной схеме. В самом общем случае при произвольном законе модуляции ширины импульса (при фиксированном периоде ШИМ), можно предположить, что в каждом последующем периоде ШИМ длительность положительного импульса будет изменяться, причем закон ее изменения (т.е. набор значений τШИМ ) известен. При этом период TШИМ выходной импульсной последовательности считается фиксированным и известным. Алгоритм программирования модуля ШИМ включает 2 этапа:

а) Конфигурирование и включение модуля; б) Управление величиной периода (длительности) выходных импульсов в

требуемые моменты времени, для получения широтно-импульсной модуляции этих параметров.

Конфигурирование включает в себя следующие шаги:

-устанавливаются требуемые начальные значения периода и длительности импульсной последовательности соответственно в регистрах PR2 и CCPR1L, CCP1CON;

-контакт RC2 (или RC1) в регистре TRISC конфигурируется как выход;

-настраивается предделитель и постделитель и запускается таймер TMR2, битом TMR2ON в регистре T2CON;

-устанавливается режим ШИМ (в регистре CCP1CON для первого модуля), при этом происходит фактическое включение модуля ШИМ.

После этих операций модуль автоматически начинает генерировать первый период формирования длительности положительного импульса (при этом состояние выхода RC2 (или RC1) еще не определено).

В течение первого периода ШИМ таймер TMR2 аппаратно производит от-

счет числа импульсов 4TOSC или TOSC , а два компаратора сравнивают это число с содержимым регистров PR2 и CCPR1Н. Как только это число совпадет с числом, записанным в регистре периода PR2 сработает 8-ми разрядный компаратор,

сбросит таймер, и через RS триггер установит контакт RC2 (или RC1) в «1» и перепишет значение длительности из регистров CCPR1L и CCP1CON в CCPR1Н. Фактически на этом начнется второй период ШИМ.

Примечание: поскольку в первом периоде в регистре CCPR1Н еще ничего не было записано (по умолчанию 0х00) при работе таймера вначале сработает 10-ти разрядный компаратор и сбросит контакт RC в «0». Т.е. в течение первого периода положительный импульс формироваться не будет.

В течение второго периода длительность логической «1» на контакте RC2 (длительность импульса) будет уже равна установленной в регистре CCPR1Н, т.к., после срабатывания 8-разрядного компаратора периода, значения из регистров CCPR1L и CCP1CON автоматически перепишутся в регистр CCPR1Н. Теперь (считается, что длительность импульса меньше периода) после достижения таймером значения CCPR1Н, триггер по сигналу 10-ти разрядного компаратора установит контакт RC в «0», завершив формирование импульса. Далее этот «0» будет удерживаться на контакте RC до тех пор, пока значение таймера не дойдет до содержимого регистра PR2. При этом сработает 8-ми разрядный компаратор, таймер сбросится в «0», и триггер установит контакт RC в «1», завершив второй период и фактически начав формирование следующего положительного выходного импульса.

Управление длительностью осуществляется путем контроля этого собы-

тия по флагу TMR2IF в регистре PIR1 (при Кпостделителя = 1). В этот момент значение длительности из регистра CCPR1L перепишется в регистр CCPR1Н. Если, не

дожидаясь срабатывания флага, ранее в регистр CCPR1L (и CCP1CON) записать новое требуемое значение длительности, то следующий период ШИМ уже будет сформирован с иной скважностью, а, следовательно, и постоянная составляющая импульсной последовательности также изменится.

14.5.3 Формирователь синусоидального сигнала на микроконтроллере PIC 16F877

Постановка задачи: разработать ПО для микроконтроллера PIC 16F877, обеспечивающего генерацию на контакте RC1 синусоидального сигнала частотой 50 Гц и амплитудой 2,5 В, изменяющегося в диапазоне от 0 до 5В с использованием второго модуля ШИМ.

Учитывая, что разработка ПО потребует определения параметров регистров PR2, CCPR2L, CCP2CON вначале определим значение периода импульсной последовательности ШИМ в соответствие с требованиями, изложенными в п. 14.5.1. Учитывая, что в данном случае амплитуда сигнала изменяется от 0 В до 5 В, т.е. фактически от 0 до 100% от максимального значения той постоянной составляющей, которая может быть получена от импульсной последовательности с амплитудой Um = 5 В, данный сигнал (по аналогии с представленным на рис. 161) можно представить в следующем виде (рис. 167). В нашем случае, Тsin = 1/50 сек., а разбив синусоиду на 64 (значение выбрано для примера) временных интервала, получим величину дискрета по времени t = Тsin /64. Для повышения реальной амплитуды постоянной составляющей циклически повторим период

Um

U(t)

 

 

 

2 t

 

 

 

 

 

U (t) E

U

m

0,5 sin

 

1

 

 

 

i

 

 

Tsin

 

 

 

 

 

 

 

Um/qi

t = 0, Tsin/64, 2Tsin/64, 3Tsin/64, ........ 64Tsin/64

Δt

Um/2

Δt = Tsin /64

ТШИМ = Δt /5 = 62,5 мкс ≈ 63 мкс

t

 

Рис. 167 Вид генерируемого сигнала в течение одного периода при 64 дискретах и 5 циклах повторения ШИМ

ШИМ 5 раз, откуда можно определить период ШИМ: ТШИМ = 1/50·5·64 = 62,5 мкс. Поскольку двоичный эквивалент этого числа в дальнейшем потребуется записать в регистр PR2, округляем его до целого числа и окончательно определяем период ШИМ ТШИМ ≈ 63 мкс. Он будет оставаться постоянным в процессе формирования выходного напряжения, т.к. для осуществления ШИМ модулироваться будет длительность импульса.

Для нахождения длительности положительного импульса импульсной последовательности ШИМ можно пользоваться соотношением τШИМ i = TШИМ / qi, приведенным на рис. 162, для каждого из 64 моментов времени. Для нахождения qi заметим, что набор постоянных составляющих { Е1, Е2, Е3, …. Ei }, полученный средствами MathCAD на рис. 167, может быть аналитически определен следующим образом:

 

 

 

2 t

i

 

E U

 

0,5 sin

 

1

m

 

 

i

 

Tsin

 

 

 

 

 

 

 

где ti = (Tsin/64)i, при i Є [0, 63]

 

 

 

 

 

Учитывая, что амплитуда импульсов модуля ШИМ микроконтроллера также равна «амплитуде» формируемого сигнала Um (что, строго говоря, бывает далеко не всегда), можно записать:

qi = Um/Ei

Подставляя сюда предыдущее выражение для Ei , а полученное выражение для qi в выражение для длительности импульсов ШИМ (τШИМ = ТШИМ/ qi),получим:

i ШИМ

 

 

 

 

2 t

i

 

 

 

T

0,5sin

 

1

i

 

 

 

ШИМ

 

Tsin

 

 

 

 

 

 

 

 

Значения длительностей находим при t = 0, Tsin/64, 2Tsin/64, 3Tsin/64, .... 63Tsin/64.

Примечание: в общем случае, когда амплитуда выходного не периодического сигнала не равна амплитуде импульсов микроконтроллера, получение аналитического выражения для нахождения длительности импульса ШИМ τ

на каждом i-ом интервале невозможно, т.к. не известно аналитическое выражение для требуемого аналогового сигнала. В такой ситуации необходимо пользоваться общими выражениями на рис. 162: численно найти по графику сигнала набор «ступенек» Ei (очевидно Ei ≤ 5В), далее рассчитать требуемые на каждом шаге скважности qi = 5В/Ei и определить совокупность необходимых дли-

тельностей импульсов (при известном периоде ТШИМ): τ i ШИМ = ТШИМ/ qi.

Далее определяем содержимое регистров PR2, CCPR2L, CCP2CON. Для этого воспользуемся соотношениями, приведенными на рис. 163, для контроллера TTF. В регистр периода PR2 будет записано число:

PR2

 

TШИМ

1

63мкс

 

1 62

0х3Е

4 T

K

преддел ителя TMR2

4 0,25 мкс 1

 

OSC

 

 

 

 

 

 

Коэффициент деления предварительного делителя таймера TMR2 для простоты взят равным 1.

В регистр длительности CCPR2L в процессе работы ПО будут записываться 64 последовательных значений длительности, но надо учитывать, что значение длительности в двоичном эквиваленте является 10-ти разрядным, два младших разряда которого размещается соответственно в 5 и 4-ом разрядах регистра

CCP2CON.

Приведем пример нахождения содержимого этих двух регистров в момент времени 25·TSIN/64 (т.е. фактически для 26-го дискрета):

 

 

 

2 25 Tsin / 64

 

 

 

25

63мкс 0,5 sin

 

1

51,48339 мкс

 

 

 

Tsin

 

 

 

 

 

 

 

Из выражения для длительности на рис. 163 получаем десятичный эквивалент содержимого регистров CCPR2L, CCP2CON

CCPR2L,CCP2CON

 

 

25

 

51,48339 мкс

206

T

K

преддел ителя TMR2

0,25 мкс 1

 

OSC

 

 

 

 

Здесь, как и выше, коэффициент деления предделителя TMR2 равен ранее установленному 1:1. Двоичный 10-ти разрядный эквивалент числа 206 равен 00110011 10 (удобно воспользоваться Win-калькулятором при 2-байтовом представлении двоичного числа). Т.к. 8 старших разрядов записываются в регистр

CCPR2L получаем CCPR2L = 00110011 = 0х33 (или 51 в десятичной форме). Два младших бита помещаются соответственно в 5-ый и 4-ый биты регистра CCP2CON, а с учетом его остальных бит (см. рис. 166), получаем CCP2CON = 00101100 = 0х2С (или 44 в десятичной форме).

Примечание: здесь следует обратить внимание, что в регистре CCP2CON только 4-ый и 5-ый биты определяют длительность, а значения других бит рассчитываются с учетом их назначения и жестко указаны на рис. 166.

Остальные значения содержимого этих регистров получены аналогично и приведены в Таблице № 12.

Таблица № 12

Расчет содержимого регистров CCPR2L, CCP2CON.

T*Время

импульсаДлительность, мкс

регистровЗначение CCP2CON<5:4>CCPR2L:

регистраЗначение CCPR2L

регистраЗначение CCP2CON

T*Время

импульсаДлительность, мкс

регистровЗначение CCPCON<5:4>CCPR2L:

регистраЗначение CCPR2L

регистраЗначение CCP2CON

/ 64

 

 

 

 

/64

 

 

 

 

sin

 

 

 

 

sin

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

31,5

126

00011111

00101100

32

31,5

126

00011111

00101100

1

34,58754

138

00100010

00101100

33

28,41246

114

00011100

00101100

2

37,64535

151

00100101

00111100

34

25,35465

101

00011001

00011100

3

40,64397

163

00101000

00111100

35

22,35603

89

00010110

00011100

4

43,55453

174

00101011

00101100

36

19,44547

78

00010011

00101100

5

46,349

185

00101110

00011100

37

16,651

67

00010000

00111100

6

49,00046

196

00110001

00001100

38

13,99954

56

00001110

00001100

7

51,48339

206

00110011

00101100

39

11,51661

46

00001011

00101100

8

53,77386

215

00110101

00111100

40

9,226136

37

00001001

00011100

9

55,84983

223

00110111

00111100

41

7,150171

29

00000111

00011100

10

57,69129

231

00111001

00111100

42

5,308707

21

00000101

00011100

11

59,28052

237

00111011

00011100

43

3,71948

15

00000011

00111100

12

60,60221

242

00111100

00101100

44

2,397795

10

00000010

00101100

13

61,64362

247

00111101

00111100

45

1,356379

5

00000001

00011100

14

62,39474

250

00111110

00101100

46

0,605264

2

00000000

00101100

15

62,84832

251

00111110

00111100

47

0,151681

1

00000000

00011100

16

63

252

00111111

00001100

48

0

0

00000000

00001100

17

62,84832

251

полуячеекЗначенияотнозеркальночены- строкиой-16сительно таблицы

полуячеекЗначенияотнозеркальночены- строкиой-16сительно таблицы

49

0,151681

1

полуячеекЗначенияотнозеркальночены- строкиой-16сительно таблицы

полуячеекЗначенияотнозеркальночены- строкиой-16сительно таблицы

18

62,39474

250

50

0,605264

2

 

 

 

 

19

61,64362

247

 

 

51

1,356379

5

 

 

20

60,60221

242

 

 

52

2,397795

10

 

 

21

59,28052

237

 

 

53

3,71948

15

 

 

22

57,69129

231

 

 

54

5,308707

21

 

 

23

55,84983

223

 

 

55

7,150171

29

 

 

24

53,77386

215

 

 

56

9,226136

37

 

 

25

51,48339

206

26

49,00046

196

27

46,349

185

28

43,55453

174

29

40,64397

163

30

37,64535

151

31

34,58754

138

57

11,51661

46

58

13,99954

56

59

16,651

67

60

19,44547

78

61

22,35603

89

62

25,35465

101

63

28,41246

114

На рис. 168 представлена блок-схема алгоритма формирования синусоидального сигнала. Рассмотрим ее основные особенности:

Конфигурирование модуля ШИМ (установка PR2, TRISC, T2CON, INTCON)

Установить число дискретов за 1 период STEPCOUNT = 64

Установить число повторений периода ШИМ COUNTER = 5

Установить, соответствующее номеру дискрета, значение длительности импульса ШИМ (с включением режима ШИМ), CCPR2L, CCP2CON

нет

Период ШИМ завершен

TMR2IF = 1

да

Сбросить флаг таймера (для контроля окончания следующего периода) TMR2IF = 0

COUNTER = COUNTER - 1

COUNTER = 0

нет

да

STEPCOUNT = STEPCOUNT - 1

да

нет

STEPCOUNT = 0

Рис. 168 Блок-схема алгоритма формирования синусоидального сигнала по 64 отсчетам с 5-кратным повторением периода ШИМ

1.Период импульсной последовательности остается постоянным и равным 63 мкс, соответственно в регистр PR2 однократно в начале работы (на этапе конфигурирования модуля) записывается число 0х3Е. На этапе конфигурирования также запускается таймер TMR2.

2.10-ти разрядное значение длительности в процессе работы обновляется 64 раза путем записи его в регистры CCPR2L, CCP2CON, причем это значение зависит от номера дискрета для которого формируется импульс.

3.Критерий окончания одного периода ШИМ – TMR2IF=1, после чего этот флаг необходимо сбросить в 0.

4.В течение каждого из 64 дискретов STEPCOUNT (начиная с «последнего» 63-го) импульс определенной длительности с периодом ШИМ повторяется COUNTER=5 раз для увеличения реальной амплитуды постоянной составляющей после интегратора в контроллере TTF. В следующем дискрете – длительность импульса изменяется по заданному закону.

Ниже приведен исходный текст ПО для формирования синусоидального сигнала частотой 50 Гц с комментариями.

PROCESSOR PIC16F877 errorlevel-302

 

#include <P16F877.inc>

STEPCOUNT

equ

0x22

COUNTER

equ

0x23

 

org

0x00

 

clrf

STATUS

 

movlw

0x00

 

movwf

PCLATH

 

goto

Start

Start

 

 

 

bcf

STATUS, RP0

 

clrf

INTCON

bsf STATUS,RP0

bcf TRISC,1 movlw 0x3E movwf PR2 movlw 0x0F

movwf OPTION_REG

bcf STATUS,RP0

movlw 0x04 movwf T2CON

Beginning

;принудительное указание типа процессора

;установка уровня обнаружения ошибок компиляции с учетом банков памяти данных

;подключение файла обозначений регистров

;обозначение регистров для хранения числа дискретов и числа повторений периодов ШИМ

;установка адреса размещения ПО а РПЗУ команд

;установка 0-го банка для обращения к регистру

PCLATH

;установка 0-го банка памяти программ

;переход к основной программе

;метка начала программы

;запрет прерываний от ВСЕХ периферийных модулей контроллера, чтобы при возникновении прерывания от модуля таймера TMR2 (когда бит TMR2IF в регистре PIR1 станет равным 1) счетчик команд не устанавливался в значение 0х004 для обработки прерывания (см. особенности ПО ниже)

;установка 1-го банка памяти программ для об-

ращения к регистрам TRISC, PR2, OPTION_REG

;конфигурирование контакта RC1 как выходного

;запись значения периода ШИМ равного 63 мкс, что соответствует 0х3Е

;установка максимального коэффициента предварительного делителя, включенного перед сторожевым таймером WDT и настроенного на подсчет внутренних тактовых импульсов (см. рис. 156) для увеличения периода его срабатывания в

TTF

;установка 0-го банка памяти программ для последующего обращения к регистрам

;запуск таймера TMR2 и установка коэффициентов деления пред- и постделителей 1:1

;метка начала формирования периода аналогового сигнала

movlw

.64

; загрузка числа отсчетов по времени для дискре-

movwf

STEPCOUNT

тизации одного периода синусоидального сигна-

ла

 

 

 

 

 

 

 

New_Off_Duty_Factor

 

 

; метка начала формирования каждого следующе-

 

 

 

го (с измененной длительностью) положительно-

 

 

 

го импульса

 

 

movlw

.5

; загрузка числа повторений периодов ШИМ с

movwf

COUNTER

только что установленной длительностью

им-

пульса

 

 

 

 

 

 

 

movf

STEPCOUNT,W

; загрузка в W номера дискрета, в котором фор-

 

 

 

мируется 5 периодов ШИМ с рассчитанной для

 

 

 

этого дискрета длительностью импульса, по это-

 

 

 

му номеру в следующей процедуре из специаль-

 

 

 

ной таблицы будет выбрано соответствующее

 

 

 

значение длительности

 

 

call

Sine_Table_High

; вызов процедуры записи в W 8-ми старших бит

movwf

CCPR2L

требуемой (соответствующей

текущему номеру

дискрета STEPCOUNT) длительности формируе-

 

 

 

 

 

 

мого импульса и его перезапись в регистр

 

 

 

CCPR2L

 

 

movf

STEPCOUNT,W

; загрузка в W номера того же дискрета, для ис-

 

 

 

пользования в качестве параметра следующей

 

 

 

процедуры

 

 

call

Sine_Table_Low

; вызов процедуры записи в W 2-х младших бит

movwf

CCP2CON

требуемой (соответствующей

текущему номеру

дискрета STEPCOUNT) длительности формируе-

 

 

 

 

 

 

мого импульса и их перезапись в регистр

 

 

 

CCP2CON вместе с битами включения режима

 

 

 

ШИМ. При этом начинается формирование оче-

 

 

 

редной «пачки» из 5-ти периодов ШИМ на теку-

 

 

 

щем дискрете

 

 

PWM_Period_Match

 

 

; метка начала формирования 5-ти периодов

 

 

 

ШИМ с установленной из таблиц длительностью

 

 

 

импульса

 

 

clrwdt

 

; сброс сторожевого таймера, т.к. в контроллере

 

 

 

TTF он аппаратно не отключаем

 

btfss

PIR1,TMR2IF

; ожидаем окончания очередного (одного из 5-ти)

 

 

 

периода ШИМ путем проверки когда TMR2IF=1

goto

PWM_Period_Match

; продолжаем ждать конца периода

 

bcf

 

PIR1,TMR2IF

; период закончился (при этом автоматически

 

 

 

начнется следующий), необходимо сбросить

 

 

 

флаг, чтобы иметь возможность контролировать

 

 

 

окончание следующего

 

 

decfsz

COUNTER,F

; уменьшаем число оставшихся периодов ШИМ

 

 

 

на 1, т.к. очередной период завершен, и проверя-

 

 

 

ем не совершен ли последний 5-ый, т.е. COUN-

 

 

 

TER=0

 

 

goto

PWM_Period_Match

; если не все 5 периодов сформированы, возвра-

 

 

 

щаемся на начало формирования следующего из

 

 

 

оставшихся периодов ШИМ на дискрете

 

decfsz

STEPCOUNT,F

; сюда переходим если сформированы все 5 пе-

 

 

 

риодов ШИМ на очередном дискрете, поэтому

 

 

 

уменьшаем на 1 число оставшихся дискретов и

 

 

 

проверяем не все ли 64 уже пройдены

 

goto New_Off_Duty_Factor

; если сформированы еще не все 64 дискрета, то

 

 

 

возвращаемся на формирование следующего (n-

 

 

 

1) – го дискрета на периоде выходного сигнала

goto

Beginning

; т.к. закончено формирования ШИМ на всех 64-х

 

 

 

дискретах, т.е. один период синуса сформирован,

 

 

 

зацикливаем ПО для формирования второго и т.д.

Sine_Table_High

 

 

; процедура управляемой записи в W чисел в за-

 

 

 

висимости от места их расположения в специаль-

 

 

 

ной таблице, генерируемой директивами dt

 

addwf

PCL, F

; см. описание процедуры ниже

 

 

retlw

.0

 

 

 

dt

.31

 

 

; retlw .31

1

dt

.34,.37,.40,.44,.46,.49,.51,.53,.55,.57,.59,.60,.61,.61,.63

retlw .34

2

retlw .37

3

dt

.63

 

 

 

 

.................

 

 

dt

.63,.61,.61,.60,.59,.57,.55,.53,.51,.49,.46,.43,.40,.37,.34

 

dt

.31

 

 

dt

.28,.25,.22,.19,.17,.14,.12,.9,.7,.5,.4,.2,.1,.1,.0

 

dt

.0

 

 

dt

.0,.1,.1,.2,.4,.5,.7,.9,.12,.14,.17,.19,.22,.25,.28

Sine_Table_Low

addwf

PCL,F

 

retlw

.0

 

dt

.44

 

 

dt

.44,.60,.60,.44,.28,.12,.44,.60,.60,.60,.28,.44,.60,.44,.60

 

dt

.12

 

 

dt

.60,.44,.60,.44,.28,.60,.60,.60,.44,.12,.28,.44,.60,.60,.44

 

dt

.44

 

 

dt

.44,.28,.28,.44,.60,.12,.44,.28,.28,.28,.60,.44,.28,.44,.28

 

dt

.12

 

 

dt

.28,.44,.28,.44,.60,.28,.28,.28,.44,.12,.60,.44,.28,.28,.44

end

.................

................

retlw .22

 

retlw .25

 

retlw .28

65

 

предыдущей

 

Аналогично процедуре

 

Логика работы ПО в основном отражена в построчных комментариях. Однако при выполнении некоторых команд имеются особенности, связанные как с аппаратной архитектурой PIC контроллера, так и алгоритмом построения программы. Рассмотрим их в порядке следования команд в теле ПО.

1. Необходимость запрета обработки прерываний (команда CLRF INTCON) от периферийных модулей микроконтроллера. Эта особенность ПО связана с архитектурой построения микроконтроллера и заключается в том, что ВСЕ периферийные модули (АЦП,SPI, ШИМ, таймеры и т.д.) по окончании каждого цикла своей работы формируют специальный сигнал, называемый «прерыванием», в виде уровня логической «1» в некотором бите некоторого регистра, называемом «флагом» этого прерывания. В этом нет ничего страшного, более того, этим «флагом» удобно пользоваться для контроля факта завершения работы модуля, например, сброса таймера.

Проблема состоит в том, что при возникновении прерывания, в счетчик команд PCL аппаратно (т.е. независимо от Вашего ПО) записывается число 0х0004 (не учитываемое и не отображаемое эмулятором среды MPLAB, но являющееся адресом следующей выполняемой команды и, соответственно, отрабатываемое реальным контроллером). Это число называется «адресом вектора прерывания» в памяти программ контроллера. Предполагается, что по этому адресу при компиляции будет расположена подпрограмма (процедура) обработки этих прерываний (помещаемая туда компилятором по директиве org 0x004 в теле Вашего ПО). В настоящем пособии директивой org 0х0000 ВСЕ тело ПО располагается, начиная с адреса 0х0000, и соответственно по адресу 0х004 расположена не подпрограмма обработки прерывания, а просто одна из команд Вашего ПО. Следовательно, при возникновении прерывания любого из периферийных модулей, контроллер автоматически начнет выполнять команду, расположенную по адресу 0х004 (в нашем случае это случайно оказалась метка Start).

Чтобы избежать этого при работе с периферийными модулями контроллера и при отсутствии необходимости обработки прерываний с помощью специальных подпрограмм, НЕОБХОДИМО ЗАПРЕТИТЬ ОБРАБОТКУ ПРЕРЫВА-

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]