Занимательная микроэлектроника — страница 111 из 117

rjmp G_cycle  ;зацикливаем программу


;======= конец основного цикла ========

Disable:  ;процедура отключения

sbrc Flag,2  ;если бит1=1, то уже все сделали

rjmp END_dis  ;выход из процедуры

  cli  ;запрещаем прерывания на время установок

sbr Flag,2  ;устанавливаем бит1 Flag

          ;обрываем внешние соединения и обнуляем все порты:

   clr temp

          out PortD,temp

          out PortB,temp

          out DDRD,temp

          out DDRD,temp

    sei  ;разрешаем прерывания

END_dis:

ret  ;конец процедуры отключения выходов

Restore:  ;процедура восстановления

sbrs Flag,2  ;если бит1=0, то уже все остальное сделали

    rjmp end_res  ;выход из процедуры

          ;восстановление

cli  ;запрещаем прерывания на время установок

cbr Flag,2  ;сбрасываем бит1 Flag

          ;восстанавливаем внешние соединения:

   clr temp

          ldi temp,0b01110111  ;порт D разряды 0,1,2,4,5,6 на выход

out DDRD,temp

          ldi temp, 0b11111100  ;порт В все на выход, кроме 0,1

out DDRB,temp

          sei  ;разрешаем прерывания

END_res:

ret  ;конец процедуры восстановления выходов


SEG_SET:  ;процедура установки сегментов

cpi temp,0  ;ищем число, равное temp

  brne ss_0

         rcall OUT_0  ;и посылаем на нужную процедуру вывода сегментов

rjmp END_seg

ss_0:    cpi temp,1

         brne ss_1

         rcall OUT_1

         rjmp END_seg

ss_1:    cpi temp,2

         brne ss_2

         rcall OUT_2

         rjmp END_seg

ss_2:    cpi temp,3

         brne ss_3

         rcall OUT_3

         rjmp END_seg

ss_3:    cpi temp,4

         brne ss_4

         rcall OUT_4

         rjmp END_seg

ss_4:    cpi temp,5

         brne ss_5

         rcall OUT_5

         rjmp END_seg

ss_5:    cpi temp,6

         brne ss 6

         rcall OUT_6

         rjmp END_seg

ss_6:    cpi temp,7

        brne ss_7

        rcall OUT_7

        rjmp END_seg

ss_7:    cpi temp,8

        brne ss_8

        rcall OUT_8

        rjmp END_seg

ss_8:    cpi temp,9

        rcall OUT_9

END_seg:

jret  ;конец процедуры установки сегментов

;процедуры для отображения цифр на семисегментном индикаторе

;ABCDEF(0);ВС(1)/ABDEG(2)/ABCDG(3)/BCFG(4);ACDFG(5)

;ACDEFG(6);ABC(7);ABCDEFG(8);ABCDFG(9)

Out_0:

        sbi PortD,segA

        sbi PortD,segB

        sbi PortB,segC

        sbi PortB,segD

        sbi PortB,segE

        sbi PortB,segF

        ret

OUT_1:

        sbi PortD,segB

        sbi PortB,segC

        ret

OUT_2:

        sbi PortD,segA

        sbi PortD,segB

        sbi PortB,segG

        sbi PortB,segE

        sbi PortB,segD

        ret

OUT_3:

        sbi PortD,segA

        sbi PortD,segB

        sbi PortB,segG

        sbi PortB,segC

        sbi PortB,segD

        ret

OUT_4:

        sbi PortD,segB

        sbi PortB,segC

        sbi PortB,segF

        sbi PortB,segG

        ret

OUT_5:

        sbi PortD,segA

        sbi PortB,segF

        sbi PortB,segG

        sbi PortB,segC

        sbi PortB,segD

        ret

OUT_6:

        sbi PortD,segA

        sbi PortB,segF

        sbi PortB,segG

        sbi PortB,segC

        sbi PortB,segE

        sbi PortB,segD

        ret

OUT_7:

        sbi PortD,segA

        sbi PortD,segB

        sbi PortB,segC

        ret

OUT_8:

        sbi PortD,segA

        sbi PortD,segB

        sbi PortB,segC

        sbi PortB,segD

        sbi PortB,segE

        sbi PortB,segF

        sbi PortB,segG

        ret

OUT_9:

        sbi PortD,segA

        sbi PortD,segB

        sbi PortB,segC

        sbi PortB,segD

        sbi PortB,segF

        sbi PortB,segG

        ret


Программа измерителя температуры и давления

Программа измерителя температуры и давления, описанного в главе 15, приведена в листинге П5.2.

Листинг П5.2

;ATmega853 5 кварц 4000 кГц

.include "m8535def.inc"

;==== Определения и константы ====

;Управление индикацией

