Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
doc:1201:643.mgul.12013-01_12_01 [2017/02/22 21:50] gotrum |
doc:1201:643.mgul.12013-01_12_01 [2018/04/28 23:47] (текущий) |
||
---|---|---|---|
Строка 26: | Строка 26: | ||
====Текст программы telemetry_rev1-1.asm==== | ====Текст программы telemetry_rev1-1.asm==== | ||
- | <hidden telemetry_rev1-1.asm> | + | <hidden развернуть> |
+ | <code asm> | ||
;---------------------------------------------------- | ;---------------------------------------------------- | ||
; Program : telemetry_rev1-1 | ; Program : telemetry_rev1-1 | ||
Строка 543: | Строка 544: | ||
popf | popf | ||
ret | ret | ||
+ | </code> | ||
</hidden> | </hidden> | ||
+ | \\ | ||
====Текст модуля 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 | + | ;Библиотека_TWI |
- | ;----------------------------------------------------------------------- | + | ;----------------------------------------------------------------------- |
- | + | ||
- | ;======= Стартовая посылка по шине i2c ================================================= | + | ;======= Стартовая посылка по шине i2c ================================================= |
- | i2c_start: | + | i2c_start: |
- | push r16 | + | push r16 |
- | ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE) ; Выполняем посылку стартовой комбинации | + | ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE) ; Выполняем посылку стартовой комбинации |
- | sts TWCR,r16 ; Посылаем полученный байт в TWCR | + | sts TWCR,r16 ; Посылаем полученный байт в TWCR |
- | rcall i2c_wait ; Ожидание формирования start в блоке TWI | + | rcall i2c_wait ; Ожидание формирования start в блоке TWI |
- | pop r16 ; Возвращаем данные в r16 из стека | + | pop r16 ; Возвращаем данные в r16 из стека |
- | ret | + | ret |
- | ;======= Стоповая посылка по шине i2c ================================================== | + | ;======= Стоповая посылка по шине i2c ================================================== |
- | i2c_stop: | + | i2c_stop: |
- | push r16 | + | push r16 |
- | ldi r16,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) ; Отправляем стоповую посылку | + | ldi r16,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) ; Отправляем стоповую посылку |
- | sts TWCR,r16 ; Посылаем полученный байт в TWCR | + | sts TWCR,r16 ; Посылаем полученный байт в TWCR |
- | pop r16 ; Возвращаем данные в r16 из стека | + | pop r16 ; Возвращаем данные в r16 из стека |
- | ret | + | ret |
- | ;======= Посылка байта информации по шине i2c ========================================== | + | ;======= Посылка байта информации по шине i2c ========================================== |
- | i2c_send: | + | i2c_send: |
- | push r16 | + | push r16 |
- | sts TWDR,r16 ; Записываем передаваемый байт в регистр TWDR | + | sts TWDR,r16 ; Записываем передаваемый байт в регистр TWDR |
- | ldi r16,(1<<TWINT)|(1<<TWEN)|(1<<TWIE) ; Формируем байт, отвечающий | + | ldi r16,(1<<TWINT)|(1<<TWEN)|(1<<TWIE) ; Формируем байт, отвечающий |
- | ; за пересылку информационного байта | + | ; за пересылку информационного байта |
- | sts TWCR,r16 ; Посылаем полученный байт в TWCR | + | sts TWCR,r16 ; Посылаем полученный байт в TWCR |
- | rcall i2c_wait ; Ожидание окончания пересылки байта | + | rcall i2c_wait ; Ожидание окончания пересылки байта |
- | pop r16 ; Возвращаем данные в r16 из стека | + | pop r16 ; Возвращаем данные в r16 из стека |
- | ret | + | ret |
- | ;======= Приём информационного байта по шине i2c ======================================= | + | ;======= Приём информационного байта по шине i2c ======================================= |
- | i2c_receive: | + | i2c_receive: |
- | ; Принятый байт помещается в регистр r16, поэтому рекомендуется | + | ; Принятый байт помещается в регистр r16, поэтому рекомендуется |
- | ; продумать программу так, чтобы в этот момент в нём не было | + | ; продумать программу так, чтобы в этот момент в нём не было |
- | ; важной информации, байт не сохраняется в стеке в коде данной | + | ; важной информации, байт не сохраняется в стеке в коде данной |
- | ; процедуры | + | ; процедуры |
- | ldi r16,(1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE) ; Формируем байт, отвечающий за прием | + | ldi r16,(1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE) ; Формируем байт, отвечающий за прием |
- | sts TWCR,r16 ; Посылаем полученный байт в TWCR | + | sts TWCR,r16 ; Посылаем полученный байт в TWCR |
- | rcall i2c_wait ; Ожидание окончания приёма байта | + | rcall i2c_wait ; Ожидание окончания приёма байта |
- | lds r16,TWDR ; Считываем полученную информацию из TWDR | + | lds r16,TWDR ; Считываем полученную информацию из TWDR |
- | ret | + | ret |
- | ;======= Приём последнего байта (NACK) ================================================= | + | ;======= Приём последнего байта (NACK) ================================================= |
- | i2c_receive_last: | + | i2c_receive_last: |
- | ; Принятый байт помещается в регистр r16, поэтому рекомендуется | + | ; Принятый байт помещается в регистр r16, поэтому рекомендуется |
- | ; продумать программу так, чтобы в этот момент в нём не было | + | ; продумать программу так, чтобы в этот момент в нём не было |
- | ; важной информации, байт не сохраняется в стеке в коде данной | + | ; важной информации, байт не сохраняется в стеке в коде данной |
- | ; процедуры | + | ; процедуры |
- | ldi r16,(1<<TWINT)|(1<<TWEN)|(1<<TWIE) ; Формируем байт, отвечающий за прием информационного байта | + | ldi r16,(1<<TWINT)|(1<<TWEN)|(1<<TWIE) ; Формируем байт, отвечающий за прием информационного байта |
- | sts TWCR,r16 ; Посылаем полученный байт в TWCR | + | sts TWCR,r16 ; Посылаем полученный байт в TWCR |
- | rcall i2c_wait ; Ожидание окончания приёма байта | + | rcall i2c_wait ; Ожидание окончания приёма байта |
- | lds r16,TWDR ; Считываем полученную информацию из TWDR | + | lds r16,TWDR ; Считываем полученную информацию из TWDR |
- | ret | + | ret |
- | ;======= Ожидание готовности TWI ======================================================= | + | ;======= Ожидание готовности TWI ======================================================= |
- | i2c_wait: | + | i2c_wait: |
- | lds r16,TWCR ; Загружаем значение из TWCR в r16 | + | lds r16,TWCR ; Загружаем значение из TWCR в r16 |
- | sbrs r16,TWINT ; Функция ожидания выполняется до тех пор, пока поднят флаг | + | sbrs r16,TWINT ; Функция ожидания выполняется до тех пор, пока поднят флаг |
- | ; прерывания в 1 | + | ; прерывания в 1 |
- | rjmp i2c_wait | + | rjmp i2c_wait |
- | ret | + | ret |
- | ;======================================================================================= | + | ;======================================================================================= |
- | </file> | + | </code> |
+ | </hidden> |