Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

Таймеры и прерывания[PIC16f873A]

Пт дек 06, 2019 22:22:46

Здравствуйте, задали написать программу - "Исходное состояние - все светодиоды погашены, при нажатии SA3 реализуются 2 бегущих светодиода от середины к краям и обратно с длительностью горения каждого светодиода 0,5 сек. SA4 – пауза/снятие с паузы. Во время паузы – звуковое сопровождение.". Реализовать с помощью таймеров и прерывания.Посидел, с помощью выданного примера - кое-что да написал, а что дальше не могу понять. Помогите пожалуйста.
Вод код
Код:
#include p16f873a.inc
      __CONFIG _HC_OSC & _WDT_OFF   ;
;объявление переменных
      STAT1   EQU      H'20'      ;регистр состояния

      GOTO   BEGIN            ;переход к настройке после включения
   
      ORG      H'004'            ;вектор прерывания

      GOTO   INT               ;переход к обработке прерываний
;начало основной программы
BEGIN:   BCF      STATUS,RP1         ;выбираем банк регистров 1
      BSF      STATUS,RP0         ;|
      MOVLW   B'00001110'        ;задаем аналоговый вход PORTA,0
                MOVWF   ADCON1              ;программируем регистр АЦП 1
          MOVLW   B'00000001'         ;PORTA,7-1 выходы, PORTA,0 вход
          MOVWF   TRISA               ;программируем регистр направления PORTA
          MOVLW   B'11111111'         ;PORTB,7-0 входы
          MOVWF   TRISB               ;программируем регистр направления PORTB
          MOVLW   B'11000000'         ;PORTC,7-6 вход, PORTC,5-0 выходы
          MOVWF   TRISC               ;программируем регистр направления PORTC
      MOVLW   B'00000111'         ;включение подтягивающих резисторов и предд. TMRO 1:256
      BSF      PIE1,TMR1IE         ;разрешение прерывания TMR1
      BSF      PIE1,TRM2IE         ;разрешение прерывания TMR2
      BCF      STATUS,RP0         ;выбираем банк регистров 0
      MOVLW   B'00110000'         ;коэфф.деления предделителя 1:8
      MOVWF    T1CON            ;|
      MOVLW   B'00000001'         ;коэфф.деления предделителя 1:4
      MOVWF    T2CON            ;|
      CALL   OFF               ;сброс в исходное состояние
      MOVLW   B'11100000'         ;биты GIE,PEIE,T0IE и INTE=1
      MOVWF    INTCON            ;программируем регистр управления прерываниями

M10      GOTO    M10               ;зацикливаемся здесь

;задаем режим работы таймера TMR1
T1S:   MOVLW   H'0B'            ;задаем выдержку времени 8*(65536-3036)=500000
      MOVWF   TMR1H            ;|
      MOVLW   H'DC'            ;|
      MOVWF    TMR1L            ;|
      RETURN

;выключение светодиодов и пищалки
DL:      CLRF   PORTC            ;гасим все светодиоды
      CLRF   PORTA            ;выключаем пищалку
      RETURN               
;исходное состояние
OFF:   CLRF   STAT1            ;сброс регистра состояния
      CLRF   STATC            ;сброс счетчика времени работы
      BCF      T1CON,TMR1ON      ;выключение TMR1
      BCF      T2CON,TMR2ON      ;выключение TMR2
      CALL   DL               ;переход к выкл. светодиодов и пищалки
      RETURN

;драйвер прерываний от таймеров
INT:   BTFSS   INTCON,T0IF         ;проверка флага прерывания от таймера 0
      CALL   TMR0INT            ;переход к обработке прерывания TMR0, если оно произошло
      BTFSS   PIR1,TMR1IF         ;проверка флага прерывания от таймера 1
      CALL   TMR1INT            ;переход к обработке прерывания TMR1, если оно произошло
      BTFSS   PIR1,TMR2IF         ;проверка флага прерывания от таймера 2
      CALL   TMR2INT            ;переход к обработке прерывания TMR2, если оно произошло

      RETFIE
;обработка прерывания TMR0
TMR0INT:MOVF   STAT1,F            ;проверка регистра на 0
      BTFSS   STATUS,Z         ;если не равен 0, то выйти
      GOTO   T0EX            ;выход
      BTFSS   PORTB,4            ;скачок, если не нажата кнопка SA3
      GOTO   SA3               ;переход к обработке
      BTFSS   PORTB,2            ;скачок, если не нажата кнопка SA4
      GOTO   SA4               ;переход к обработке
      GOTO   T0EX            ;выход

;обработка нажатия SA3
SA3:   CALL   SA3PR            ;
      GOTO    T0EX            ;
;обработка нажатия SA4
SA4:   CALL   SA4PR            ;
;завершение обработки прерывания
TOEX:   MOVLW   D'60'            ;
      MOVWF    TMR0            ;запись начального значения TMR0
      BCF      INTCON,T0IF         ;сброс бита прерывания
      RETURN

