Пт фев 05, 2016 07:57:52
ISR(INT0_vect) // обработчик прерывания энкодера
{
if((PIN_ENCODER & (1 << PIN_ENC_CHA)) == 0)
{
state = ROTATION_R; // вращение вправо
}
else
{
state = ROTATION_L; // вращение влево
}
GIFR |= (1 << INTF0); // сброс флага прерывания
}
Пт фев 05, 2016 10:33:13
Пт фев 05, 2016 10:46:24
Пт фев 05, 2016 12:51:03
Пт фев 05, 2016 12:57:47
Пт фев 05, 2016 14:13:21
Пт фев 05, 2016 14:16:17
Пт фев 05, 2016 14:45:45
Пт фев 05, 2016 18:59:06
; ******************************************************
; * Автор: СКАЗОЧНИК *
; * Дата: 25.09.2015 *
; * Версия: 130531 *
; * Имя файла: Оптитрон *
; * Для AVR: ATTiny2313 *
; * Тактовая частота: 8 MHz (внутренняя RC) *
; * Среда разработки: AVR Studio 4.19 *
; * *
; * Выполняемые функции: *
; ******************************************************
; ================
; ПОДКЛЮЧАЕМЫЕ БИБЛИОТЕКИ (.include)
; ================
.include "tn2313def.inc"
; ============
; ТИП МИКРОКОНТРОЛЛЕРА (.device)
; ============
.device ATtiny2313
; =================
; ОБЪЯВЛЕНИЯ И КОНСТАНТЫ (.def, .equ)
; =================
.def temp = R16
.def VOLUME = R17 ; Переменная ошибки
; .def DATA = R18 ; Данные между датчиком температуры и МК
; .def temp1 = R19
; .equ DQDDR = DDRB ; Указать регистр напраавления порта, к которому подключен вывод DQ
; .equ DQPIN = PINB ; Указать регистр чтения порта, к которому подключен вывод DQ
; .equ DQ = 7 ; Указать номер бита порта, к которому подключен DQ
; ====
; МАССИВЫ И Т.Д. (.eseg) EEPROM (.db, .dw)
; ====
.eseg
; ******************************
; НАЧАЛО ПРОГРАММЫ (.cseg) FLASH
; ******************************
.cseg
; ----------
; ВЕКТОРЫ ПРЕРЫВАНИЙ
; ----------
rjmp RESET ; Reset Handler
rjmp INT_0 ; External Interrupt0 Handler
rjmp INT_1 ; External Interrupt1 Handler
rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 CompareA Handler
rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp USART0_RXC ; USART0 RX Complete Handler
rjmp USART0_DRE ; USART0,UDR Empty Handler
rjmp USART0_TXC ; USART0 TX Complete Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp PCINT ; Pin Change Interrupt
rjmp TIMER1_COMPB ; Timer1 Compare B Handler
rjmp TIMER0_COMPA ; Timer0 Compare A Handler
rjmp TIMER0_COMPB ; Timer0 Compare B Handler
rjmp USI_START ; USI Start Handler
rjmp USI_OVERFLOW ; USI Overflow Handler
rjmp EE_READY ; EEPROM Ready Handler
rjmp WDT_OVERFLOW ; Watchdog Overflow Handler
;RESET ; Reset Handler
;INT_0: ; External Interrupt0 Handler
INT_1: ; External Interrupt1 Handler
TIM1_CAPT: ; Timer1 Capture Handler
TIM1_COMPA: ; Timer1 CompareA Handler
TIM1_OVF: ; Timer1 Overflow Handler
TIM0_OVF: ; Timer0 Overflow Handler
USART0_RXC: ; USART0 RX Complete Handler
USART0_DRE: ; USART0,UDR Empty Handler
USART0_TXC: ; USART0 TX Complete Handler
ANA_COMP: ; Analog Comparator Handler
PCINT: ; Pin Change Interrupt
TIMER1_COMPB: ; Timer1 Compare B Handler
TIMER0_COMPA: ; Timer0 Compare A Handler исправил в ТН2313ДЕФ.ИНК
TIMER0_COMPB: ; Timer0 Compare B Handler исправил в ТН2313ДЕФ.ИНК
USI_START: ; USI Start Handler
USI_OVERFLOW: ; USI Overflow Handler
EE_READY: ; EEPROM Ready Handler
WDT_OVERFLOW: ; Watchdog Overflow Handler
reti ; Выход из прерываний, которые не используются
; ----------
; ОБРАБОТЧИКИ ПРЕРЫВАНИЙ
; ----------
INT_0:
ldi temp, (0<<INT1)|(0<<INT0) ; прерывание выключить
out GIMSK, temp
sbis PIND, 3
rjmp rty
subi VOLUME, -10
out OCR0A, VOLUME
out OCR0B, VOLUME
out OCR1AL, VOLUME
rjmp ghj
rty:
subi VOLUME, 10
out OCR0A, VOLUME
out OCR0B, VOLUME
out OCR1AL, VOLUME
ghj:
reti
; **************************************************************************************************
; ИНИЦИАЛИЗАЦИЯ МК (логическое начало основной программы) ******************************************
; **************************************************************************************************
; --------- конфигурация портов ----------
Reset: ldi temp, 0b00001100 ; Конфигурируем порт B (направление порта)
out DDRB, temp
ldi temp, 0b00000011 ; Конфигурируем порт A (направление порта)
out DDRA, temp
ldi temp, 0b00100000 ; Конфигурируем порт D (направление порта)
out DDRD, temp
ldi temp, 0b00000000 ; Конфигурируем порт В (выводы порта)
out PORTB, temp
ldi temp, 0b00000000 ; Конфигурируем порт A (выводы порта)
out PORTA, temp
ldi temp, 0b00000000 ; Конфигурируем порт D (выводы порта)
out PORTD, temp
ldi temp, (0<<INT1)|(1<<INT0) ; прерывание
out GIMSK, temp
ldi temp, (1<<ISC01)|(1<<ISC00) ; по восходящему фронту
out MCUCR, temp
ldi temp, 0xFF ; Сбросить флаги внешних прерываний
out EIFR, temp
ldi temp, RAMEND ; Загрузка указателя стека
out SPL, temp
ldi temp, 1<<ACD ; Выключаем аналоговый компаратор (для меньшего потребления)
out ACSR, temp
ldi temp, (1<<OCIE1A)|(0<<OCIE1B)|(1<<OCIE0B)|(1<<OCIE0A) ; три вывода на аппаратный ШИМ
out TIMSK, temp
ldi temp, 0 ; Закидываем в счетчик изначальное значение
out TCNT0, temp
; ldi temp, 0
out TCNT1H, temp
; ldi temp, 0
out TCNT1L, temp
ldi temp, (1<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|(0<<WGM11)|(1<<WGM10)
out TCCR1A, temp
ldi temp, (1<<COM0A1)|(0<<COM0A0)|(1<<COM0B1)|(0<<COM0B0)|(1<<WGM01)|(1<<WGM00)
out TCCR0A, temp
ldi temp, 255
out OCR0A, temp
; ldi temp, 255
out OCR0B, temp
; out OCR1AH, temp
out OCR1AL, temp
;out OCR0B, temp
ldi temp, (0<<ICNC1)|(0<<ICES1)|(0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10)
out TCCR1B, temp
ldi temp, (0<<WGM02)|(0<<CS02)|(0<<CS01)|(1<<CS00)
out TCCR0B, temp
; ldi temp, 10
; out EEAR, temp ; загружаем адрес нужной ячейки
; sbi EECR, EERE ; Выставляем бит чтения
; in ZUUM, EEDR ; Забираем из регистра данных результат
;
; ---------- разрешение прерываний ----------
ldi temp, 255
ldi R20, 0
sei ; Разрешаем прерывания
; *******************************************************************************************************************
; ОСНОВНАЯ ПРОГРАММА (основной цикл) ********************************************************************************
; *******************************************************************************************************************
Start:
// cpi R20, 1
/* brne TTT ; перейти если равно или больше
inc temp
out OCR0A, temp
out OCR0B, temp
out OCR1AL, temp
cpi temp, 255
brne EEE
ldi R20, 0
rcall DELAY
rcall DELAY
rcall DELAY
rcall DELAY
rcall DELAY
rcall DELAY
rjmp EEE
TTT: dec temp
out OCR0A, temp
out OCR0B, temp
out OCR1AL, temp
cpi temp, 100
brne EEE
ldi R20, 1
EEE: rcall DELAY
*/
rjmp Start ; Конец программы, переход на начало
; ***************************************************************************************************
; ПОДПРОГРАММЫ **************************************************************************************
; ***************************************************************************************************
; EEWrite:
; sbic EECR, EEPE ; Ждем готовности памяти к записи. Крутимся в цикле
; rjmp EEWrite ; до тех пор пока не очистится флаг EEWE
;
; cli ; Затем запрещаем прерывания.
;
; ldi temp, 10
; out EEAR, temp ; Загружаем адрес нужной ячейки
;
; out EEDR,ZUUM ; и сами данные, которые нам нужно загрузить
;
; sbi EECR,EEMPE ; взводим предохранитель
; sbi EECR,EEPE ; записываем байт (не более 4х таков ожидание)
;
; sei ; разрешаем прерывания
;
; ldi RAZ4, 10 ; Возвращаем 4 разряд перед выходом
; ldi FLAG, 0b00000000
; ldi error, 0
;
; ret
DELAY: ; Веся задержка будет равна примерно 50 мкс
push temp ; Положим перменную в стек, может она еще где-то используется
in temp, SREG ; Закидываем в стек СРЕГ
push temp
ldi R18, 255 ; Задержка ~8.107 mсек
ldi R19, 10
; ldi R18, 10
Loop3: subi R18, 1
sbci R19, 0
; sbci R18, 0
brcc Loop3
pop temp ; Вытаскиваем из стека СРЕГ
out SREG, temp ; Возвращаем занчение обратно из стека
pop temp ; Вытаскиваем переменную из стека
ret
Сб фев 06, 2016 06:04:26
.include "tn2313def.inc"
; ============
; ТИП МИКРОКОНТРОЛЛЕРА (.device)
; ============
.device ATtiny2313
; =================
; ОБЪЯВЛЕНИЯ И КОНСТАНТЫ (.def, .equ)
; =================
.def temp = R16
.def VOLUME = R17 ; Переменная ошибки
; .def DATA = R18 ; Данные между датчиком температуры и МК
; .def temp1 = R19
; .equ DQDDR = DDRB ; Указать регистр напраавления порта, к которому подключен вывод DQ
; .equ DQPIN = PINB ; Указать регистр чтения порта, к которому подключен вывод DQ
; .equ DQ = 7 ; Указать номер бита порта, к которому подключен DQ
; ====
; МАССИВЫ И Т.Д. (.eseg) EEPROM (.db, .dw)
; ====
.eseg
; ******************************
; НАЧАЛО ПРОГРАММЫ (.cseg) FLASH
; ******************************
.cseg
; ----------
; ВЕКТОРЫ ПРЕРЫВАНИЙ
; ----------
.ORG 0
rjmp RESET ; Reset Handler
.ORG 1
rjmp INT_0 ; External Interrupt0 Handler
; rjmp INT_1 ; External Interrupt1 Handler
; rjmp TIM1_CAPT ; Timer1 Capture Handler
.ORG 4
RETI
; rjmp TIM1_COMPA ; Timer1 CompareA Handler
; rjmp TIM1_OVF ; Timer1 Overflow Handler
; rjmp TIM0_OVF ; Timer0 Overflow Handler
; rjmp USART0_RXC ; USART0 RX Complete Handler
; rjmp USART0_DRE ; USART0,UDR Empty Handler
; rjmp USART0_TXC ; USART0 TX Complete Handler
; rjmp ANA_COMP ; Analog Comparator Handler
; rjmp PCINT ; Pin Change Interrupt
; rjmp TIMER1_COMPB ; Timer1 Compare B Handler
; rjmp TIMER0_COMPA ; Timer0 Compare A Handler
; rjmp TIMER0_COMPB ; Timer0 Compare B Handler
; rjmp USI_START ; USI Start Handler
; rjmp USI_OVERFLOW ; USI Overflow Handler
; rjmp EE_READY ; EEPROM Ready Handler
; rjmp WDT_OVERFLOW ; Watchdog Overflow Handler
;RESET ; Reset Handler
;INT_0: ; External Interrupt0 Handler
; INT_1: ; External Interrupt1 Handler
; TIM1_CAPT: ; Timer1 Capture Handler
; TIM1_COMPA: ; Timer1 CompareA Handler
; TIM1_OVF: ; Timer1 Overflow Handler
; TIM0_OVF: ; Timer0 Overflow Handler
; USART0_RXC: ; USART0 RX Complete Handler
; USART0_DRE: ; USART0,UDR Empty Handler
; USART0_TXC: ; USART0 TX Complete Handler
; ANA_COMP: ; Analog Comparator Handler
; PCINT: ; Pin Change Interrupt
; TIMER1_COMPB: ; Timer1 Compare B Handler
; TIMER0_COMPA: ; Timer0 Compare A Handler исправил в ТН2313ДЕФ.ИНК
; TIMER0_COMPB: ; Timer0 Compare B Handler исправил в ТН2313ДЕФ.ИНК
; USI_START: ; USI Start Handler
; USI_OVERFLOW: ; USI Overflow Handler
; EE_READY: ; EEPROM Ready Handler
; WDT_OVERFLOW: ; Watchdog Overflow Handler
; reti ; Выход из прерываний, которые не используются
; ----------
; ОБРАБОТЧИКИ ПРЕРЫВАНИЙ
; ----------
INT_0:
; ldi temp, (0<<INT1)|(0<<INT0) ; прерывание выключить
; out GIMSK, temp
LDI R16,-10
sbis PIND,3
LDI R16,10
SUB VOLUME,R16
out OCR0A, VOLUME
out OCR0B, VOLUME
OUT OCR1AH,ZH ; !!!!!!!!!!!!!!!!
out OCR1AL,VOLUME
reti
; **************************************************************************************************
; ИНИЦИАЛИЗАЦИЯ МК (логическое начало основной программы) ******************************************
; **************************************************************************************************
; --------- конфигурация портов ----------
Reset:
CLR ZH
ldi temp, 0b00001100 ; Конфигурируем порт B (направление порта)
out DDRB, temp
ldi temp, 0b00000011 ; Конфигурируем порт A (направление порта)
out DDRA, temp
ldi temp, 0b00100000 ; Конфигурируем порт D (направление порта)
out DDRD, temp
; ldi temp, 0b00000000 ; Конфигурируем порт В (выводы порта)
out PORTB,ZH
ldi temp, 0b00000000 ; Конфигурируем порт A (выводы порта)
out PORTA,ZH
ldi temp, 0b00000000 ; Конфигурируем порт D (выводы порта)
out PORTD,ZH
ldi temp, (0<<INT1)|(1<<INT0) ; прерывание
out GIMSK,temp
out EIFR, temp
ldi temp, (1<<ISC01)|(1<<ISC00) ; по восходящему фронту
out MCUCR, temp
; ldi temp, 0xFF ; Сбросить флаги внешних прерываний
; out EIFR, temp
ldi temp, RAMEND ; Загрузка указателя стека
out SPL, temp
; ldi temp, 1<<ACD ; Выключаем аналоговый компаратор (для меньшего потребления)
SBI ACSR,ACD
LDI temp,128
; ldi temp, 255
out OCR0A, temp
out OCR0B, temp
out OCR1AH,ZH
out OCR1AL, temp
;out OCR0B, temp
; Закидываем в счетчик изначальное значение
out TCNT0,ZH
out TCNT1H,ZH
out TCNT1L,ZH
ldi temp, (1<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|(0<<WGM11)|(1<<WGM10)
out TCCR1A, temp
ldi temp, (1<<COM0A1)|(0<<COM0A0)|(1<<COM0B1)|(0<<COM0B0)|(1<<WGM01)|(1<<WGM00)
out TCCR0A, temp
ldi temp, (0<<ICNC1)|(0<<ICES1)|(0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10)
out TCCR1B, temp
ldi temp, (0<<WGM02)|(0<<CS02)|(0<<CS01)|(1<<CS00)
out TCCR0B, temp
; ldi temp, (1<<OCIE1A)|(0<<OCIE1B)|(1<<OCIE0B)|(1<<OCIE0A) ; три вывода на аппаратный ШИМ
; out TIMSK, temp
; OUT TIFR,TEMP
; ldi temp, 10
; out EEAR, temp ; загружаем адрес нужной ячейки
; sbi EECR, EERE ; Выставляем бит чтения
; in ZUUM, EEDR ; Забираем из регистра данных результат
;
; ---------- разрешение прерываний ----------
ldi temp, 255
ldi R20, 0
sei ; Разрешаем прерывания
; *******************************************************************************************************************
; ОСНОВНАЯ ПРОГРАММА (основной цикл) ********************************************************************************
; *******************************************************************************************************************
Start:
// cpi R20, 1
/* brne TTT ; перейти если равно или больше
inc temp
out OCR0A, temp
out OCR0B, temp
out OCR1AL, temp
cpi temp, 255
brne EEE
ldi R20, 0
rcall DELAY
rcall DELAY
rcall DELAY
rcall DELAY
rcall DELAY
rcall DELAY
rjmp EEE
TTT: dec temp
out OCR0A, temp
out OCR0B, temp
out OCR1AL, temp
cpi temp, 100
brne EEE
ldi R20, 1
EEE: rcall DELAY
*/
rjmp Start ; Конец программы, переход на начало
; ***************************************************************************************************
; ПОДПРОГРАММЫ **************************************************************************************
; ***************************************************************************************************
; EEWrite:
; sbic EECR, EEPE ; Ждем готовности памяти к записи. Крутимся в цикле
; rjmp EEWrite ; до тех пор пока не очистится флаг EEWE
;
; cli ; Затем запрещаем прерывания.
;
; ldi temp, 10
; out EEAR, temp ; Загружаем адрес нужной ячейки
;
; out EEDR,ZUUM ; и сами данные, которые нам нужно загрузить
;
; sbi EECR,EEMPE ; взводим предохранитель
; sbi EECR,EEPE ; записываем байт (не более 4х таков ожидание)
;
; sei ; разрешаем прерывания
;
; ldi RAZ4, 10 ; Возвращаем 4 разряд перед выходом
; ldi FLAG, 0b00000000
; ldi error, 0
;
; ret
DELAY:
; Вся задержка будет равна примерно 50 мкс
in R0, SREG ; Закидываем в R0
ldi R18, 255 ; Задержка ~8.107 mсек
ldi R19, 10
Loop3:
subi R18, 1
sbci R19, 0
brcc Loop3
out SREG,R0 ; Возвращаем SREG
ret
.EXIT
Сб фев 06, 2016 06:25:12
Сб фев 06, 2016 06:57:13
Сб фев 06, 2016 07:02:28
INT_0:
LDI R16,-10
sbis PIND,3
LDI R16,10
SBI ACSR,ACD
; ldi temp, (1<<OCIE1A)|(0<<OCIE1B)|(1<<OCIE0B)|(1<<OCIE0A) ; три вывода на аппаратный ШИМ
; out TIMSK, temp
Сб фев 06, 2016 07:27:38
Сб фев 06, 2016 07:36:18
Сб фев 06, 2016 08:25:28
INT_0:
LDI R16, 10
sbis PIND, 3
LDI R16, -10
SUB VOLUME, R16
cpi VOLUME, 0
breq MIN
cpi VOLUME, 250
breq MAX
rjmp G
MIN: LDI VOLUME, 0
rjmp G
MAX: ldi VOLUME, 250
G: out OCR0A, VOLUME
out OCR0B, VOLUME
OUT OCR1AH, ZH
out OCR1AL, VOLUME
reti
MIN: LDI VOLUME, 10
rjmp G
MAX: ldi VOLUME, 240
Сб фев 06, 2016 08:51:18
cpi VOLUME, 250
BRLO PC+2
MAX: LDI VOLUME, 250
cpi VOLUME, 10
BRSH PC+2
MIN: LDI VOLUME, 10
Сб фев 06, 2016 08:59:50
Сб фев 06, 2016 09:21:16
Сб фев 06, 2016 10:12:41