.equ segG = 6  ;port С pin 28

.equ segF = 5  ;pin 27

.equ segE = 4  ;pin 26

.equ segD = 3  ;pin 25

.equ segC = 2  ;pin 24

.equ segB = 1  ;pin 23

.equ segA = 0  ;pin 22


.equ RazrTdH = 0  ;PortB,0 pin 1 десятки градуса

.equ RazrTdM = 1  ;PortB,1 pin 2 ед. градусов

.equ RazrTdL = 2  ;PortB,2 pin 3 десятые градусов

.equ RazrPdH = 3  ;PortB,3 pin 4 сотни давления

.equ RazrPdM = 4  ;PortB,4 pin 5 дес. давления

.equ RazrPdL = 5  ;PortB,5 pin 6 ед. давления


;адреса SRAM старший байт адреса SRAM=0x01

.equ Tram =: 0x0  ;0x0,0x1 — старш. и младш. байты температуры АЦП

.equ Pram =: 0x2  ;0x2,0x3 — старш. и младший, байты давления АЦП

.equ TdH = 0x04  ;температура старший дес.

.equ TdM = 0x05  ;темп. средний дес.

.equ TdL = 0x06  ;темп. младший дес.

.equ PdH = 0x07  ;давление старший дес.

.equ PdM = 0x08  ;давление средний дес.

.equ PdL = 0x09  ;давление младший дес.


.equ tZH = 0x20  ;ст. разряд коэффициента Z температуры

.equ tZL = 0x21  ;мл. разряд коэффициента Z температуры

.equ tKH = 0x22  ;ст. разряд коэффициента К температуры

.equ tKL = 0x23  ;мл. разряд коэффициента К температуры

.equ pZH = 0x24  ;ст. разряд коэффициента Z давления

.equ pZL = 0x25  ;мл. разряд коэффициента Z давления

.equ pKH = 0x26  ;ст. разряд коэффициента К давления

.equ pKL = 0x27  ;мл. разряд коэффициента К давления


.equ AtBCDO = 5  ;адрес ResL для процедуры преобразования Bin-Dee

.equ AtBCD2 = 6  ;адрес ResH


;переменные

.def AregH = r2  ;результат измерения hex, старший байт

.def AregL = r3  ;результат измерения hex, младший байт

.def KoeffH = r4  ;коэффициент, старший байт

.def KoeffL = r5  ;коэффициент, младший байт

.def ResL = r6  ;результат упакованный BCD, младший байт

.def ResH = r7  ;результат упакованный BCD, старший байт


.def temp = r16  ;рабочий регистр

.def temp1 = r17  ;вспомогательная переменная

.def temp2 = r18  ;вспомогательная переменная

.def count = r19  ;счетчик преобразований — до 64

.def countCyk = r20  ;счетчик до 32,

.def Flag = r21  ;регистр флагов, биты:

;измерение: 0 — температуры, 1 — давления,

.def cRazr = г22  ;счетчик до 6 мультиплексирования разрядов


;====== прерывания ======

rjmp RESET  ;Reset Handle

        reti  ;IRQ0 Handler

        reti  ;IRQ1 Handler

reti  ;Timer2 Compare Handler

reti  ;Timer2 Overflow Handler

reti  ;Timer1 Capture Handler

reti  ;Timer1 Compare A Handler

reti  ;Timer1 Compare В Handler

reti  ;TIM1_OVF  ;Timer1 Overflow Handler

rjmp TIM0  ;Timer0 Overflow Handler

   reti  ;SPI Transfer Complete Handler

   reti  ;USART RX Complete Handler

reti  ;UDR Empty Handler

   reti  ;USART TX Complete Handler

rjmp readADC  ;reti;ADC  ;ADC Conversion Complete Handler

    reti  ;EEPROM Ready Handler

  reti  ;Analog Comparator Handler

     reti  ;Two-wire Serial Interface Handler

   reti  ;IRQ2 Handler

      reti  ;Timer0 Compare Handler

reti  ;Store Program Memory Ready Handler

;==================

OUT_N:  ;маски цифр

.db

0b00111111,0b0000110,0b01011011,0b01001111,0b01100110,0b01101101, 0b01111101,0b00000111,0b01111111,0b01101111

;seg ABCDEF(0);seg BC(1);seg ABDEG(2);seg ABCDG(3);seg BCFG(4);seg ACDFG(5)

;seg ACDEFG(6);seg ABC(7);seg ABCDEFG(8);seg ABCDFG(9)


TIM0:

;сначала индикация

 inc cRazr  ;счетчик разрядов

   cpi cRazr,6  ;всего б разрядов

brne Set_razr

          clr cRazr  ;если равен 6, очищаем

Set_razr:

          cpi cRazr,0