Большой Воронежский Форум
» Программирование>Курсовая по Микропроцессорам. MPLab. Помогите
Vitekiusis Torro 19:46 28.05.2012
Доброго времени суток.
Прошу помочь с курсовой.

К входу аналогового преобразователя подключён датчик который опрашивает микропроцессор 1 раз в секунду. К нулевой ножке порта B подключена линия управления, исполнительным механизмом, который включается при подаче на эту ножку логическую единицу, и выкл. при подаче на эту ножку логич. нуля.
По простому, надо реализовать алгоритм управления, который включает исполнительный механизм, если считанный код с АЦП будет больше заданной величины, и выключить его в противном случае.
Работаем мы с контролером PIC16F73. [Ответ]
Vitekiusis Torro 16:08 05.06.2012
_______________________ up! [Ответ]
Spectator 17:18 05.06.2012
Vitekiusis Torro, контролер то реальный? Или его надо просто сэмулировать случайными числами? [Ответ]
Vitekiusis Torro 15:49 12.06.2012

Сообщение от Spectator:
Vitekiusis Torro, контролер то реальный? Или его надо просто сэмулировать случайными числами?

В самом MPlab выбираем контроллер PIC16F73
include p16f73.inc
mlBait equ 0x45 ; Младший байт для хранения числа прерываний (константы)
stBait equ 0x46 ; Старший байт для хранения числа прерываний (константы)
mlRabBait equ 0x47 ; Младший рабочий байт для подсчета количества прерываний
stRabBait equ 0x48 ; Старший рабочий байт для подсчета количества прерываний
Konstanta equ 0x44 ; Константа для сравнения с результатом преобразования АЦП
flag equ 0x52

org 0x00
goto start


org 0x04

bcf flag,0
BTFSC INTCON, T0IF ; Проверяем флаг прерывания от таймера
call PrerivanieTaymera ; Если он установлен, то Запускаем процедуру обработки прерывания от таймера

BTFSC PIR1, ADIF ; Проверяем флаг прерывания от АЦП
call PrerivanieACP ; Если он установлен, то Запускаем процедуру обработки прерывания от АЦП

BCF INTCON,T0IF ; Сбрасываем флаг прерывания от таймера
BCF PIR1, ADIF ; Сбрасываем флаг прерывания от АЦП
retfie

ZapuskACP
bsf ADCON0,2 ; Запускаем АЦП
CLRF mlRabBait
CLRF stRabBait
RETURN

PrerivanieACP

MOVF ADRES,0 ; Пересылаем констану рабочий байт в рабочий регистр (Для сравнения)
SUBWF Konstanta ; Вычитаю из регистра результата работы АЦП (ADRES) рабочий регистр, хранящий константу


BTFSC STATUS, C ; Проверяем результат вычитания
bcf PORTB,1 ; Если бит С равен 1 (т.е. результат преобразования АЦП меньше константы
; (отрицательный результат вычитания))тогда сбрасываем RB1

BTFSS STATUS, C ; Проверяем результат вычитания
bsf PORTB,1 ; Если бит С равен 0 (т.е. результат преобразования АЦП больше константы
; (положительный результат вычитания))тогда устанавливаем RB1

CLRF ADRES ; Очищаем результат работы АЦП
RETURN

PrerivanieTaymera:
BCF STATUS,Z
MOVLW .1 ;
ADDWF mlRabBait,1; Увеличиваем младший рабочий байт (INCF mlRabBait)

BTFSC STATUS,C ; Анализирум бит C
INCF stRabBait ; Если он = 1, то увеличиваем старший рабочий байт на 1

MOVF stRabBait,0 ; Пересылаем старший рабочий байт в рабочий регистр
SUBWF stBait,0 ; Вычитаю из константы (stBait) рабочий регистр, хранящий количество прываний

BTFSS STATUS, Z ; Проверяем результат вычитания
GOTO Dalee ; Если бит Z равен 0 (т.е. вычитание не равно 0) тогда в конец процедуры

BCF STATUS,Z
MOVF mlRabBait,0 ; Пересылаем младший рабочий байт в рабочий регистр
SUBWF mlBait,0 ; Вычитаю из константы (mlBait) рабочий регистр, хранящий количество прываний

BTFSC STATUS, Z ; Проверяем результат вычитания
bsf flag,0 ; Если бит Z равен 1 (т.е. вычитание равно 0) тогда устанавливаем флаг вызова запуска АЦП

Dalee:
BCF STATUS,C ; Очищаем биты C и Z регистра STATUS (BCF STATUS,Z)
RETURN



start: CLRF mlBait
CLRF stBait
CLRF mlRabBait
CLRF stRabBait
CLRF Konstanta
CLRF flag

MOVLW .10 ;
MOVWF Konstanta; Задаем константу

MOVLW .19 ; (+) Записали число 5095(прерываний от таймера) для осчета двух минут
MOVWF stBait;
MOVLW .232 ;
MOVWF mlBait-)

BSF STATUS, RP0 ; (1)(2) Устанавливаем банк 1

BCF TRISB,1; Устанавливаем RB1 на выход

MOVLW .00 ;
MOVWF ADCON1; Устанавливаем RA1 как аналоговый вход

MOVLW .255 ;
MOVWF TRISA ; Устанавливаем portА на Ввод
BCF STATUS, RP0 ; (3) Устанавливаем банк 0
MOVLW .9 ; 00001001
MOVWF ADCON0; Выбор входного канала RA1, Включение АЦП, Выбор источника тактовых импульсов- 00 = Fosc/2(Fosc-частота одной фазы машинного цикла, совпадающая с частотой кварца), Выбор входного канала RA1, Включение АЦП

BSF STATUS, RP0 ; (3) Устанавливаем банк 1
BSF PIE1, ADIE
4) Разрешаем прерывания от АЦП

BCF STATUS, RP0 ; (3) Устанавливаем банк 0
BCF PIR1, ADIF ; Сбрасываем флаг прерываний от АЦП

BSF INTCON, PEIE ; Разрешаем переферийные прерывания


MOVLW .0
+Таймер)
MOVWF TMR0; Запустли таймер
BSF STATUS, RP0 ; Устанавливаем банк 1
MOVLW .7
MOVWF OPTION_REG; Записали в предделитель 7 (предделитель = 256)
BSF INTCON,T0IE ; Разрешаем прерывания от таймера(-Таймер)

BSF INTCON, GIE ; Разрешаем прерывания в системе

BCF STATUS, RP0 ; Устанавливаем банк 0

loop: BTFSC flag,0
call ZapuskACP ; Запускаем АЦП
goto loop

end

это пример. только здесь с константой.
мне надо что бы секунды были. в общем по заданию.
[Ответ]
Spectator 00:08 13.06.2012

Сообщение от Vitekiusis Torro:
мне надо что бы секунды были. в общем по заданию.

Ну и привяжись к часам системным. в чем проблема то? в асме вроде шаришь. отчего не можешь опросить таймер системный? [Ответ]
posq 16:11 02.07.2012
Vitekiusis Torro, Знак копирайта ставьте. И ссылочку на автора примера, тобиш на меня. [Ответ]
Вверх