Re: Таймеры и прерывания[PIC16f873A]

Пт дек 06, 2019 22:39:52

Так а что не получилось-то реализовать? Раз уже таймер запустили и настроили прерывания.

Re: Таймеры и прерывания[PIC16f873A]

Пт дек 06, 2019 22:41:20

Я не понимаю как реализовать кнопки, диоды чтобы бегали от середины к краям и обратно, а так же пауза с звуковым сигналом.

Re: Таймеры и прерывания[PIC16f873A]

Пт дек 06, 2019 22:47:06

Вопрос конечно риторический. А вы забивали в гугл как подключить кнопку к МК и программно ее обработать?

Re: Таймеры и прерывания[PIC16f873A]

Пт дек 06, 2019 23:02:23

Я писал программу, с использованием кнопок, диодов, но только с подпрограммой выдержки времени. А сейчас у меня нет представления как связать таймеры с кнопками и диодами.

Re: Таймеры и прерывания[PIC16f873A]

Пт дек 06, 2019 23:17:11

А что тут сложного, к примеру, СТАРТ/ПАУЗА - старт (разрешить прерывания TMR1)/пауза (запретить прерывания TMR1). И делов-то :tea:

Re: Таймеры и прерывания[PIC16f873A]

Пт дек 06, 2019 23:25:40

Вот допустим я написал код(начало вверху)
Код:
SA3PR:   BSF      STAT1,1            ;установка бита состояния
      BCF      STATUS,RP1         ;выбираем банк регистров 1
      BSF      STATUS,RP0         ;|
      MOVLW   D'50'            ;
      MOVWF    PR2               ;
      BCF      STATUS,RP0         ;выбираем банк регистров 0
      CALL   SA3H            ;обработка действий по нажатию кнопки SA3
      CALL   T1S               ;запись начальных значений TMR1
      BCF      T1CON,TMR1ON      ;включение TMR1
      RETURN

;обработка действий по нажатию кнопки SA3
SA3H:   
      BSF      PORTC,1
      BSF      PORTC,3

Как я понимаю, когда я нажму кнопку SA3, программа перейдёт к обработке кнопки SA3, включит 2 диода, после настроит таймер на 0,5 сек, включиться. После того как таймер посчитал он завершит обработку прерывания, и таймер сбросится, правильно?

Re: Таймеры и прерывания[PIC16f873A]

Пт дек 06, 2019 23:35:30

Вы не внимательно читаете даташит. Прерывания будет происходит при каждом переполнении таймера

Re: Таймеры и прерывания[PIC16f873A]

Пт дек 06, 2019 23:47:53

А как собственно сделать так, чтобы я нажал на кнопку SA3, и включились два диода на 0,5 сек. Если Вам не сложно, не могли бы на моём примере, написать код с нажатием кнопки и включением 2 диодов на 0,5 сек с использованием таймера

Re: Таймеры и прерывания[PIC16f873A]

Сб дек 07, 2019 00:09:37

Нет :)). Думайте. У вас в голове нечего не останется, если за вас кто-то будет решать. Так что, "включайте" мозг, "запрягайте" гугл и в перед :). Я ж вам дал рекомендацию, погуглите на счет МК и кнопки. Примеров полно! С большой долей вероятности, вы этого явно не делали...

Re: Таймеры и прерывания[PIC16f873A]

Сб дек 07, 2019 00:15:36

Хорошо, спасибо

Re: Таймеры и прерывания[PIC16f873A]

Сб дек 07, 2019 00:46:21

Дам небольшую подсказку. Задействуйте флаги. Берет ячейку памяти, и вот вам 8 флагов :)

Re: Таймеры и прерывания[PIC16f873A]

Сб дек 07, 2019 09:13:13

Я бы сделал максимально просто и без каши. Таймер по прерыванию формирует системный тик. А по нему синхронизируются все остальные - кнопки, светодиоды, звук.

Re: Таймеры и прерывания[PIC16f873A]

Сб дек 07, 2019 09:45:41

Как я понимаю, когда я нажму кнопку SA3, программа перейдёт

Понимать и думать конечно надо, но и про симулятор не нужно забывать.

Re: Таймеры и прерывания[PIC16f873A]

Сб дек 07, 2019 12:29:50

А вообще, подобная задачка делается и без таймера (и без прерывания).

Re: Таймеры и прерывания[PIC16f873A]

Сб дек 07, 2019 13:11:07

А вообще, подобная задачка делается и без таймера (и без прерывания).

Это да, я делал это без таймеров. Мне задали написать программу с использованием таймеров

Re: Таймеры и прерывания[PIC16f873A]

Сб дек 07, 2019 14:53:05

Ну так я вам логику и привёл выше. А без таймеров это просто delay(T_SYS) и всё.)
Ответить