Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
doc:1201:643.mgul.12013-01_12_01 [2017/02/14 03:10] gotrum |
doc:1201:643.mgul.12013-01_12_01 [2018/04/28 23:47] (текущий) |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | | Александр Викторович,\\ я попробовал добавить текст программы в виде файла,\\ чтобы не загромождать страницу,\\ но dokuwiki ругается на недопустимое расширение файла | | + | |
====Аннотация==== | ====Аннотация==== | ||
Строка 26: | Строка 26: | ||
====Текст программы telemetry_rev1-1.asm==== | ====Текст программы telemetry_rev1-1.asm==== | ||
- | <file asm telemetry_rev1-1.asm> | + | <hidden развернуть> |
- | ;-------------------------------------------------------------------------------------------------------------- | + | <code asm> |
- | ; Program : telemetry_rev1-1 | + | ;---------------------------------------------------- |
- | ; Compiler : AVRA | + | ; Program : telemetry_rev1-1 |
- | ; Chip type : ATmega328P | + | ; Compiler : AVRA |
- | ; System Clock : 16 MHz | + | ; Chip type : ATmega328P |
- | ; Date : 18.01.2017 | + | ; System Clock : 16 MHz |
- | ;-------------------------------------------------------------------------------------------------------------- | + | ; Date : 18.01.2017 |
- | + | ;-------------------------------------------------------------------------------------------------------------- | |
- | ;Подключение библиотек и резервация места под данные | + | |
- | .include "m328Pdef.inc " | + | ;Подключение библиотек и резервация места под данные |
- | + | .include "m328Pdef.inc " | |
- | .dseg | + | |
- | adc_data: | + | .dseg |
- | .byte8 | + | adc_data: |
- | Trm:; Ячейки ОЗУ под показания датчиков DS18B20 | + | .byte8 |
- | .byte14 | + | Trm:; Ячейки ОЗУ под показания датчиков DS18B20 |
- | bmp_temp:; Ячейки ОЗУ под показания темп. датчика BMP180 | + | .byte14 |
- | .byte2 | + | bmp_temp:; Ячейки ОЗУ под показания темп. датчика BMP180 |
- | bmp_pres:; Ячейки ОЗУ под показания давления датчика BMP180 | + | .byte2 |
+ | bmp_pres:; Ячейки ОЗУ под показания давления датчика BMP180 | ||
.byte2 | .byte2 | ||
- | bh_lux: | + | bh_lux: |
- | .byte2 | + | .byte2 |
- | + | ||
- | .cseg | + | .cseg |
- | .include "iterrupts.asm"; Библиотека векторов прерываний | + | .include "iterrupts.asm"; Библиотека векторов прерываний |
- | .include "macr.asm"; Библиотека макросов | + | .include "macr.asm"; Библиотека макросов |
- | .include "twi_lib.asm"; Библиотека работы шины TWI | + | .include "twi_lib.asm"; Библиотека работы шины TWI |
- | .include "hextobcd.asm"; Библиотека перевода чисел в неупаковынный 2-10 код | + | .include "hextobcd.asm"; Библиотека перевода чисел в неупакованный 2-10 код |
- | .include "1wire.asm"; Библиотека 1-wire устройств | + | .include "1wire.asm"; Библиотека 1-wire устройств |
- | ;-------------------------------------------------------------------------------------------------------------- | + | ;-------------------------------------------------------------------------------------------------------------- |
- | + | ||
- | RESET: | + | RESET: |
- | + | ||
- | ;Начальная_инициализация | + | ;Начальная_инициализация |
- | ;-------------------------------------------------------------------------------------------------------------- | + | ;-------------------------------------------------------------------------------------------------------------- |
- | + | ||
- | ldi R16, Low(RAMEND); Инициализация стека | + | ldi R16, Low(RAMEND); Инициализация стека |
- | outSPL, R16 | + | out SPL, R16 |
- | ldiR16, High(RAMEND) | + | ldi R16, High(RAMEND) |
- | out SPH, R16 | + | out SPH, R16 |
- | + | ||
- | .deftry = r21 | + | .def try = r21 |
- | .deftemp = r16 | + | .def temp = r16 |
- | .def razr1 = r17 | + | .def razr1 = r17 |
- | .def razr2 = r18 | + | .def razr2 = r18 |
- | .def razr3 = r19 | + | .def razr3 = r19 |
- | + | ||
- | + | ||
- | .equ W1_DDR = DDRB ; Присваиваем псевдоним регистрам порта датчиков DS18B20 | + | .equ W1_DDR = DDRB ; Присваиваем псевдоним регистрам порта датчиков DS18B20 |
- | .equ W1_PORT = PORTB | + | .equ W1_PORT = PORTB |
- | .equW1_PIN = PINB | + | .equ W1_PIN = PINB |
- | .equ W1_BIT = 0 ; Бит порта на котором датчики (8 цифровой контакт на плате Ардуино) | + | .equ W1_BIT = 0 ; Бит порта на котором датчики (8 цифровой контакт на плате Ардуино) |
- | + | ||
- | .equ FREQ = 16000000 ; Частота процессора | + | .equ FREQ = 16000000 ; Частота процессора |
- | .equ baudrate = 38400; Расчитываем делитель бодрейта для UART | + | .equ baudrate = 38400; Рассчитываем делитель бодрейта для UART |
- | .equ bauddivider = FREQ/(16*baudrate)-1 | + | .equ bauddivider = FREQ/(16*baudrate)-1 |
- | .equFreqSCL = 200000; Расчитываем частоту работы шины TWI | + | .equ FreqSCL = 200000; Рассчитываем частоту работы шины TWI |
- | .equFreqTWBR = ((FREQ/FreqSCL)-16)/2 | + | .equ FreqTWBR = ((FREQ/FreqSCL)-16)/2 |
- | + | ||
- | ldi R16, low(bauddivider); Инициализация UART | + | ldi R16, low(bauddivider); Инициализация UART |
- | sts UBRR0L,R16 | + | sts UBRR0L,R16 |
- | ldi R16, high(bauddivider) | + | ldi R16, high(bauddivider) |
- | sts UBRR0H,R16 | + | sts UBRR0H,R16 |
- | + | ||
- | ldi R16,0 | + | ldi R16,0 |
- | sts UCSR0A, R16 | + | sts UCSR0A, R16 |
- | sts UCSR0B, R16 | + | sts UCSR0B, R16 |
- | sts UCSR0C, R16 | + | sts UCSR0C, R16 |
- | + | ||
- | LDI R16, (1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0) | + | LDI R16, (1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0) |
- | sts UCSR0B, R16 | + | sts UCSR0B, R16 |
- | ldi r16,0 | + | ldi r16,0 |
- | + | ||
- | LDI R16, (0<<USBS0)|(0<<UMSEL0)|(0<<UMSEL1)|(1<<UCSZ00)|(1<<UCSZ01) | + | LDI R16, (0<<USBS0)|(0<<UMSEL0)|(0<<UMSEL1)|(1<<UCSZ00)|(1<<UCSZ01) |
- | sts UCSR0C, R16 | + | sts UCSR0C, R16 |
- | + | ||
- | + | ||
- | ldi r16,0b01000000; Инициализация АЦП | + | ldi r16,0b01000000; Инициализация АЦП |
- | sts ADMUX,r16 | + | sts ADMUX,r16 |
- | ldi r16,0b11011111 | + | ldi r16,0b11011111 |
- | sts ADCSRA,r16 | + | sts ADCSRA,r16 |
- | ldi r25,0 | + | ldi r25,0 |
- | + | ||
- | rcall W1_Sbros; Сбрасываем шину 1-Wire | + | rcall W1_Sbros; Сбрасываем шину 1-Wire |
- | rcall W1_Init_12bit; Перестраиваем конфигурационный байт на 12 битную схему работы | + | rcall W1_Init_12bit; Перестраиваем конфигурационный байт на 12 битную схему работы |
- | rcall W1_Sbros; Вновь сбрасываем | + | rcall W1_Sbros; Вновь сбрасываем |
- | + | ||
- | ldi r16,0b00000101; Инициализация работы прерывания по таймеру для отправки показаний | + | ldi r16,0b00000101; Инициализация работы прерывания по таймеру для отправки показаний |
- | sts TCCR2B,r16; датчиков DS18B20 по шине 1-Wire | + | sts TCCR2B,r16; датчиков DS18B20 по шине 1-Wire |
- | ldi r16,0b00000001 | + | ldi r16,0b00000001 |
- | sts TIMSK2,r16 | + | sts TIMSK2,r16 |
- | sts TIFR2,r16 | + | sts TIFR2,r16 |
- | ldi r16,0xF0 | + | ldi r16,0xF0 |
- | sts TCNT2,r16 | + | sts TCNT2,r16 |
- | + | ||
- | ldi r16,0b00000101; Инициализация работы прерывания по таймеру для отправки показаний | + | ldi r16,0b00000101; Инициализация работы прерывания по таймеру для отправки показаний |
- | sts TCCR1B,r16; датчиков DS18B20 по шине 1-Wire | + | sts TCCR1B,r16; датчиков DS18B20 по шине 1-Wire |
- | ldi r16,0b00000001 | + | ldi r16,0b00000001 |
- | sts TIMSK1,r16 | + | sts TIMSK1,r16 |
- | sts TIFR1,r16 | + | sts TIFR1,r16 |
- | ldi r16,0xA0 | + | ldi r16,0xA0 |
- | sts TCNT1H,temp | + | sts TCNT1H,temp |
- | sts TCNT1L,temp | + | sts TCNT1L,temp |
- | + | ||
- | ldi R16, 0b00110000; Инициализация шины TWI | + | ldi R16, 0b00110000; Инициализация шины TWI |
out PORTC, R16 | out PORTC, R16 | ||
- | ldi r16,FreqTWBR | + | ldi r16,FreqTWBR |
- | sts TWBR,r16 | + | sts TWBR,r16 |
- | ldi r16,0x00 | + | ldi r16,0x00 |
- | sts TWSR,r16 | + | sts TWSR,r16 |
+ | |||
+ | clr try | ||
+ | clr r2 | ||
+ | clr r3 | ||
+ | clr r4 | ||
+ | clr r5 | ||
+ | ldi r24,0x00 | ||
+ | ldi R16, 0b00000000 | ||
+ | out PORTD, R16 | ||
+ | |||
+ | ldi R16, 0b00000100 | ||
+ | out DDRD, R16 | ||
+ | |||
+ | rcall i2c_start | ||
+ | ldi r16,0x46; Если нет, то остаемся этой процедуре | ||
+ | rcall i2c_send | ||
+ | ldi r16,0x11 | ||
+ | rcall i2c_send | ||
+ | rcall i2c_stop | ||
+ | sei; Разрешаем прерывания | ||
+ | rjmp main | ||
+ | ;-------------------------------------------------------------------------------------------------------------- | ||
+ | ;Конец_начальной_инициализации | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ;Основная_подпрограмма | ||
+ | ;-------------------------------------------------------------------------------------------------------------- | ||
+ | |||
+ | |||
+ | main: | ||
+ | cli; Запрещаем прерывания в основном цикле | ||
+ | push r | ||
+ | mov r17,r5 | ||
+ | mov r16,r4 | ||
+ | rcall bin2ASCII15 | ||
+ | mov r17,r3 | ||
+ | mov r16,r2 | ||
+ | rcall bin2ASCII15 | ||
+ | popr | ||
+ | tabulate | ||
+ | |||
+ | rcall W1_ConvTemp; Говорим датчикам конвертировать температуры | ||
+ | |||
+ | push r16 | ||
+ | lds r16,bh_lux+1 | ||
+ | cpi r16,0x82 | ||
+ | brlo light | ||
+ | brsh no_light | ||
+ | light: | ||
+ | lds r16,bh_lux | ||
+ | cpi r16,0x01 | ||
+ | brsh light_exit | ||
+ | ldi r16,0b00000100 | ||
+ | out PORTD,r16 | ||
+ | jmp light_exit | ||
+ | no_light: | ||
+ | ldi r16,0b00000000 | ||
+ | out PORTD,r16 | ||
+ | jmp light_exit | ||
+ | light_exit: | ||
+ | |||
+ | pop r16 | ||
+ | ldi ZL, LOW(adc_data); Производим косвенную адресацию на показания АЦП, чтобы потом их | ||
+ | ldi ZH, HIGH(adc_data); последовательно отправить по UART | ||
+ | clr r20 | ||
+ | print_adc:; Цикл отправки показаний АЦП | ||
+ | inc r20 | ||
+ | push r | ||
+ | ld r17,Z | ||
+ | adiw ZH:ZL,1 | ||
+ | ld r16,Z | ||
+ | adiw ZH:ZL,1 | ||
+ | rcall bin2ASCII15 | ||
+ | popr | ||
+ | tabulate | ||
+ | cpi r20,4 | ||
+ | brne print_adc; Закончили цикл | ||
+ | tabulate | ||
+ | |||
+ | push r | ||
+ | lds r17,bmp_temp; Выводим показания датчика BMP180 | ||
+ | lds r16,bmp_temp+1 | ||
+ | rcall bin2ASCII15 | ||
+ | tabulate | ||
+ | lds r17,bmp_pres | ||
+ | lds r16,bmp_pres+1 | ||
+ | rcall bin2ASCII15 | ||
+ | tabulate | ||
+ | lds r17,bh_lux | ||
+ | lds r16,bh_lux+1 | ||
+ | rcall bin2ASCII15 | ||
+ | popr | ||
+ | |||
+ | inc r24; Увеличили счетчик кадров и отправили его значение по UART | ||
+ | newline | ||
+ | |||
+ | rcall i2c_start | ||
+ | ldi r16,0x47 | ||
+ | rcall i2c_send | ||
+ | rcall i2c_receive | ||
+ | sts bh_lux,r16 | ||
+ | rcall i2c_receive_last | ||
+ | sts bh_lux+1,r16 | ||
+ | rcall i2c_stop | ||
+ | sei; Разрешили прерывания, чтобы микроконтроллер смог обработать | ||
+ | ; новые показания АПЦ, термометров и датчика BMP180 | ||
+ | rcall i2c_start | ||
+ | rjmp main | ||
+ | |||
+ | ;-------------------------------------------------------------------------------------------------------------- | ||
+ | ;Конец_основной_подпрограммы | ||
+ | |||
+ | ;Прерывание_АЦП | ||
+ | ;-------------------------------------------------------------------------------------------------------------- | ||
+ | adc_conv: | ||
+ | cli; Запрещаем прерывания | ||
+ | |||
+ | lds r17,ADCL; Снимаем показания сделанные во время нашего отсутствия в прерывании | ||
+ | lds r18,ADCH | ||
+ | cpi r25,0; Смотрим, какое число содержится в r25 | ||
+ | breq adc0; Переходим по метке для этого числа | ||
+ | cpi r25,1 | ||
+ | breq adc1 | ||
+ | cpi r25,2 | ||
+ | breq adc2 | ||
+ | cpi r25,3 | ||
+ | breq adc3 | ||
+ | cpi r25,4 | ||
+ | breq adc4 | ||
+ | |||
+ | adc0: | ||
+ | sts adc_data+6,r18; Записываем снятые в начале показания АЦП | ||
+ | sts adc_data+7,r17 | ||
+ | ldi r16,0b01000000; Запускаем новое преобразования в зависимости от пина АЦП | ||
+ | sts ADMUX,r16 | ||
+ | rjmp adc_ex; Переходим на выход | ||
+ | |||
+ | adc1: | ||
+ | sts adc_data,r18 | ||
+ | sts adc_data+1,r17 | ||
+ | ldi r16,0b01000001 | ||
+ | sts ADMUX,r16 | ||
+ | rjmp adc_ex | ||
+ | |||
+ | adc2: | ||
+ | sts adc_data+2,r18 | ||
+ | sts adc_data+3,r17 | ||
+ | ldi r16,0b01000010 | ||
+ | sts ADMUX,r16 | ||
+ | rjmp adc_ex | ||
+ | |||
+ | adc3: | ||
+ | sts adc_data+4,r18 | ||
+ | sts adc_data+5,r17 | ||
+ | ldi r16,0b01000011 | ||
+ | sts ADMUX,r16 | ||
+ | rjmp adc_ex | ||
+ | |||
+ | adc4: | ||
+ | clr r25; Если r25 = 4, очищаем его и прыгаем на adc0 | ||
+ | rjmp adc0 | ||
+ | |||
+ | adc_ex:ldi r16,0b11011111; Каждый раз повторно инициализируем АЦП | ||
+ | sts ADCSRA,r16 | ||
+ | inc r25 | ||
+ | sei | ||
+ | reti | ||
+ | ;-------------------------------------------------------------------------------------------------------------- | ||
+ | ;Конец_прерывания_АЦП | ||
+ | |||
+ | |||
+ | ;Прерывание_таймера1 | ||
+ | ;-------------------------------------------------------------------------------------------------------------- | ||
+ | W1_timer: | ||
+ | cli | ||
+ | |||
+ | ldi r16,0x54 | ||
+ | check1 r16 | ||
+ | tabulate | ||
+ | rcall W1_Sbros; Сбрасываем шину и проверяем есть ли датчик | ||
+ | ldi YL, LOW(Trm) | ||
+ | ldi YH, HIGH(Trm) | ||
+ | ldi ZL,LOW(Addr1*2) | ||
+ | ldi ZH,HIGH(Addr1*2) | ||
+ | rcall W1_ReadMem; Читаем в ОЗУ текущую температуру | ||
+ | ldi ZL,LOW(Addr2*2) | ||
+ | ldi ZH,HIGH(Addr2*2) | ||
+ | rcall W1_ReadMem | ||
+ | ldi ZL,LOW(Addr3*2) | ||
+ | ldi ZH,HIGH(Addr3*2) | ||
+ | rcall W1_ReadMem | ||
+ | ldi ZL,LOW(Addr4*2) | ||
+ | ldi ZH,HIGH(Addr4*2) | ||
+ | rcall W1_ReadMem | ||
+ | ldi ZL,LOW(Addr5*2) | ||
+ | ldi ZH,HIGH(Addr5*2) | ||
+ | rcall W1_ReadMem | ||
+ | ldi ZL,LOW(Addr6*2) | ||
+ | ldi ZH,HIGH(Addr6*2) | ||
+ | rcall W1_ReadMem | ||
+ | ldi ZL,LOW(Addr7*2) | ||
+ | ldi ZH,HIGH(Addr7*2) | ||
+ | rcall W1_ReadMem | ||
+ | push f; На всякий случай отправляем в стек SREG | ||
+ | ldi ZL, LOW(Trm); Делаем косвенную адресацию на массив данных температуры датчиков DS18B20 | ||
+ | ldi ZH, HIGH(Trm) | ||
+ | clr r20 | ||
+ | print1:; Цикл печати данных | ||
+ | inc r20 | ||
+ | push r | ||
+ | ld r16,Z | ||
+ | adiwZH:ZL,1 | ||
+ | ld r17,Z | ||
+ | adiwZH:ZL,1 | ||
+ | rcall bin2ASCII15 | ||
+ | tabulate | ||
+ | popr | ||
+ | cpi r20,7 | ||
+ | |||
+ | brne print1 | ||
+ | newline | ||
+ | ; Задаем число с которого таймер начнет считать до следующего прерывания | ||
+ | ldi r22,0xA0 | ||
+ | sts TCNT1H,r22 | ||
+ | sts TCNT1L,r22 | ||
+ | popf; Возвращаем SREG из стека | ||
+ | sei; Разрешаем прерывания | ||
+ | reti | ||
+ | |||
+ | ;-------------------------------------------------------------------------------------------------------------- | ||
+ | ;Конец_прерывания_таймера1 | ||
+ | |||
+ | ;Прерывание_таймера0 | ||
+ | ;-------------------------------------------------------------------------------------------------------------- | ||
+ | Board_timer: | ||
+ | cli | ||
+ | |||
+ | push f | ||
+ | mov r16,r2 | ||
+ | |||
+ | cpi r16,0xFF | ||
+ | breq r2cap | ||
+ | inc r2 | ||
+ | jmp btim_exit | ||
+ | r2cap: | ||
+ | clr r2 | ||
+ | mov r16,r3 | ||
+ | cpi r16,0xFF | ||
+ | breq r3cap | ||
+ | inc r3 | ||
+ | jmp btim_exit | ||
+ | r3cap: | ||
+ | clr r3 | ||
+ | mov r16,r4 | ||
+ | cpi r16,0xFF | ||
+ | breq r4cap | ||
+ | inc r4 | ||
+ | jmp btim_exit | ||
+ | r4cap: | ||
+ | clr r4 | ||
+ | mov r16,r5 | ||
+ | cpi r16,0xFF | ||
+ | breq r5cap | ||
+ | jmp btim_exit | ||
+ | inc r5 | ||
+ | r5cap: | ||
+ | clr r5 | ||
+ | jmp btim_exit | ||
+ | |||
+ | btim_exit: | ||
+ | ldi r22,0xE9 | ||
+ | sts TCNT2,r22 | ||
+ | popf | ||
+ | sei | ||
+ | reti | ||
+ | |||
+ | ;-------------------------------------------------------------------------------------------------------------- | ||
+ | ;Конец_прерывания_таймера0 | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ;Прерывание_TWI | ||
+ | ;-------------------------------------------------------------------------------------------------------------- | ||
+ | TWI_int: | ||
+ | cli; Запрещаем прерывания | ||
+ | push r16; Отправляем в стек r16 | ||
+ | lds r16,TWSR; Сравниваем Статус-регистр TWI | ||
+ | andi r16,0xF8 | ||
+ | cpi r16,0x08; Если он равен 0x08, то нам надо запустить вычисление | ||
+ | breq TWI_start_samples_1 | ||
+ | cpi r16,0x10; Если он равен 0х10, то нам надо считывать показания | ||
+ | breq TWI_read_samples_1 | ||
+ | TWI_exit:popr16; Возвращаем r16 из стека | ||
+ | sei; Разрешаем прерывания | ||
+ | reti | ||
+ | |||
+ | TWI_start_samples_1:; Запускаем вычисление некомпенсированной температуры | ||
+ | ; Проверяем содержимое переменной try | ||
+ | cpi try,1; Если 1, то прыгаем на запуск вычисления давления | ||
+ | breq TWI_start_samples_2 | ||
+ | ldi r16,0xEE; Если нет, то остаемся этой процедуре | ||
+ | rcall i2c_send | ||
+ | |||
+ | ldi r16,0xF4 | ||
+ | rcall i2c_send | ||
+ | |||
+ | ldi r16,0x2E | ||
+ | rcall i2c_send | ||
+ | rcall i2c_start | ||
+ | rjmp TWI_exit | ||
+ | |||
+ | TWI_start_samples_2:; Запускаем вычисление некомпенсированного давления | ||
+ | ldi r16,0xEE | ||
+ | rcall i2c_send | ||
+ | |||
+ | ldi r16,0xF4 | ||
+ | rcall i2c_send | ||
+ | |||
+ | ldi r16,0x34 | ||
+ | rcall i2c_send | ||
+ | rcall i2c_start | ||
+ | rjmp TWI_exit | ||
+ | TWI_read_samples_1:; Считываем показания некомпенсированной температуры | ||
+ | ; Снова проверяем try | ||
+ | cpi try,1 | ||
+ | breq TWI_read_samples_2 | ||
+ | ldi r16,0xEE | ||
+ | rcall i2c_send | ||
+ | |||
+ | ldi r16,0xF6 | ||
+ | rcall i2c_send | ||
+ | |||
+ | rcall i2c_start | ||
+ | |||
+ | ldi r16,0xEF | ||
+ | rcall i2c_send | ||
+ | |||
+ | rcall i2c_receive | ||
+ | sts bmp_temp,r16 | ||
+ | rcall i2c_receive_last | ||
+ | sts bmp_temp+1,r16 | ||
+ | ldi try,0b00000001 | ||
+ | rcall i2c_stop | ||
+ | rjmp TWI_exit | ||
+ | TWI_read_samples_2: | ||
+ | ldi r16,0xEE | ||
+ | rcall i2c_send | ||
+ | |||
+ | ldi r16,0xF6 | ||
+ | rcall i2c_send | ||
+ | |||
+ | rcall i2c_start | ||
+ | |||
+ | ldi r16,0xEF | ||
+ | rcall i2c_send | ||
+ | |||
+ | rcall i2c_receive | ||
+ | sts bmp_pres,r16 | ||
+ | rcall i2c_receive_last | ||
+ | sts bmp_pres+1,r16 | ||
+ | ldi try,0b00000000; Уменьшаем try до 0 | ||
+ | rcall i2c_stop | ||
+ | rjmp TWI_exit | ||
+ | ;-------------------------------------------------------------------------------------------------------------- | ||
+ | ;Конец_прерывания_TWI | ||
+ | |||
+ | |||
+ | Addr1:.db0x28,0xFF,0x41,0x3,0xA3,0x15,0x1,0xBB; Адреса датчиков DS18B20 | ||
+ | Addr2:.db0x28,0xFF,0xE2,0x1A,0xA2,0x15,0x4,0xF9 | ||
+ | Addr3:.db0x28,0xFF,0x91,0xF,0xA3,0x15,0x4,0xC8 | ||
+ | Addr4:.db0x28,0xFF,0x90,0x82,0xA3,0x15,0x4,0x41 | ||
+ | Addr5:.db0x28,0xFF,0xC6,0xB,0xA3,0x15,0x4,0x2 | ||
+ | Addr6:.db0x28,0xFF,0x9,0x5D,0xA3,0x15,0x4,0x9E | ||
+ | Addr7:.db0x28,0xFF,0x7F,0x83,0xA3,0x15,0x4,0x7B | ||
+ | |||
+ | |||
+ | |||
+ | Delay: ; Стандартная задержка | ||
+ | push f | ||
+ | ldi razr1, 50 | ||
+ | ldi razr2, 10 | ||
+ | Pdelay: | ||
+ | dec razr1 | ||
+ | brne Pdelay | ||
+ | dec razr2 | ||
+ | brne Pdelay | ||
+ | popf | ||
+ | ret | ||
+ | Delay1: ; Стандартная задержка 1 | ||
+ | push f | ||
+ | ldi razr1, 50 | ||
+ | ldi razr2, 50 | ||
+ | ldi razr3, 1 | ||
+ | Pdelay1: | ||
+ | dec razr1 | ||
+ | brne Pdelay1 | ||
+ | dec razr2 | ||
+ | brne Pdelay1 | ||
+ | dec razr3 | ||
+ | brne Pdelay1 | ||
+ | popf | ||
+ | ret | ||
+ | </code> | ||
+ | </hidden> | ||
- | clr try | + | \\ |
- | clr r2 | + | |
- | clr r3 | + | |
- | clr r4 | + | |
- | clr r5 | + | |
- | ldi r24,0x00 | + | |
- | ldi R16, 0b00000000 | + | |
- | out PORTD, R16 | + | |
- | + | ||
- | ldi R16, 0b00000100 | + | |
- | out DDRD, R16 | + | |
- | + | ||
- | rcall i2c_start | + | |
- | ldi r16,0x46; Если нет, то остаемся этой процедуре | + | |
- | rcall i2c_send | + | |
- | ldi r16,0x11 | + | |
- | rcall i2c_send | + | |
- | rcall i2c_stop | + | |
- | sei; Разрешаем прерывания | + | |
- | rjmp main | + | |
- | ;-------------------------------------------------------------------------------------------------------------- | + | |
- | ;Конец_начальной_инициализации | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | ;Основная_подпрограмма | + | |
- | ;-------------------------------------------------------------------------------------------------------------- | + | |
- | + | ||
- | + | ||
- | main: | + | |
- | cli; Запрещаем прерывания в основном цикле | + | |
- | push r | + | |
- | mov r17,r5 | + | |
- | mov r16,r4 | + | |
- | rcall bin2ASCII15 | + | |
- | mov r17,r3 | + | |
- | mov r16,r2 | + | |
- | rcall bin2ASCII15 | + | |
- | popr | + | |
- | tabulate | + | |
- | + | ||
- | rcall W1_ConvTemp; Говорим датчикам конвертировать температуры | + | |
- | + | ||
- | push r16 | + | |
- | lds r16,bh_lux+1 | + | |
- | cpi r16,0x82 | + | |
- | brlo light | + | |
- | brsh no_light | + | |
- | light: | + | |
- | lds r16,bh_lux | + | |
- | cpi r16,0x01 | + | |
- | brsh light_exit | + | |
- | ldi r16,0b00000100 | + | |
- | out PORTD,r16 | + | |
- | jmp light_exit | + | |
- | no_light: | + | |
- | ldi r16,0b00000000 | + | |
- | out PORTD,r16 | + | |
- | jmp light_exit | + | |
- | light_exit: | + | |
- | + | ||
- | pop r16 | + | |
- | ldi ZL, LOW(adc_data); Производим косвенную адресацию на показания АЦП, чтобы потом их | + | |
- | ldi ZH, HIGH(adc_data); последовательно отправить по UART | + | |
- | clr r20 | + | |
- | print_adc:; Цикл отправки показаний АЦП | + | |
- | inc r20 | + | |
- | push r | + | |
- | ld r17,Z | + | |
- | adiw ZH:ZL,1 | + | |
- | ld r16,Z | + | |
- | adiw ZH:ZL,1 | + | |
- | rcall bin2ASCII15 | + | |
- | popr | + | |
- | tabulate | + | |
- | cpi r20,4 | + | |
- | brne print_adc; Закончили цикл | + | |
- | tabulate | + | |
- | + | ||
- | push r | + | |
- | lds r17,bmp_temp; Выводим показания датчика BMP180 | + | |
- | lds r16,bmp_temp+1 | + | |
- | rcall bin2ASCII15 | + | |
- | tabulate | + | |
- | lds r17,bmp_pres | + | |
- | lds r16,bmp_pres+1 | + | |
- | rcall bin2ASCII15 | + | |
- | tabulate | + | |
- | lds r17,bh_lux | + | |
- | lds r16,bh_lux+1 | + | |
- | rcall bin2ASCII15 | + | |
- | popr | + | |
- | + | ||
- | inc r24; Увеличили счетчик кадров и отправили его значение по UART | + | |
- | newline | + | |
- | + | ||
- | rcall i2c_start | + | |
- | ldi r16,0x47 | + | |
- | rcall i2c_send | + | |
- | rcall i2c_receive | + | |
- | sts bh_lux,r16 | + | |
- | rcall i2c_receive_last | + | |
- | sts bh_lux+1,r16 | + | |
- | rcall i2c_stop | + | |
- | sei; Разрешили прерывания, чтобы микроконтроллер смог обработать | + | |
- | ; новые показания АПЦ, термометров и датчика BMP180 | + | |
- | rcall i2c_start | + | |
- | rjmp main | + | |
- | + | ||
- | ;-------------------------------------------------------------------------------------------------------------- | + | |
- | ;Конец_основной_подпрограммы | + | |
- | + | ||
- | ;Прерывание_АЦП | + | |
- | ;-------------------------------------------------------------------------------------------------------------- | + | |
- | adc_conv: | + | |
- | cli; Запрещаем прерывания | + | |
- | + | ||
- | lds r17,ADCL; Снимаем показания сделанные во время нашего отсутствия в прерывании | + | |
- | lds r18,ADCH | + | |
- | cpi r25,0; Смотрим, какое число содержится в r25 | + | |
- | breq adc0; Переходим по метке для этого числа | + | |
- | cpi r25,1 | + | |
- | breq adc1 | + | |
- | cpi r25,2 | + | |
- | breq adc2 | + | |
- | cpi r25,3 | + | |
- | breq adc3 | + | |
- | cpi r25,4 | + | |
- | breq adc4 | + | |
- | + | ||
- | adc0: | + | |
- | sts adc_data+6,r18; Записываем снятые в начале показания АЦП | + | |
- | sts adc_data+7,r17 | + | |
- | ldi r16,0b01000000; Запускаем новое преобразования в зависимости от пина АЦП | + | |
- | sts ADMUX,r16 | + | |
- | rjmp adc_ex; Переходим на выход | + | |
- | + | ||
- | adc1: | + | |
- | sts adc_data,r18 | + | |
- | sts adc_data+1,r17 | + | |
- | ldi r16,0b01000001 | + | |
- | sts ADMUX,r16 | + | |
- | rjmp adc_ex | + | |
- | + | ||
- | adc2: | + | |
- | sts adc_data+2,r18 | + | |
- | sts adc_data+3,r17 | + | |
- | ldi r16,0b01000010 | + | |
- | sts ADMUX,r16 | + | |
- | rjmp adc_ex | + | |
- | + | ||
- | adc3: | + | |
- | sts adc_data+4,r18 | + | |
- | sts adc_data+5,r17 | + | |
- | ldi r16,0b01000011 | + | |
- | sts ADMUX,r16 | + | |
- | rjmp adc_ex | + | |
- | + | ||
- | adc4: | + | |
- | clr r25; Если r25 = 4, очищаем его и прыгаем на adc0 | + | |
- | rjmp adc0 | + | |
- | + | ||
- | adc_ex:ldi r16,0b11011111; Каждый раз повторно инициализируем АЦП | + | |
- | sts ADCSRA,r16 | + | |
- | inc r25 | + | |
- | sei | + | |
- | reti | + | |
- | ;-------------------------------------------------------------------------------------------------------------- | + | |
- | ;Конец_прерывания_АЦП | + | |
- | + | ||
- | + | ||
- | ;Прерывание_таймера1 | + | |
- | ;-------------------------------------------------------------------------------------------------------------- | + | |
- | W1_timer: | + | |
- | cli | + | |
- | + | ||
- | ldi r16,0x54 | + | |
- | check1 r16 | + | |
- | tabulate | + | |
- | rcall W1_Sbros; Сбрасываем шину и проверяем есть ли датчик | + | |
- | ldi YL, LOW(Trm) | + | |
- | ldi YH, HIGH(Trm) | + | |
- | ldi ZL,LOW(Addr1*2) | + | |
- | ldi ZH,HIGH(Addr1*2) | + | |
- | rcall W1_ReadMem; Читаем в ОЗУ текущую температуру | + | |
- | ldi ZL,LOW(Addr2*2) | + | |
- | ldi ZH,HIGH(Addr2*2) | + | |
- | rcall W1_ReadMem | + | |
- | ldi ZL,LOW(Addr3*2) | + | |
- | ldi ZH,HIGH(Addr3*2) | + | |
- | rcall W1_ReadMem | + | |
- | ldi ZL,LOW(Addr4*2) | + | |
- | ldi ZH,HIGH(Addr4*2) | + | |
- | rcall W1_ReadMem | + | |
- | ldi ZL,LOW(Addr5*2) | + | |
- | ldi ZH,HIGH(Addr5*2) | + | |
- | rcall W1_ReadMem | + | |
- | ldi ZL,LOW(Addr6*2) | + | |
- | ldi ZH,HIGH(Addr6*2) | + | |
- | rcall W1_ReadMem | + | |
- | ldi ZL,LOW(Addr7*2) | + | |
- | ldi ZH,HIGH(Addr7*2) | + | |
- | rcall W1_ReadMem | + | |
- | push f; На всякий случай отправляем в стек SREG | + | |
- | ldi ZL, LOW(Trm); Делаем косвенную адресацию на массив данных температуры датчиков DS18B20 | + | |
- | ldi ZH, HIGH(Trm) | + | |
- | clr r20 | + | |
- | print1:; Цикл печати данных | + | |
- | inc r20 | + | |
- | push r | + | |
- | ld r16,Z | + | |
- | adiwZH:ZL,1 | + | |
- | ld r17,Z | + | |
- | adiwZH:ZL,1 | + | |
- | rcall bin2ASCII15 | + | |
- | tabulate | + | |
- | popr | + | |
- | cpi r20,7 | + | |
- | + | ||
- | brne print1 | + | |
- | newline | + | |
- | ; Задаем число с которого таймер начнет считать до следующего прерывания | + | |
- | ldi r22,0xA0 | + | |
- | sts TCNT1H,r22 | + | |
- | sts TCNT1L,r22 | + | |
- | popf; Возвращаем SREG из стека | + | |
- | sei; Разрешаем прерывания | + | |
- | reti | + | |
- | + | ||
- | ;-------------------------------------------------------------------------------------------------------------- | + | |
- | ;Конец_прерывания_таймера1 | + | |
- | + | ||
- | ;Прерывание_таймера0 | + | |
- | ;-------------------------------------------------------------------------------------------------------------- | + | |
- | Board_timer: | + | |
- | cli | + | |
- | + | ||
- | push f | + | |
- | mov r16,r2 | + | |
- | + | ||
- | cpi r16,0xFF | + | |
- | breq r2cap | + | |
- | inc r2 | + | |
- | jmp btim_exit | + | |
- | r2cap: | + | |
- | clr r2 | + | |
- | mov r16,r3 | + | |
- | cpi r16,0xFF | + | |
- | breq r3cap | + | |
- | inc r3 | + | |
- | jmp btim_exit | + | |
- | r3cap: | + | |
- | clr r3 | + | |
- | mov r16,r4 | + | |
- | cpi r16,0xFF | + | |
- | breq r4cap | + | |
- | inc r4 | + | |
- | jmp btim_exit | + | |
- | r4cap: | + | |
- | clr r4 | + | |
- | mov r16,r5 | + | |
- | cpi r16,0xFF | + | |
- | breq r5cap | + | |
- | jmp btim_exit | + | |
- | inc r5 | + | |
- | r5cap: | + | |
- | clr r5 | + | |
- | jmp btim_exit | + | |
- | + | ||
- | btim_exit: | + | |
- | ldi r22,0xE9 | + | |
- | sts TCNT2,r22 | + | |
- | popf | + | |
- | sei | + | |
- | reti | + | |
- | + | ||
- | ;-------------------------------------------------------------------------------------------------------------- | + | |
- | ;Конец_прерывания_таймера0 | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | ;Прерывание_TWI | + | |
- | ;-------------------------------------------------------------------------------------------------------------- | + | |
- | TWI_int: | + | |
- | cli; Запрещаем прерывания | + | |
- | push r16; Отправляем в стек r16 | + | |
- | lds r16,TWSR; Сравниваем Статус-регистр TWI | + | |
- | andi r16,0xF8 | + | |
- | cpi r16,0x08; Если он равен 0x08, то нам надо запустить вычисление | + | |
- | breq TWI_start_samples_1 | + | |
- | cpi r16,0x10; Если он равен 0х10, то нам надо считывать показания | + | |
- | breq TWI_read_samples_1 | + | |
- | TWI_exit:popr16; Возвращаем r16 из стека | + | |
- | sei; Разрешаем прерывания | + | |
- | reti | + | |
- | + | ||
- | TWI_start_samples_1:; Запускаем вычисление некомпенсированной температуры | + | |
- | ; Проверяем содержимое переменной try | + | |
- | cpi try,1; Если 1, то прыгаем на запуск вычисления давления | + | |
- | breq TWI_start_samples_2 | + | |
- | ldi r16,0xEE; Если нет, то остаемся этой процедуре | + | |
- | rcall i2c_send | + | |
- | + | ||
- | ldi r16,0xF4 | + | |
- | rcall i2c_send | + | |
- | + | ||
- | ldi r16,0x2E | + | |
- | rcall i2c_send | + | |
- | rcall i2c_start | + | |
- | rjmp TWI_exit | + | |
- | + | ||
- | TWI_start_samples_2:; Запускаем вычисление некомпенсированного давления | + | |
- | ldi r16,0xEE | + | |
- | rcall i2c_send | + | |
- | + | ||
- | ldi r16,0xF4 | + | |
- | rcall i2c_send | + | |
- | + | ||
- | ldi r16,0x34 | + | |
- | rcall i2c_send | + | |
- | rcall i2c_start | + | |
- | rjmp TWI_exit | + | |
- | TWI_read_samples_1:; Считываем показания некомпенсированной температуры | + | |
- | ; Снова проверяем try | + | |
- | cpi try,1 | + | |
- | breq TWI_read_samples_2 | + | |
- | ldi r16,0xEE | + | |
- | rcall i2c_send | + | |
- | + | ||
- | ldi r16,0xF6 | + | |
- | rcall i2c_send | + | |
- | + | ||
- | rcall i2c_start | + | |
- | + | ||
- | ldi r16,0xEF | + | |
- | rcall i2c_send | + | |
- | + | ||
- | rcall i2c_receive | + | |
- | sts bmp_temp,r16 | + | |
- | rcall i2c_receive_last | + | |
- | sts bmp_temp+1,r16 | + | |
- | ldi try,0b00000001 | + | |
- | rcall i2c_stop | + | |
- | rjmp TWI_exit | + | |
- | TWI_read_samples_2: | + | |
- | ldi r16,0xEE | + | |
- | rcall i2c_send | + | |
- | + | ||
- | ldi r16,0xF6 | + | |
- | rcall i2c_send | + | |
- | + | ||
- | rcall i2c_start | + | |
- | + | ||
- | ldi r16,0xEF | + | |
- | rcall i2c_send | + | |
- | + | ||
- | rcall i2c_receive | + | |
- | sts bmp_pres,r16 | + | |
- | rcall i2c_receive_last | + | |
- | sts bmp_pres+1,r16 | + | |
- | ldi try,0b00000000; Уменьшаем try до 0 | + | |
- | rcall i2c_stop | + | |
- | rjmp TWI_exit | + | |
- | ;-------------------------------------------------------------------------------------------------------------- | + | |
- | ;Конец_прерывания_TWI | + | |
- | + | ||
- | + | ||
- | Addr1:.db0x28,0xFF,0x41,0x3,0xA3,0x15,0x1,0xBB; Адреса датчиков DS18B20 | + | |
- | Addr2:.db0x28,0xFF,0xE2,0x1A,0xA2,0x15,0x4,0xF9 | + | |
- | Addr3:.db0x28,0xFF,0x91,0xF,0xA3,0x15,0x4,0xC8 | + | |
- | Addr4:.db0x28,0xFF,0x90,0x82,0xA3,0x15,0x4,0x41 | + | |
- | Addr5:.db0x28,0xFF,0xC6,0xB,0xA3,0x15,0x4,0x2 | + | |
- | Addr6:.db0x28,0xFF,0x9,0x5D,0xA3,0x15,0x4,0x9E | + | |
- | Addr7:.db0x28,0xFF,0x7F,0x83,0xA3,0x15,0x4,0x7B | + | |
- | + | ||
- | + | ||
- | + | ||
- | Delay: ; Стандартная задержка | + | |
- | push f | + | |
- | ldi razr1, 50 | + | |
- | ldi razr2, 10 | + | |
- | Pdelay: | + | |
- | dec razr1 | + | |
- | brne Pdelay | + | |
- | dec razr2 | + | |
- | brne Pdelay | + | |
- | popf | + | |
- | ret | + | |
- | Delay1: ; Стандартная задержка 1 | + | |
- | push f | + | |
- | ldi razr1, 50 | + | |
- | ldi razr2, 50 | + | |
- | ldi razr3, 1 | + | |
- | Pdelay1: | + | |
- | dec razr1 | + | |
- | brne Pdelay1 | + | |
- | dec razr2 | + | |
- | brne Pdelay1 | + | |
- | dec razr3 | + | |
- | brne Pdelay1 | + | |
- | popf | + | |
- | ret | + | |
- | + | ||
- | </file> | + | |
====Текст модуля 1wire.asm==== | ====Текст модуля 1wire.asm==== | ||
- | <file asm 1wire.asm> | + | <hidden развернуть> |
- | ;1-wire_подпрограммы | + | <code asm> |
- | ;-------------------------------------------------------------------------------------------------------------- | + | ;1-wire_подпрограммы |
- | + | ;-------------------------------------------------------------------------------------------------------------- | |
- | + | ||
- | W1_Sbros: ; Сброс шины и проверка датчик на месте ли | + | |
- | lds r16, W1_BIT ; Записываем в r16 ножку где датчик | + | W1_Sbros: ; Сброс шины и проверка датчик на месте ли |
- | sbi W1_DDR, W1_BIT ; Ногу на выход | + | lds r16, W1_BIT ; Записываем в r16 ножку где датчик |
- | cbi W1_PORT, W1_BIT ; Опрокидываем вывод на землю | + | sbi W1_DDR, W1_BIT ; Ногу на выход |
- | rcall W1_DelayH ; Задержка 480 мкс, для сброса | + | cbi W1_PORT, W1_BIT ; Опрокидываем вывод на землю |
- | cbi W1_DDR, W1_BIT ; Ногу на вход | + | rcall W1_DelayH ; Задержка 480 мкс, для сброса |
- | rcall W1_DelayI ; Ждем тайм слот 70 мкс | + | cbi W1_DDR, W1_BIT ; Ногу на вход |
- | sbis W1_PIN, W1_BIT ; Пропускаем следующую строку, если бит порта в 1 | + | rcall W1_DelayI ; Ждем тайм слот 70 мкс |
- | ldi r17, 1 ; И установим сигнальный регистр в 1 | + | sbis W1_PIN, W1_BIT ; Пропускаем следующую строку, если бит порта в 1 |
- | sbic W1_PIN, W1_BIT ; Пропускаем следующую строку, если бит порта в 0 | + | ldi r17, 1 ; И установим сигнальный регистр в 1 |
- | ldi r17, 0 ; И установим сигнальный регистр в 0 | + | sbic W1_PIN, W1_BIT ; Пропускаем следующую строку, если бит порта в 0 |
- | rcall W1_DelayJ ; Ждем тайм слот 410 мкс | + | ldi r17, 0 ; И установим сигнальный регистр в 0 |
- | ret ; Если датчик на месте, в r17 по выходу отсюда будет 1, в противном случае 0 | + | rcall W1_DelayJ ; Ждем тайм слот 410 мкс |
- | + | ret ; Если датчик на месте, в r17 по выходу отсюда будет 1, в противном случае 0 | |
- | W1_Address: | + | |
- | clr r20 | + | W1_Address: |
- | read: | + | clr r20 |
- | inc r20 ; Процедура считывания адреса датчиков DS18B20 | + | read: |
- | in r10,SREG | + | inc r20 ; Процедура считывания адреса датчиков DS18B20 |
- | push r10 | + | in r10,SREG |
- | lpm r16,Z | + | push r10 |
- | rcall ds_byte_wr | + | lpm r16,Z |
- | pop r10 | + | rcall ds_byte_wr |
- | out SREG,r10 | + | pop r10 |
- | adiw ZH:ZL,1 | + | out SREG,r10 |
- | cpi r20,8 | + | adiw ZH:ZL,1 |
- | brne read | + | cpi r20,8 |
- | ret | + | brne read |
- | + | ret | |
- | W1_ReadMem: ; Чтение памяти регистров температуры | + | |
- | ldi r16, 0x55 ; Пошлем команду 0x55, это сравнить уникальный номер датчика | + | W1_ReadMem: ; Чтение памяти регистров температуры |
- | rcall ds_byte_wr ; Так как он у нас один на проводе | + | ldi r16, 0x55 ; Пошлем команду 0x55, это сравнить уникальный номер датчика |
- | rcall W1_Address ; Отправляем адрес датчика | + | rcall ds_byte_wr ; Так как он у нас один на проводе |
- | ldi r16, 0xBE ; Говорим датчику, что мы сейчас будем читать | + | rcall W1_Address ; Отправляем адрес датчика |
- | rcall ds_byte_wr ; Запуливаем байт | + | ldi r16, 0xBE ; Говорим датчику, что мы сейчас будем читать |
- | rcall ds_byte_rd ; А тут уже начинаем читать, прочитали первый | + | rcall ds_byte_wr ; Запуливаем байт |
- | st Y, r16 ; И запулили его в память, по метке Trm | + | rcall ds_byte_rd ; А тут уже начинаем читать, прочитали первый |
- | adiw YH:YL,1 | + | st Y, r16 ; И запулили его в память, по метке Trm |
- | rcall ds_byte_rd ; Читаем второй | + | adiw YH:YL,1 |
- | st Y, r16 ; И запулили его в память, по метке Trm+1 | + | rcall ds_byte_rd ; Читаем второй |
- | adiw YH:YL,1 | + | st Y, r16 ; И запулили его в память, по метке Trm+1 |
- | rcall W1_Sbros ; Сбрасываем шину и проверяем есть ли датчик | + | adiw YH:YL,1 |
- | ;ldi ZL,LOW(Addr2*2) | + | rcall W1_Sbros ; Сбрасываем шину и проверяем есть ли датчик |
- | ;ldi ZH,HIGH(Addr2*2) | + | ;ldi ZL,LOW(Addr2*2) |
- | ;clr r20 | + | ;ldi ZH,HIGH(Addr2*2) |
- | ret | + | ;clr r20 |
- | + | ret | |
- | W1_ConvTemp: ; Подпрограмма конвертирования температуры | + | |
- | ldi r16, 0xCC ; Пропускаем уникальный номер датчика | + | W1_ConvTemp: ; Подпрограмма конвертирования температуры |
- | rcall ds_byte_wr | + | ldi r16, 0xCC ; Пропускаем уникальный номер датчика |
- | ldi r16, 0x44 ; Говорим что надо бы сконвертировать температуру, этот процесс занимает 750 | + | rcall ds_byte_wr |
- | rcall ds_byte_wr ; миллисекунд, поэтому идем что-то делать, или ленится | + | ldi r16, 0x44 ; Говорим что надо бы сконвертировать температуру, этот процесс занимает 750 |
- | ret | + | rcall ds_byte_wr ; миллисекунд, поэтому идем что-то делать, или ленится |
- | + | ret | |
- | W1_Init_12bit: ; Подпрограмма перестройки на 12 бит температуры | + | |
- | ldi r16, 0xCC ; Пропускаем уникальный номер датчика | + | W1_Init_12bit: ; Подпрограмма перестройки на 12 бит температуры |
- | rcall ds_byte_wr ; Спуливаем в датчик | + | ldi r16, 0xCC ; Пропускаем уникальный номер датчика |
- | ldi r16, 0x4E ; Говорим что сейчас будем писать в RAM регистры датчика | + | rcall ds_byte_wr ; Спуливаем в датчик |
- | rcall ds_byte_wr ; Спуливаем в датчик | + | ldi r16, 0x4E ; Говорим что сейчас будем писать в RAM регистры датчика |
- | ldi r16, 0xFF ; 0xFF записываем в первые 2 регистра, это регистры температуры, он нам не | + | rcall ds_byte_wr ; Спуливаем в датчик |
- | rcall ds_byte_wr ; нужен, поэтому их оставляем в стандартном состоянии | + | ldi r16, 0xFF ; 0xFF записываем в первые 2 регистра, это регистры температуры, он нам не |
- | ldi r16, 0xFF ; 0xFF второй байт температуры | + | rcall ds_byte_wr ; нужен, поэтому их оставляем в стандартном состоянии |
- | rcall ds_byte_wr ; Спуливаем на порт | + | ldi r16, 0xFF ; 0xFF второй байт температуры |
- | ldi r16, 0x7F ; А вот тут говорим что 12 бит - 7F, или 1F - 9бит, 3F - 10 бит, 5F - 11 бит | + | rcall ds_byte_wr ; Спуливаем на порт |
- | rcall ds_byte_wr ; Спуливаем на порт | + | ldi r16, 0x7F ; А вот тут говорим что 12 бит - 7F, или 1F - 9бит, 3F - 10 бит, 5F - 11 бит |
- | ret | + | rcall ds_byte_wr ; Спуливаем на порт |
- | + | ret | |
- | ds_byte_rd: ; Подпрограмма чтения данных в регистр r16 с 1 Wire | + | |
- | ldi r17, 8 ; Пишем в r17 - 8, т.к. у нас в бит в регистре | + | ds_byte_rd: ; Подпрограмма чтения данных в регистр r16 с 1 Wire |
- | clr r16 ;Чистим r16, сюда будем читать данные | + | ldi r17, 8 ; Пишем в r17 - 8, т.к. у нас в бит в регистре |
- | ds_byte_rd_0: | + | clr r16 ;Чистим r16, сюда будем читать данные |
- | sbi W1_DDR, W1_BIT ; Вывод на выход | + | ds_byte_rd_0: |
- | cbi W1_PORT, W1_BIT ; Опрокидываем вывод на землю | + | sbi W1_DDR, W1_BIT ; Вывод на выход |
- | rcall W1_DelayA ; Ждем 6 микросекунд | + | cbi W1_PORT, W1_BIT ; Опрокидываем вывод на землю |
- | cbi W1_DDR, W1_BIT ; Вывод на вход | + | rcall W1_DelayA ; Ждем 6 микросекунд |
- | rcall W1_DelayE ; Ждем 9 микросекунд | + | cbi W1_DDR, W1_BIT ; Вывод на вход |
- | sbis W1_PIN, W1_BIT | + | rcall W1_DelayE ; Ждем 9 микросекунд |
- | clc ; Очищаем бит C = 0 | + | sbis W1_PIN, W1_BIT |
- | sbic W1_PIN, W1_BIT | + | clc ; Очищаем бит C = 0 |
- | sec ; Очищаем бит C = 1 | + | sbic W1_PIN, W1_BIT |
- | ror r16 ; Производим циклический сдвиг вправо через С | + | sec ; Очищаем бит C = 1 |
- | rcall W1_DelayF ; Ждем 55 микросекунд | + | ror r16 ; Производим циклический сдвиг вправо через С |
- | dec r17 ;Понижаем на 1 регистр r17 | + | rcall W1_DelayF ; Ждем 55 микросекунд |
- | brne ds_byte_rd_0 ; если не равен 0 вращаемся в цикле | + | dec r17 ;Понижаем на 1 регистр r17 |
- | ret | + | brne ds_byte_rd_0 ; если не равен 0 вращаемся в цикле |
- | + | ret | |
- | ds_byte_wr: ; Подпрограмма записи данных из регистра r16 в датчик | + | |
- | ldi r17, 8 ; Пишем в r17 - 8, т.к. у нас в бит в регистре | + | ds_byte_wr: ; Подпрограмма записи данных из регистра r16 в датчик |
- | ds_byte_wr0: | + | ldi r17, 8 ; Пишем в r17 - 8, т.к. у нас в бит в регистре |
- | sbi W1_DDR, W1_BIT ; Вывод на выход | + | ds_byte_wr0: |
- | cbi W1_PORT, W1_BIT ; Опрокидываем вывод на землю | + | sbi W1_DDR, W1_BIT ; Вывод на выход |
- | sbrc r16, 0 ; Проверим, в r16 бит 0 очищен или установлен | + | cbi W1_PORT, W1_BIT ; Опрокидываем вывод на землю |
- | rjmp ds_byte_write_1 ; Если установлен перейдем по этой метке | + | sbrc r16, 0 ; Проверим, в r16 бит 0 очищен или установлен |
- | rjmp ds_byte_write_0 ; Если очищен перейдем по этой метке | + | rjmp ds_byte_write_1 ; Если установлен перейдем по этой метке |
- | ds_byte_wr1: | + | rjmp ds_byte_write_0 ; Если очищен перейдем по этой метке |
- | lsr r16 ; Логический сдвиг вправо | + | ds_byte_wr1: |
- | dec r17 ; Понижаем r17 на 1 | + | lsr r16 ; Логический сдвиг вправо |
- | brne ds_byte_wr0 ; Если не равен 0, вращаемся в цикле | + | dec r17 ; Понижаем r17 на 1 |
- | ret ; Выход из подпрограммы | + | brne ds_byte_wr0 ; Если не равен 0, вращаемся в цикле |
- | + | ret ; Выход из подпрограммы | |
- | ds_byte_write_0: ; Запись 0 | + | |
- | rcall W1_DelayC ; Ждем 60 микросекунд | + | ds_byte_write_0: ; Запись 0 |
- | cbi W1_DDR, W1_BIT ; Вывод на вход | + | rcall W1_DelayC ; Ждем 60 микросекунд |
- | rcall W1_DelayD ; Ждем 10 микросекунд | + | cbi W1_DDR, W1_BIT ; Вывод на вход |
- | rjmp ds_byte_wr1 | + | rcall W1_DelayD ; Ждем 10 микросекунд |
- | + | rjmp ds_byte_wr1 | |
- | ds_byte_write_1: ; Запись 1 | + | |
- | rcall W1_DelayA ; Ждем 6 микросекунд | + | ds_byte_write_1: ; Запись 1 |
- | cbi W1_DDR, W1_BIT ; Вывод на вход | + | rcall W1_DelayA ; Ждем 6 микросекунд |
- | rcall W1_DelayB ; Ждем 64 микросекунд | + | cbi W1_DDR, W1_BIT ; Вывод на вход |
- | rjmp ds_byte_wr1 | + | rcall W1_DelayB ; Ждем 64 микросекунд |
- | + | rjmp ds_byte_wr1 | |
- | W1_DelayA: ; Задержка 6 mcs | + | |
- | ldi XH, high(FREQ/2000000) | + | W1_DelayA: ; Задержка 6 mcs |
- | ldi XL, low(FREQ/2000000) | + | ldi XH, high(FREQ/2000000) |
- | rcall W1_Delay | + | ldi XL, low(FREQ/2000000) |
- | ret | + | rcall W1_Delay |
- | W1_DelayB: ; Задержка 64 mcs | + | ret |
- | ldi XH, high(FREQ/130000) | + | W1_DelayB: ; Задержка 64 mcs |
- | ldi XL, low(FREQ/130000) | + | ldi XH, high(FREQ/130000) |
- | rcall W1_Delay | + | ldi XL, low(FREQ/130000) |
- | ret | + | rcall W1_Delay |
- | W1_DelayC: ; Задержка 60 mcs | + | ret |
- | ldi XH, high(FREQ/136000) | + | W1_DelayC: ; Задержка 60 mcs |
- | ldi XL, low(FREQ/136000) | + | ldi XH, high(FREQ/136000) |
- | rcall W1_Delay | + | ldi XL, low(FREQ/136000) |
- | ret | + | rcall W1_Delay |
- | W1_DelayD: ; Задержка 10 mcs | + | ret |
- | ldi XH, high(FREQ/1000000) | + | W1_DelayD: ; Задержка 10 mcs |
- | ldi XL, low(FREQ/1000000) | + | ldi XH, high(FREQ/1000000) |
- | rcall W1_Delay | + | ldi XL, low(FREQ/1000000) |
- | ret | + | rcall W1_Delay |
- | W1_DelayE: ; Задержка 9 mcs | + | ret |
- | ldi XH, high(FREQ/1200000) | + | W1_DelayE: ; Задержка 9 mcs |
- | ldi XL, low(FREQ/1200000) | + | ldi XH, high(FREQ/1200000) |
- | rcall W1_Delay | + | ldi XL, low(FREQ/1200000) |
- | ret | + | rcall W1_Delay |
- | W1_DelayF: ; Задержка 55 mcs | + | ret |
- | ldi XH, high(FREQ/150000) | + | W1_DelayF: ; Задержка 55 mcs |
- | ldi XL, low(FREQ/150000) | + | ldi XH, high(FREQ/150000) |
- | rcall W1_Delay | + | ldi XL, low(FREQ/150000) |
- | ret | + | rcall W1_Delay |
- | W1_DelayH: ; Задержка 480 mcs | + | ret |
- | ldi XH, high(FREQ/16664) | + | W1_DelayH: ; Задержка 480 mcs |
- | ldi XL, low(FREQ/16664) | + | ldi XH, high(FREQ/16664) |
- | rcall W1_Delay | + | ldi XL, low(FREQ/16664) |
- | ret | + | rcall W1_Delay |
- | W1_DelayI: ; Задержка 70 mcs | + | ret |
- | ldi XH, high(FREQ/116000) | + | W1_DelayI: ; Задержка 70 mcs |
- | ldi XL, low(FREQ/116000) | + | ldi XH, high(FREQ/116000) |
- | rcall W1_Delay | + | ldi XL, low(FREQ/116000) |
- | ret | + | rcall W1_Delay |
- | W1_DelayJ: ; Задержка 410 mcs | + | ret |
- | ldi XH, high(FREQ/19512) | + | W1_DelayJ: ; Задержка 410 mcs |
- | ldi XL, low(FREQ/19512) | + | ldi XH, high(FREQ/19512) |
- | rcall W1_Delay | + | ldi XL, low(FREQ/19512) |
- | ret | + | rcall W1_Delay |
- | W1_Delay: ; Подпрограмма воспроизведения задержки | + | ret |
- | sbiw XH:XL, 1 ; Вычитаем единицу из регистровой пары | + | W1_Delay: ; Подпрограмма воспроизведения задержки |
- | brne W1_Delay ; Если не равно 0 крутимся в цикле | + | sbiw XH:XL, 1 ; Вычитаем единицу из регистровой пары |
- | ret ; Выход из подпрограммы | + | brne W1_Delay ; Если не равно 0 крутимся в цикле |
- | ;-------------------------------------------------------------------------------------------------------------- | + | ret ; Выход из подпрограммы |
- | ;Конец_1-wire_подпрограмм | + | ;-------------------------------------------------------------------------------------------------------------- |
- | </file> | + | ;Конец_1-wire_подпрограмм |
+ | </code> | ||
+ | </hidden> | ||
+ | \\ | ||
====Текст модуля hextobcd.asm==== | ====Текст модуля hextobcd.asm==== | ||
- | <file asm hextobcd.asm> | + | <hidden развернуть> |
- | .def fASCIIL =r16 | + | <code asm> |
- | .def tASCII0 =r16 | + | .def fASCIIL =r16 |
- | .def fASCIIH =r17 | + | .def tASCII0 =r16 |
- | .def tASCII2 =r25 | + | .def fASCIIH =r17 |
- | .def tASCII3 =r19 | + | .def tASCII2 =r25 |
- | .def tASCII4 =r20 | + | .def tASCII3 =r19 |
- | .def tASCII1 =r21 | + | .def tASCII4 =r20 |
- | .def cnt16a =r21 | + | .def tASCII1 =r21 |
- | .def tmp16a =r22 | + | .def cnt16a =r21 |
- | .def tmp16b =r23 | + | .def tmp16a =r22 |
- | + | .def tmp16b =r23 | |
- | ;***** Код | + | |
- | print_ascii: | + | ;***** Код |
- | check1 r20 | + | print_ascii: |
- | check1 r19 | + | check1 r20 |
- | check1 r25 | + | check1 r19 |
- | check1 r21 | + | check1 r25 |
- | check1 r16 | + | check1 r21 |
- | ret | + | check1 r16 |
- | bin2ASCII15: | + | ret |
- | ldi tmp16a, low(10000) | + | bin2ASCII15: |
- | ldi tmp16b, high(10000) | + | ldi tmp16a, low(10000) |
- | rcall bin2ASCII_digit | + | ldi tmp16b, high(10000) |
- | mov tASCII4, cnt16a | + | rcall bin2ASCII_digit |
- | ldi tmp16a, low(1000) | + | mov tASCII4, cnt16a |
- | ldi tmp16b, high(1000) | + | ldi tmp16a, low(1000) |
- | rcall bin2ASCII_digit | + | ldi tmp16b, high(1000) |
- | mov tASCII3, cnt16a | + | rcall bin2ASCII_digit |
- | ldi tmp16a, low(100) | + | mov tASCII3, cnt16a |
- | ldi tmp16b, high(100) | + | ldi tmp16a, low(100) |
- | rcall bin2ASCII_digit | + | ldi tmp16b, high(100) |
- | mov tASCII2, cnt16a | + | rcall bin2ASCII_digit |
- | ldi tmp16a, low(10) | + | mov tASCII2, cnt16a |
- | ldi tmp16b, high(10) | + | ldi tmp16a, low(10) |
- | rcall bin2ASCII_digit | + | ldi tmp16b, high(10) |
- | ldi r17,0x30 | + | rcall bin2ASCII_digit |
- | add r16,r17 | + | ldi r17,0x30 |
- | add r21,r17 | + | add r16,r17 |
- | add r25,r17 | + | add r21,r17 |
- | add r19,r17 | + | add r25,r17 |
- | add r20,r17 | + | add r19,r17 |
- | rcall print_ascii | + | add r20,r17 |
- | ret | + | rcall print_ascii |
- | bin2ASCII_digit: | + | ret |
- | ldi cnt16a, -1 | + | bin2ASCII_digit: |
- | bin2ASCII_digit_loop: | + | ldi cnt16a, -1 |
- | inc cnt16a | + | bin2ASCII_digit_loop: |
- | sub fASCIIL, tmp16a | + | inc cnt16a |
- | sbc fASCIIH, tmp16b | + | sub fASCIIL, tmp16a |
- | brsh bin2ASCII_digit_loop | + | sbc fASCIIH, tmp16b |
- | add fASCIIL, tmp16a | + | brsh bin2ASCII_digit_loop |
- | adc fASCIIH, tmp16b | + | add fASCIIL, tmp16a |
- | + | adc fASCIIH, tmp16b | |
- | ret | + | |
- | + | ret | |
- | </file> | + | </code> |
+ | </hidden> | ||
+ | \\ | ||
====Текст модуля iterrupts.asm==== | ====Текст модуля iterrupts.asm==== | ||
- | <file asm iterrupts.asm> | + | <hidden развернуть> |
- | ;Векторы_прерываний | + | <code asm> |
- | ;----------------------------------------------------------------------- | + | ;Векторы_прерываний |
- | + | ;----------------------------------------------------------------------- | |
- | .org 0x0000 ; Reset | + | |
- | jmp RESET | + | .org 0x0000 ; Reset |
- | .org 0x0002 ; External Interrupt Request 0 | + | jmp RESET |
- | reti | + | .org 0x0002 ; External Interrupt Request 0 |
- | .org 0x0004 ; External Interrupt Request 1 | + | reti |
- | reti | + | .org 0x0004 ; External Interrupt Request 1 |
- | .org 0x0006 ; Pin Change Interrupt Request 0 | + | reti |
- | reti | + | .org 0x0006 ; Pin Change Interrupt Request 0 |
- | .org 0x0008 ; Pin Change Interrupt Request 1 | + | reti |
- | reti | + | .org 0x0008 ; Pin Change Interrupt Request 1 |
- | .org 0x000A ; Pin Change Interrupt Request 2 | + | reti |
- | reti | + | .org 0x000A ; Pin Change Interrupt Request 2 |
- | .org 0x000C ; Watchdog Time-out Interrupt | + | reti |
- | reti | + | .org 0x000C ; Watchdog Time-out Interrupt |
- | .org 0x000E ; Timer/Counter 2 Compare Match A | + | reti |
- | reti | + | .org 0x000E ; Timer/Counter 2 Compare Match A |
- | .org 0x0010 ; Timer/Counter 2 Compare Match B | + | reti |
- | reti | + | .org 0x0010 ; Timer/Counter 2 Compare Match B |
- | .org 0x0012 ; Timer/Counter 2 Overflow | + | reti |
- | jmp Board_timer | + | .org 0x0012 ; Timer/Counter 2 Overflow |
- | .org 0x0014 ; Timer/Counter 1 Capture Event | + | jmp Board_timer |
- | reti | + | .org 0x0014 ; Timer/Counter 1 Capture Event |
- | .org 0x0016 ; Timer/Counter 1 Compare Match A | + | reti |
- | reti | + | .org 0x0016 ; Timer/Counter 1 Compare Match A |
- | .org 0x0018 ; Timer/Counter 1 Compare Match B | + | reti |
- | reti | + | .org 0x0018 ; Timer/Counter 1 Compare Match B |
- | .org 0x001A ; Timer/Counter 1 Overflow | + | reti |
- | rjmp W1_timer | + | .org 0x001A ; Timer/Counter 1 Overflow |
- | ;reti | + | rjmp W1_timer |
- | .org 0x001C ; Timer/Counter 0 Compare Match A | + | ;reti |
- | reti | + | .org 0x001C ; Timer/Counter 0 Compare Match A |
- | .org 0x001E ; Timer/Counter 0 Compare Match B | + | reti |
- | reti | + | .org 0x001E ; Timer/Counter 0 Compare Match B |
- | .org 0x0020 ; Timer/Counter 0 Overflow | + | reti |
- | reti | + | .org 0x0020 ; Timer/Counter 0 Overflow |
- | .org 0x0022 ; SPI Serial Transfer Complete | + | reti |
- | reti | + | .org 0x0022 ; SPI Serial Transfer Complete |
- | .org 0x0024 ; USART, Rx Complete | + | reti |
- | reti | + | .org 0x0024 ; USART, Rx Complete |
- | .org 0x0026 ; USART, UDR Empty | + | reti |
- | reti | + | .org 0x0026 ; USART, UDR Empty |
- | .org 0x0028 ; USART, Tx Complete | + | reti |
- | reti | + | .org 0x0028 ; USART, Tx Complete |
- | .org 0x002A ; ADC Conversion Complete | + | reti |
- | jmp adc_conv | + | .org 0x002A ; ADC Conversion Complete |
- | .org 0x002C ; EEPROM Ready | + | jmp adc_conv |
- | reti | + | .org 0x002C ; EEPROM Ready |
- | .org 0x002E ; Analog Comparator | + | reti |
- | reti | + | .org 0x002E ; Analog Comparator |
- | .org 0x0030 ; Two-wire Serial Interface | + | reti |
- | jmp TWI_int | + | .org 0x0030 ; Two-wire Serial Interface |
- | ;reti | + | jmp TWI_int |
- | .org 0x0032 ; Store Program Memory Read | + | ;reti |
- | reti | + | .org 0x0032 ; Store Program Memory Read |
- | + | reti | |
- | .org INT_VECTORS_SIZE | + | |
- | </file> | + | .org INT_VECTORS_SIZE |
- | + | </code> | |
+ | </hidden> | ||
+ | \\ | ||
====Текст модуля macr.asm==== | ====Текст модуля macr.asm==== | ||
- | <file asm macr.asm> | + | <hidden развернуть> |
- | + | <code asm> | |
- | ;Макросы | + | ;Макросы |
- | ;----------------------------------------------------------------------- | + | ;----------------------------------------------------------------------- |
- | .macro pushf | + | .macro pushf |
- | push r10 | + | push r10 |
- | in r10,SREG | + | in r10,SREG |
- | push r10 | + | push r10 |
- | .endm | + | .endm |
- | .macro popf | + | .macro popf |
- | pop r10 | + | pop r10 |
- | out SREG,r10 | + | out SREG,r10 |
- | pop r10 | + | pop r10 |
- | .endm | + | .endm |
- | .macro pushr | + | .macro pushr |
- | push r10 | + | push r10 |
- | in r10,SREG | + | in r10,SREG |
- | push r10 | + | push r10 |
- | push r16 | + | push r16 |
- | push r17 | + | push r17 |
- | push r18 | + | push r18 |
- | push r19 | + | push r19 |
- | push r20 | + | push r20 |
- | push r21 | + | push r21 |
- | push r22 | + | push r22 |
- | push r23 | + | push r23 |
- | push r25 | + | push r25 |
- | push r26 | + | push r26 |
- | push r27 | + | push r27 |
- | push r28 | + | push r28 |
- | push r29 | + | push r29 |
- | .endm | + | .endm |
- | .macro popr | + | .macro popr |
- | pop r29 | + | pop r29 |
- | pop r28 | + | pop r28 |
- | pop r27 | + | pop r27 |
- | pop r26 | + | pop r26 |
- | pop r25 | + | pop r25 |
- | pop r23 | + | pop r23 |
- | pop r22 | + | pop r22 |
- | pop r21 | + | pop r21 |
- | pop r20 | + | pop r20 |
- | pop r19 | + | pop r19 |
- | pop r18 | + | pop r18 |
- | pop r17 | + | pop r17 |
- | pop r16 | + | pop r16 |
- | pop r10 | + | pop r10 |
- | out SREG,r10 | + | out SREG,r10 |
- | pop r10 | + | pop r10 |
- | .endm | + | .endm |
- | .macro check | + | .macro check |
- | push @0 | + | push @0 |
- | lds @0,@1 | + | lds @0,@1 |
- | sts UDR0,@0 | + | sts UDR0,@0 |
- | check_loop: ldi @0,UCSR0A | + | check_loop: ldi @0,UCSR0A |
- | sbrs @0,TXC0 | + | sbrs @0,TXC0 |
- | rjmp check_loop | + | rjmp check_loop |
- | pop @0 | + | pop @0 |
- | rcall Delay | + | rcall Delay |
- | .endm | + | .endm |
- | + | ||
- | .macro check_kosv | + | .macro check_kosv |
- | push @0 | + | push @0 |
- | ld @0,@1 | + | ld @0,@1 |
- | sts UDR0,@0 | + | sts UDR0,@0 |
- | check_loop1: ldi @0,UCSR0A | + | check_loop1: ldi @0,UCSR0A |
- | sbrs @0,TXC0 | + | sbrs @0,TXC0 |
- | rjmp check_loop1 | + | rjmp check_loop1 |
- | pop @0 | + | pop @0 |
- | rcall Delay | + | rcall Delay |
- | .endm | + | .endm |
- | .macro check1 | + | .macro check1 |
- | sts UDR0,@0 | + | sts UDR0,@0 |
- | check_loop1: ldi @0,UCSR0A | + | check_loop1: ldi @0,UCSR0A |
- | sbrs @0,TXC0 | + | sbrs @0,TXC0 |
- | rjmp check_loop1 | + | rjmp check_loop1 |
- | rcall Delay | + | rcall Delay |
- | .endm | + | .endm |
- | + | ||
- | .macro tabulate | + | .macro tabulate |
- | push r16 | + | push r16 |
- | ldi r16,0x09 | + | ldi r16,0x09 |
- | check1 r16 | + | check1 r16 |
- | pop r16 | + | pop r16 |
- | .endm | + | .endm |
- | .macro newline | + | .macro newline |
- | push r16 | + | push r16 |
- | ldi r16,0x0D | + | ldi r16,0x0D |
- | check1 r16 | + | check1 r16 |
- | ldi r16,0x0A | + | ldi r16,0x0A |
- | check1 r16 | + | check1 r16 |
- | pop r16 | + | pop r16 |
- | .endm | + | .endm |
- | </file> | + | </code> |
+ | </hidden> | ||
+ | \\ | ||
====Текст модуля twi_lib.asm==== | ====Текст модуля twi_lib.asm==== | ||
- | <file asm twi_lib.asm> | + | <hidden развернуть> |
- | + | <code asm> | |
- | ;Библиотека_TWI | + | |
- | ;----------------------------------------------------------------------- | + | |
- | ;======= Стартовая посылка по шине i2c ================================================= | + | ;Библиотека_TWI |
- | i2c_start: | + | ;----------------------------------------------------------------------- |
- | push r16 | + | |
- | ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE) ; Выполняем посылку стартовой комбинации | + | ;======= Стартовая посылка по шине i2c ================================================= |
- | sts TWCR,r16 ; Посылаем полученный байт в TWCR | + | i2c_start: |
- | rcall i2c_wait ; Ожидание формирования start в блоке TWI | + | push r16 |
- | pop r16 ; Возвращаем данные в r16 из стека | + | ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE) ; Выполняем посылку стартовой комбинации |
- | ret | + | sts TWCR,r16 ; Посылаем полученный байт в TWCR |
- | ;======= Стоповая посылка по шине i2c ================================================== | + | rcall i2c_wait ; Ожидание формирования start в блоке TWI |
- | i2c_stop: | + | pop r16 ; Возвращаем данные в r16 из стека |
- | push r16 | + | ret |
- | ldi r16,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) ; Отправляем стоповую посылку | + | ;======= Стоповая посылка по шине i2c ================================================== |
- | sts TWCR,r16 ; Посылаем полученный байт в TWCR | + | i2c_stop: |
- | pop r16 ; Возвращаем данные в r16 из стека | + | push r16 |
- | ret | + | ldi r16,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) ; Отправляем стоповую посылку |
- | ;======= Посылка байта информации по шине i2c ========================================== | + | sts TWCR,r16 ; Посылаем полученный байт в TWCR |
- | i2c_send: | + | pop r16 ; Возвращаем данные в r16 из стека |
- | push r16 | + | ret |
- | sts TWDR,r16 ; Записываем передаваемый байт в регистр TWDR | + | ;======= Посылка байта информации по шине i2c ========================================== |
- | ldi r16,(1<<TWINT)|(1<<TWEN)|(1<<TWIE) ; Формируем байт, отвечающий | + | i2c_send: |
- | ; за пересылку информационного байта | + | push r16 |
- | sts TWCR,r16 ; Посылаем полученный байт в TWCR | + | sts TWDR,r16 ; Записываем передаваемый байт в регистр TWDR |
- | rcall i2c_wait ; Ожидание окончания пересылки байта | + | ldi r16,(1<<TWINT)|(1<<TWEN)|(1<<TWIE) ; Формируем байт, отвечающий |
- | pop r16 ; Возвращаем данные в r16 из стека | + | ; за пересылку информационного байта |
- | ret | + | sts TWCR,r16 ; Посылаем полученный байт в TWCR |
- | ;======= Приём информационного байта по шине i2c ======================================= | + | rcall i2c_wait ; Ожидание окончания пересылки байта |
- | i2c_receive: | + | pop r16 ; Возвращаем данные в r16 из стека |
- | ; Принятый байт помещается в регистр r16, поэтому рекомендуется | + | ret |
- | ; продумать программу так, чтобы в этот момент в нём не было | + | ;======= Приём информационного байта по шине i2c ======================================= |
- | ; важной информации, байт не сохраняется в стеке в коде данной | + | i2c_receive: |
- | ; процедуры | + | ; Принятый байт помещается в регистр r16, поэтому рекомендуется |
- | ldi r16,(1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE) ; Формируем байт, отвечающий за прием | + | ; продумать программу так, чтобы в этот момент в нём не было |
- | sts TWCR,r16 ; Посылаем полученный байт в TWCR | + | ; важной информации, байт не сохраняется в стеке в коде данной |
- | rcall i2c_wait ; Ожидание окончания приёма байта | + | ; процедуры |
- | lds r16,TWDR ; Считываем полученную информацию из TWDR | + | ldi r16,(1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE) ; Формируем байт, отвечающий за прием |
- | ret | + | sts TWCR,r16 ; Посылаем полученный байт в TWCR |
- | ;======= Приём последнего байта (NACK) ================================================= | + | rcall i2c_wait ; Ожидание окончания приёма байта |
- | i2c_receive_last: | + | lds r16,TWDR ; Считываем полученную информацию из TWDR |
- | ; Принятый байт помещается в регистр r16, поэтому рекомендуется | + | ret |
- | ; продумать программу так, чтобы в этот момент в нём не было | + | ;======= Приём последнего байта (NACK) ================================================= |
- | ; важной информации, байт не сохраняется в стеке в коде данной | + | i2c_receive_last: |
- | ; процедуры | + | ; Принятый байт помещается в регистр r16, поэтому рекомендуется |
- | ldi r16,(1<<TWINT)|(1<<TWEN)|(1<<TWIE) ; Формируем байт, отвечающий за прием информационного байта | + | ; продумать программу так, чтобы в этот момент в нём не было |
- | sts TWCR,r16 ; Посылаем полученный байт в TWCR | + | ; важной информации, байт не сохраняется в стеке в коде данной |
- | rcall i2c_wait ; Ожидание окончания приёма байта | + | ; процедуры |
- | lds r16,TWDR ; Считываем полученную информацию из TWDR | + | ldi r16,(1<<TWINT)|(1<<TWEN)|(1<<TWIE) ; Формируем байт, отвечающий за прием информационного байта |
- | ret | + | sts TWCR,r16 ; Посылаем полученный байт в TWCR |
- | ;======= Ожидание готовности TWI ======================================================= | + | rcall i2c_wait ; Ожидание окончания приёма байта |
- | i2c_wait: | + | lds r16,TWDR ; Считываем полученную информацию из TWDR |
- | lds r16,TWCR ; Загружаем значение из TWCR в r16 | + | ret |
- | sbrs r16,TWINT ; Функция ожидания выполняется до тех пор, пока поднят флаг | + | ;======= Ожидание готовности TWI ======================================================= |
- | ; прерывания в 1 | + | i2c_wait: |
- | rjmp i2c_wait | + | lds r16,TWCR ; Загружаем значение из TWCR в r16 |
- | ret | + | sbrs r16,TWINT ; Функция ожидания выполняется до тех пор, пока поднят флаг |
- | ;======================================================================================= | + | ; прерывания в 1 |
- | </file> | + | rjmp i2c_wait |
+ | ret | ||
+ | ;======================================================================================= | ||
+ | </code> | ||
+ | </hidden> |