Сб авг 29, 2020 08:44:01
Сб авг 29, 2020 08:56:11
Сб авг 29, 2020 09:39:18
Сб авг 29, 2020 10:09:40
Сб авг 29, 2020 13:46:28
Сб авг 29, 2020 15:51:29
То же самое сказано про биты 0-5 регистра PCMSK.The flag is cleared when the interrupt routine is executed.
Alternatively, the flag can be cleared by writing a logical one to it. This flag is always cleared when INT0 is configured as a level interrupt.
Сб авг 29, 2020 16:33:26
Сб авг 29, 2020 19:23:03
LDI R16, 0<<PCINT5 | 1<<PCINT4 | 1<<PCINT3| 1<<PCINT2| 0<<PCINT1| 0<<PCINT0
Да, еще момент. То, что ты взял код под спойлер - это правиоьно, однако код под спойлером надо еще взять в, тогда более-менее сохранится форматирование исходника, не будет той кучи, в которую и смотреть не хочется...
- Код:
Пн авг 31, 2020 13:54:31
Пн авг 31, 2020 17:27:50
Вт сен 01, 2020 05:31:20
Вт сен 01, 2020 05:48:58
Вт окт 06, 2020 20:56:29
Ср окт 07, 2020 11:48:50
когда ты в студии запустил симуляцию и курсор встал на нулевой адрес, сначала пины соответствующих входов нужно поставить в нужное состояние. тогда не будет возникать ложного запуска прерывания.Wladimir_TS писал(а):Неоднократно замечал что при старте проекта в студии имеет место быть 1 холостое прерывание от внешних источников если они разрешены и если настроено на фронт или спад сразу после SEI. В железе его нет
Ср окт 07, 2020 20:50:48
Вс окт 18, 2020 20:49:32
;=============
; Сегмент FLASH памяти
.CSEG
;=============
; Таблица прерываний
.ORG 0x00 RJMP RESET
.ORG 0x05 RJMP TIM1_CAPT
;=============
; Прерывание по сбросу, стартовая инициализация
RESET:
; Инициализация стека
LDI Temp1, LOW(RAMEND)
OUT SPL, Temp1
LDI Temp1, HIGH(RAMEND)
OUT SPH, Temp1
; Очистка ОЗУ и регистров R0-R31
LDI ZL, LOW(SRAM_START) ; Адрес начала ОЗУ в индекс
LDI ZH, HIGH(SRAM_START)
CLR Temp1 ; Очищаем R16
RAM_Flush:
ST Z+, Temp1
CPI ZH, HIGH(RAMEND + 1)
BRNE RAM_Flush
CPI ZL, LOW(RAMEND + 1)
BRNE RAM_Flush
LDI ZL, (0x1F-2) ; Адрес регистра R29
CLR ZH
Reg_Flush:
ST Z, ZH
DEC ZL
BRNE Reg_Flush
CLR ZL
CLR ZH
; Регистры и SRAM полностью очищены (обнулены)
; Но регистры ввода-вывода (IO) НЕОБХОДИМО очищать
; Глобальный запрет прерываний
CLI
;настройка порта D
ldi Temp1, 0xFF // порт D на выход
out DDRD, Temp1
;настройка порта B
cbi DDRB,0 ; ICP1 на вход
;настройка таймера1
ldi Temp1, 0b00000000
out TCCR1A, Temp1
ldi Temp1, 0b01000011
out TCCR1B, Temp1
ldi Temp1, 0b00100000
out TIMSK, Temp1
out TIFR, Temp1
SEI ;разрешаем прерывания
;***************************************************
LOOP:
rjmp LOOP
;==============
TIM1_CAPT: ;обработчик прерывания по захвату таймера 1
SBIC PORTD,EXT
rjmp metka
SBI PORTD,EXT ;установить бит
rjmp EXIT
metka:
CBI PORTD,EXT ;установить бит
EXIT:
RETI
;=============
; Сегмент FLASH памяти
.CSEG
;=============
; Таблица прерываний
.ORG 0x00 RJMP RESET
.ORG 0x05 RJMP TIM1_CAPT
;=============
; Прерывание по сбросу, стартовая инициализация
RESET:
; Инициализация стека
LDI Temp1, LOW(RAMEND)
OUT SPL, Temp1
LDI Temp1, HIGH(RAMEND)
OUT SPH, Temp1
; Очистка ОЗУ и регистров R0-R31
LDI ZL, LOW(SRAM_START) ; Адрес начала ОЗУ в индекс
LDI ZH, HIGH(SRAM_START)
CLR Temp1 ; Очищаем R16
RAM_Flush:
ST Z+, Temp1
CPI ZH, HIGH(RAMEND + 1)
BRNE RAM_Flush
CPI ZL, LOW(RAMEND + 1)
BRNE RAM_Flush
LDI ZL, (0x1F-2) ; Адрес регистра R29
CLR ZH
Reg_Flush:
ST Z, ZH
DEC ZL
BRNE Reg_Flush
CLR ZL
CLR ZH
; Регистры и SRAM полностью очищены (обнулены)
; Но регистры ввода-вывода (IO) НЕОБХОДИМО очищать
; Глобальный запрет прерываний
CLI
;настройка порта D
ldi Temp1, 0xFF // Порт D на выход
out DDRD, Temp1
;настройка порта B
cbi DDRB,0 ; ICP1 на вход
;настройка таймера1
ldi Temp1, 0b00000000
out TCCR1A, Temp1
ldi Temp1, 0b01000101
out TCCR1B, Temp1
ldi Temp1, 0b00100000
out TIMSK, Temp1
out TIFR, Temp1
; ===========
CLT ;сбрасываем бит Т
ORI R30, 0b00000001 ;устанасливаем бит 0 R30 в 1
SEI ;разрешаем прерывания
;***************************************************
LOOP:
BRTC LOOP ;если Т=0 не делаем ничего
CLI ;запрещаем прерывания
;***************************************************
; вывод значения Temp1 на TM1637
;***************************************************
; ===========
; delay loop generator
; 8000000 cycles:
; ----------
; delaying 7999992 cycles:
ldi R17, $48
WGLOOP00: ldi R18, $BC
WGLOOP1: ldi R19, $C4
WGLOOP2: dec R19
brne WGLOOP2
dec R18
brne WGLOOP1
dec R17
brne WGLOOP00
; ----------
; delaying 6 cycles:
ldi R17, $02
WGLOOP3: dec R17
brne WGLOOP3
; ----------
; delaying 2 cycles:
nop
nop
; ===========
SEI ;разрешаем прерывания
CLT ;сбрасываем бит Т
rjmp LOOP
;==============
TIM1_CAPT: ;обработчик прерывания по захвату таймера 1
SBRS R30,0
rjmp ZAHVAT
CLR Temp1 ;обнуляем счётчмк
out TCNT1H,Temp1
out TCNT1L,Temp1
ANDI R30, 0b11111110 ;устанасливаем бит 0 R30 в 0
rjmp EXT
ZAHVAT:
in Temp1,ICR1L ;копируем значение регистра захвата
in Temp2,ICR1H
ORI R30, 0b00000001 ;устанасливаем бит 0 R30 в 1
SET ;устанавливаем бит Т
EXT:
RETI
Пн окт 19, 2020 03:53:02
TIM1_CAPT: ;обработчик прерывания по захвату таймера 1
SBRS R30,0
rjmp ZAHVAT
CLR Temp1 ;обнуляем счётчмк
out TCNT1H,Temp1
out TCNT1L,Temp1
;================
LDI R16,1<<PSR10
OUT SFIOR,R16 ; обнулить предделитель таймера
;================
ANDI R30, 0b11111110 ;устанасливаем бит 0 R30 в 0
rjmp EXT
ZAHVAT:
in Temp1,ICR1L ;копируем значение регистра захвата
in Temp2,ICR1H
ORI R30, 0b00000001 ;устанасливаем бит 0 R30 в 1
SET ;устанавливаем бит Т
EXT:
RETI
.include "m8def.inc" ; ATMega8
.equ Fo=8000000
.def temp1=R16
.def temp2=R17
;=============
; Сегмент FLASH памяти
.CSEG
;=============
; Таблица прерываний
.ORG 0x00
RJMP RESET
.ORG 0x05 ; RJMP TIM1_CAPT
TIM1_CAPT: ;обработчик прерывания по захвату таймера 1
SBRS R30,0
rjmp ZAHVAT
OUT TCCR1B,R22
; CLR Temp1 ;обнуляем счётчмк
; out TCNT1H,Temp1
; out TCNT1L,Temp1
CBR R30,1<<0
; ANDI R30, 0b11111110 ;устанасливаем бит 0 R30 в 0
rjmp EXT
ZAHVAT:
in Temp1,ICR1L ;копируем значение регистра захвата
in Temp2,ICR1H
SBR R30,1<<0
; ORI R30, 0b00000001 ;устанасливаем бит 0 R30 в 1
ldi Temp1,0b01000000
out TCCR1B, Temp1
; ldi Temp1, 0b01000101
; out TCCR1B, Temp1
ldi Temp1, 0b00100000
out TIMSK, Temp1
out TIFR, Temp1
LDI R16,1<<PSR10
OUT SFIOR,R16
SET ;устанавливаем бит Т
EXT:
RETI
;=============
; Прерывание по сбросу, стартовая инициализация
RESET:
; Инициализация стека
LDI Temp1, LOW(RAMEND)
OUT SPL, Temp1
LDI Temp1, HIGH(RAMEND)
OUT SPH, Temp1
; Очистка ОЗУ и регистров R0-R31
CLI
;настройка порта D
ldi Temp1, 0xFF // Порт D на выход
out DDRD, Temp1
;настройка порта B
cbi DDRB,0 ; ICP1 на вход
;настройка таймера1
ldi Temp1, 0b00000000
out TCCR1A, Temp1
ldi Temp1,0b01000000
out TCCR1B, Temp1
; ldi Temp1, 0b01000101
; out TCCR1B, Temp1
ldi Temp1, 0b00100000
out TIMSK, Temp1
out TIFR, Temp1
LDI R16,1<<PSR10
OUT SFIOR,R16
; ===========
CLT ;сбрасываем бит Т
SBR R30,1<<0
; ORI R30, 0b00000001 ;устанасливаем бит 0 R30 в 1
LDI R22,0b01000101
SEI ;разрешаем прерывания
;***************************************************
LOOP:
BRTC LOOP ;если Т=0 не делаем ничего
CLI ;запрещаем прерывания
;***************************************************
; вывод значения Temp1 на TM1637
;***************************************************
; ===========
; delay loop generator
; 8000000 cycles:
; ----------
; delaying 7999992 cycles:
ldi R17, $48
WGLOOP00: ldi R18, $BC
WGLOOP1: ldi R19, $C4
WGLOOP2: dec R19
brne WGLOOP2
dec R18
brne WGLOOP1
dec R17
brne WGLOOP00
; ----------
; delaying 6 cycles:
ldi R17, $02
WGLOOP3: dec R17
brne WGLOOP3
; ----------
; delaying 2 cycles:
nop
nop
; ===========
; SEI ;разрешаем прерывания
; CLT ;сбрасываем бит Т
rjmp RESET
;rjmp LOOP
;==============
.EXIT
Пн окт 19, 2020 05:19:13
sbi LED_PORT, LED // Включение светодиода
Пн окт 19, 2020 06:38:02
;.equ LED_PORT=PORTD
.equ LED_PORT=PIND
.equ LED=0
SER ZH
OUT DDRD,ZH
SBI LED_PORT,LED ; переключить состояние светика
Пн окт 19, 2020 12:31:49