Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Модифицированная рабочая программа с подробным комментарием.
Блок-схема алгоритма программы.
Рис. 1. Блок-схема алгоритма программы.
Модифицированная рабочая программа с подробным комментарием.
; Работа №2 АНТАКОВ Д. В. БАБИКОВ Д. Р. ; PIC16F876 4мГц ; Формат выводимых данных на ЦАП: RB7 - знак, RB6-0 - модуль ; Бит защиты_CP, сторож_WDT, таймер сброса по пит._PWRTE, кварц_HS_OSC list p=16F876 include " p16F876.inc" ; __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC ; Определить псевдооператорами EQU названия и биты клавиш. ; -------- Константы -------- Tim1 equ.190; Код задержки 1 (01-FF) Tim2 equ.3; Код задержки 2 (01-FF) Tim3 equ.10; Код задержки 3 (01-FF) Tim4 equ.1; Код задержки 4 (01-FF) Um equ.115; Um Nm equ.9; максиматьное число аргумента ; ---------- биты инициализации портов ---------- ; b'76543210'; № бита INIT_A equ b'11111111'; ввод - 1 INIT_C equ b'00000000'; вывод - 0 ; ---------- Блок регистров общего назначения (РОН) с 20h по 7Fh ---------- cblock 0x20; начало блока РОН count1, count2, step, sign; список переменных endc; конец блока РОН ; -------- Макросы (см.ЛР2)---------- Bank0 macro bcf STATUS, RP0 bcf STATUS, RP1 endm Bank1 macro bsf STATUS, RP0 bcf STATUS, RP1 endm ; ----------- Программа ------------------ ORG 0h; начало программы goto start ; -------- Прерывания -------- ; org 4h; вектор прерывания ; goto inthlr; переход к прерыванию (если есть) ; ---------- инициализация PIC ---------- start clrf PORTA; PORTA=0 clrf PORTC; PORTВ=0 Bank1; Банк 1 с TRIS movlw INIT_C; movwf TRISC; TRIS Bank0; Банк 0 (PORT) clrf step; step=0 main nop; начало цикла clrf sign; +sign, знак (+) call modul; Fn1, Time 1 bsf sign, 7; -sign, знак (-) call modul; Fn1, Time 1 goto main+1 ; ; ------------ подпрограммы ------------------ ; Вх: sign=0, знак (+); sign=1, знак (-) ; Вых: sign+modul = (знак+модуль) modul nop call Fn1; Fn1 - табличная функция с Time 1 movlw Tim2; w=Time 2 call time2; п.п. времени с 2 байтами call Fn2; Fn2 - линейная убывающая функция с Time 3 movlw Tim4; w=Time 4 call time2; п.п. времени с 2 байтами return ; Вх: step - аргумент, Вых: PORTB - табличная функция. (знак+модуль) Fn1 clrf step movf step, w; step-> w CALL TABLE; y=Sin(x) addwf sign, W; (sign+W)-> W со знаком movwf PORTC; в порт movlw Tim1; w=Time call time1; п.п. времени 1 incf step, f; step+1 movlw Nm; Nm subwf step, w btfsc STATUS, C; If step> 9 return; возврат goto Fn1+1; цикл ; таблица перекодировки функции y=F(w) ; Bx: w = step - аргумент; Bыx: w = F(w) - функция TABLE addwf PCL, f; градусы retlw.0; 0 retlw.21; 10 retlw.41; 20 retlw.60; 30 retlw.77; 40 retlw.92; 50 retlw.104; 60 retlw.113; 70 retlw.118; 80 retlw.120; 90 ; Вх: Um - максимальное значение аргумента, ; Вых: PORTB - линейная убывающая функция. (знак+модуль) Fn2 movlw Um; Um movwf step; w-> step movf step, w; step-> w addwf sign, W; (sign+W)-> W со знаком movwf PORTC; w-> PORTB movlw Tim3; w=Time call time1; п.п. времени 1 decfsz step, 1; step-1 goto Fn2+2 return ; Вх: Um - максимальное значение аргумента, ; Вых: PORTС - линейная нарастающая функция. (знак+модуль) Fn3 clrf step movf step, w; step-> w addwf sign, W; (sign+W)-> W со знаком movwf PORTC; в порт movlw Tim4; w=Time call time1; п.п. времени 1 incf step, f; step+1 movlw Um; Um subwf step, w btfsc STATUS, C; If step> 9 return; возврат goto Fn3+1; цикл ; ----------- пп time1 - 1 байт --------------------------- ; Bx: w = код выдержки времени 1 (1-255) time1 movwf count1; w-> count1 decfsz count1, f; count1-1, если < > 0 goto time1+1; цикл_1 return; возврат ; ----------- пп time2 - 2 байта ------------------------ ; Bx: w = код выдержки времени 2 (01-255) time2 movwf count2; w-> count2 movlw 0FFh; w=0FFh call time1; п.п. time1 decfsz count2, f; goto time2+1; цикл_2 return; возврат END
|