Перейти к содержанию

Зацикливание Кода На Несколько Повторений.


hardbar

Рекомендуемые сообщения

На смысловые блоки не разбивал но прокоментировал.

С макросами буду учиться.

Изменено пользователем hardbar

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

А разрешить прерывания по INT0? И чем оно будет вызываться, кнопкой?

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Вызываеться подачей сигнала на ногу int0. А как разрешить прерывания???

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

hardbar, вы не путайте форум с даташитом. Полистайте, почитайте.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Комментарии делаются тоже по смыслу, а не по описанию команды.

Не сочтите за носотыканье. Все это дружеский совет, который вам в дальнейшем обязательно поможет.

Ссылка на комментарий
Поделиться на другие сайты

По гуглил почитал даташит. Прерывания заработало но програма начинаеться с прерывания потом работает нормально.

Вот скрины.

Запуск програмы видно что почемуто начало с прерывания а не с основного кода.

Дале програма работает норм.

Вызов прерывания тоже норм. После нажатия клавиши, преривания дает по 2 импулься в каждую линию.

Вот код.

.include "tn13adef.inc"
.list
.def temp=r16 ;переименуем регистр под удобное имя
.equ kdel=50 ;добавим константу
.equ kdel2=100 ;добавим константу

;-----------------------------------------------------
;ПАМЯТЬ И УСТАНОВКА ПРЕРЫВАНИЙ
;-----------------------------------------------------

.cseg ;выбор памяти. внашем случае работаем с flesh.
.org 0 ;начальный адрес
rjmp reset;прерывание по сбросу
rjmp int_0;прерывание по порту int0
.org 0x0b ;чтоб не писать reti много раз вместо векторов прерываний.сразу пропускаем их командой.

;-----------------------------------------------------------------------------
;ИНИЦЫАЛИЗАЦЫЯ ПОРТОВ, ПРЕРЫВАНИЙ,ТАЙМЕРОВ.
;-----------------------------------------------------------------------------

reset: ;
ldi temp,ramend ;чтото с памятю связано
out spl,temp ;
ldi temp,(0<<ISC00)|(1<<ISC01) ;Условие прерывания - наростающий фронт сигнала
out MCUCR,temp
ldi temp,(1<<INT0) ;INT.Enable=1 Разрешаем прерывание INT0
out GICR,temp
ldi temp,0b11111100;настройка порта на
out ddrb,temp ;вод.вывод
ldi temp,0b00000011;подтяжка резистрами
out portb,temp ;установка в порте лог.0
ldi temp,0x05 ;пред-делитель
out tccr0b,temp ;таймера
ldi temp,0x80 ;отключение
out acsr,temp ;чегото там
sei ;завершенеи прерывание по сбросу

;-------------------------------------------
;ОСНОВНАЯ ПРОГРАМА.
;-------------------------------------------

main: ;имя части програмы
ldi r17,0b00001000 ;установка порта в 0
rcall mak1 ;вызов подпрограмы
rcall wait1 ;вызов задержки
ldi r17,0b00000100 ;установка порта в 1
rcall mak1 ;вызов подпрограмы
rcall wait1 ;вызов задержки
rjmp main ;безусловный переход

;---------------------------------------------------;
;ПРЕРЫВАНИЯ
;---------------------------------------------------;

int_0: ;метка вызова прерываный по порту int0
push temp ;сохранение регистра в стеке
in temp,SREG
push temp
ldi temp,2 ;запись в регистер числа 2
m3:
sbi portb,2 ;установка порта в 0
rcall wait2 ;вызов задержки
cbi portb,2 ;установка порта в 1
rcall wait2 ;вызов задержки
m4:
sbi portb,3 ;установка порта в 0
rcall wait2 ;вызов задержки
cbi portb,3 ;установка порта в 1
rcall wait2 ;вызов задержки
dec temp ;РОН:=РОН-1
brne m3 ;проверка РОН не ноль ли?? да едем дальше, нет возврат на метку
pop temp
out SREG,temp
pop temp ;востановления регистра из стека
reti ;конец прерывания
;---------------------------------------------------------------------;
;ПОДПРОГРАМЫ
;---------------------------------------------------------------------;
mak1:
ldi temp,3 ;запись в регистер 3
m2:
out portb,r17 ;установка порта в 0
rcall wait1 ;вызов задержки
out portb,r18 ;установка порта в 1
rcall wait1 ;вызов задержки
dec temp ;РОН:=РОН-1
brne m2 ;проверка РОНа не 0 ли?? да едем дальше, нет возврат на метку
ret

wait1: ;Все что снизу задержка на таймере.
push temp
ldi temp,0
out tcnt0,temp
wt1:
in temp,tcnt0
cpi temp,kdel
brlo wt1
pop temp
ret

wait2:
push temp
ldi temp,0
out tcnt0,temp
wt2:
in temp,tcnt0
cpi temp,kdel2
brlo wt2
pop temp
ret

Изменено пользователем hardbar

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

Ссылка на комментарий
Поделиться на другие сайты

У вас прерывание задано по низкому уровню на INT0.

А что за регистр GICR ?

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Коментар не правельно написал.Уже исправил.

У меня кнопка на минусе сидит а пин порта к плюсу подтянут. Когда кнопка нажимаеться на пин порта поступает минус, то есть спадающий фронт.

Но почему прерывание срабатывает в начале когда кнопка не нажата.

Изменено пользователем hardbar

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

Ссылка на комментарий
Поделиться на другие сайты

Потому что изначально у вас установлен флаг прерывания. В начале программы, до разрешения прерывания, очистите флаг прерывания записью в него 1.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо запретыл прерывание. И все работает норамльно.

;ПАМЯТЬ И УСТАНОВКА ПРЕРЫВАНИЙ
;--------------------------------------
.cseg	 ;выбор памяти. внашем случае работаем с flesh.
.org 0    ;начальный адрес
rjmp reset;прерывание по сбросу
rjmp int_0;прерывание по порту int0
.org 0x0b ;чтоб не писать reti много раз вместо векторов прерываний.сразу пропускаем их командой.
;----------------------------------------
;ИНИЦЫАЛИЗАЦЫЯ ПОРТОВ, ПРЕРЫВАНИЙ,ТАЙМЕРОВ.
;
reset:			 ;
cli			    ;запрет прерывания
ldi temp,ramend    ;чтото с памятю связано
out spl,temp	   ;
ldi  temp,(0<<ISC00)|(1<<ISC01) ;Условие прерывания - наростающий фронт сигнала
out  MCUCR,temp
ldi  temp,(1<<INT0)		  ;INT.Enable=1 Разрешаем прерывание INT0
out  GICR,temp
ldi temp,0b11111100;настройка порта на
out ddrb,temp	  ;вод.вывод
ldi temp,0b00000011;подтяжка резистрами
out portb,temp	 ;установка в порте лог.0
ldi temp,0x05	  ;пред-делитель
out tccr0b,temp    ;таймера
ldi temp,0x80	  ;отключение
out acsr,temp	  ;чегото там
ldi r19,200
sei			    ;разрешение прерывания

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

Ссылка на комментарий
Поделиться на другие сайты

Вопрос есть ли команда с точностю наоборот повторяющая SUBI. Нужно в AVR Studio. сложить РОН с числом без переноса. Даташит не помог, и в списке команд avr asm тоже не нашел. Там есть только команда ADD сложение РОН с РОН.

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

Ссылка на комментарий
Поделиться на другие сайты

Вычитайте отрицательное число или вначале число в РОН, а уж потом ADD POH1,POH.

PS. правильно говорить не "с числом", а "с константой".

Изменено пользователем korsaj
Ссылка на комментарий
Поделиться на другие сайты

Опять проблема. После второго нажатия кнопки программа зависает.

.include "tn13adef.inc"
.list
.def temp=r16 ;переименуем регистр под удобное имя
;--------------------------------------
;ПАМЯТЬ И УСТАНОВКА ПРЕРЫВАНИЙ
;--------------------------------------
.cseg	 ;выбор памяти. внашем случае работаем с flesh.
.org 0 ;начальный адрес
rjmp reset;прерывание по сбросу
.org 2
rjmp int_0;прерывание по порту int0
.org 0x0b ;чтоб не писать reti много раз вместо векторов прерываний.сразу пропускаем их командой.
;------------------------------------------
;ИНИЦЫАЛИЗАЦЫЯ ПОРТОВ, ПРЕРЫВАНИЙ,ТАЙМЕРОВ.
;------------------------------------------
reset:			 ;
cli			 ;запрет прерывания
ldi temp,ramend ;чтото с памятю связано
out spl,temp	 ;
ldi temp,0b00000100;3 пину разрешено рерыване
out PCMSK,temp
ldi temp,(1<<PCIE) ; глобальное разрешение прерывния для пинов порта
out GIMSK,temp
ldi temp,0b11111000;настройка порта на
out ddrb,temp	 ;вод.вывод
ldi temp,0b00000111;подтяжка резистрами
out portb,temp	 ;установка в порте лог.0
ldi temp,0x05	 ;пред-делитель
out tccr0b,temp ;таймера
ldi temp,0x80	 ;отключение
out acsr,temp	 ;чегото там
ldi r19,100
ldi r21,200
sei			 ;разрешение прерывания
;-------------------------------------------
;ОСНОВНАЯ ПРОГРАМА.
;-------------------------------------------
main:
cpi r20,0 ;сравнение с РОН
breq pro1 ;если равно переход по метке
cpi r20,1 ;сравнение с РОН
breq pro2 ;если равно переход по метке
cpi r20,2 ;сравнение с РОН
breq pro3 ;если равно переход по метке
cpi r20,3 ;сравнение с РОН
breq pro4 ;если равно переход по метке
cpi r20,4 ;сравнение с РОН
breq reg ;если равно переход по метке
rjmp main


pro1:			 ;имя части програмы:
ldi r17,0b00010111 ;установка порта в 0
rcall mak1		 ;вызов подпрограмы
rcall wait1		 ;вызов задержки
ldi r17,0b00001111 ;установка порта в 1
rcall mak1		 ;вызов подпрограмы
rcall wait1		 ;вызов задержки
rjmp main		 ;безусловный переход


pro2:	 ;програма мерцания светодиодом
cbi portb,4
rcall wait1
sbi portb,4
rcall wait1
rjmp main


pro3:	 ;програма мерцания светодиодом
cbi portb,3
rcall wait1
sbi portb,3
rcall wait1
rjmp main


pro4:			 ;програма мерцания 2 светодиодами
ldi r18,0b00000111
ldi r17,0b00011111
out portb,r17	
rcall wait2		
out portb,r18	
rcall wait2	
rjmp main


;---------------------------------------------------;
;ПРЕРЫВАНИЯ
;---------------------------------------------------;
int_0:	 ;метка вызова прерываный по порту int0
cli
nop
sbic portb,2
inc r20
sei
reti
;---------------------------------------------------------------------;
;ПОДПРОГРАМЫ														
;---------------------------------------------------------------------;
mak1:
ldi temp,3	 ;запись в регистер 3
m4:
out portb,r17 ;установка порта в 0
rcall wait1 ;вызов задержки
out portb,r18 ;установка порта в 1
rcall wait1 ;вызов задержки
dec temp	 ;РОН:=РОН-1
brne m4	 ;проверка РОНа не 0 ли?? да едем дальше, нет возврат на метку
ret


wait1:	 ;Все что снизу задержка на таймере.
push temp
ldi temp,0
out tcnt0,temp
wt1:
in temp,tcnt0
cp temp,r19
brlo wt1
pop temp
ret


wait2:	 ;Все что снизу задержка на таймере.
push temp
ldi temp,0
out tcnt0,temp
wt2:
in temp,tcnt0
cp temp,r21
brlo wt2
pop temp
ret


reg:	 ;обнуление РОНа
ldi r20,0
ret

Изменено пользователем hardbar

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

Ссылка на комментарий
Поделиться на другие сайты

Кто мешает сложить константу с регистровой парой?

hardbar, сделай одну функцию wait и перед вызовом загружай разные задержки в регистр R19(R21). А сейчас у тебя слишком много повторяющегося кода, читать сложно.

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

Вот это

reg: ;обнуление РОНа

ldi r20,0

ret

Неправильно. Это вызовет переполнение стека. Вы перешли сюда по метке, а не вызвали подпрограмму. Так вот, если переходите по метке то и уходите по метке.

нужно так:

reg: ;обнуление РОНа

ldi r20,0

rjmp main

Ссылка на комментарий
Поделиться на другие сайты

int_0: ;метка вызова прерываный по порту int0

cli

nop

sbic portb,2

inc r20

sei

reti

Красным всё лишнее.

Изменено пользователем Григорий Т.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

 .include "tn13adef.inc"
.list

.def temp=r16 ;переименуем регистр под удобное имя

;--------------------------------------
;ПАМЯТЬ И УСТАНОВКА ПРЕРЫВАНИЙ
;--------------------------------------
.cseg ;выбор памяти. внашем случае работаем с flesh.

.org 0 ;начальный адрес
rjmp reset ;прерывание по сбросу

.org 2
rjmp int_0 ;прерывание по порту int0

.org 0x0b
;------------------------------------------
;ИНИЦЫАЛИЗАЦЫЯ ПОРТОВ, ПРЕРЫВАНИЙ,ТАЙМЕРОВ.
;------------------------------------------

reset: ;
cli ;запрет прерывания
ldi temp,ramend ;чтото с памятю связано
out spl,temp ;

ldi temp,0b00000100 ;3 пину разрешено рерыване
out PCMSK,temp

ldi temp,(1<<PCIE) ;глобальное разрешение прерывния для пинов порта
out GIMSK,temp

ldi temp,0b11111000 ;настройка порта на
out ddrb,temp ;вод.вывод

ldi temp,0b00000111 ;подтяжка резистрами
out portb,temp ;установка в порте лог.0

ldi temp,0x05 ;пред-делитель
out tccr0b,temp ;таймера

ldi temp,0x80 ;отключение
out acsr,temp ;чегото там

ldi r19,100
ldi r21,200

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

;-------------------------------------------
;ОСНОВНАЯ ПРОГРАМА.
;-------------------------------------------
main:
cpi r20,0 ;сравнение с РОН
breq pro1 ;если равно переход по метке

cpi r20,1 ;сравнение с РОН
breq pro2 ;если равно переход по метке

cpi r20,2 ;сравнение с РОН
breq pro3 ;если равно переход по метке

cpi r20,3 ;сравнение с РОН
breq pro4 ;если равно переход по метке

cpi r20,4 ;сравнение с РОН
brne main ;если НЕ равно переход по метке

ldi r20,0 ;обнуление РОНа

rjmp main

;-------------------------------------------
pro1:
ldi r17,0b00010111 ;установка порта в 0
rcall mak1 ;вызов подпрограмы
rcall wait1 ;вызов задержки

ldi r17,0b00001111 ;установка порта в 1
rcall mak1 ;вызов подпрограмы
rcall wait1 ;вызов задержки

rjmp main ;безусловный переход

;-------------------------------------------
pro2: ;програма мерцания светодиодом
cbi portb,4
rcall wait1

sbi portb,4
rcall wait1

rjmp main

;-------------------------------------------
pro3: ;програма мерцания светодиодом
cbi portb,3
rcall wait1

sbi portb,3
rcall wait1

rjmp main

;-------------------------------------------
pro4: ;програма мерцания 2 светодиодами
ldi r17,0b00011111
out portb,r17

rcall wait2

ldi r18,0b00000111
out portb,r18

rcall wait2

rjmp main

;---------------------------------------------------;
;ПРЕРЫВАНИЯ
;---------------------------------------------------;
int_0: ;метка вызова прерываний по порту int0
;cli Эта команда здесь лишняя
;nop Эта команда здесь лишняя
sbic portb,2
inc r20
;sei Эта команда здесь лишняя
reti ;Если в прерывании есть команда которая воздействует на флаги, то
;необходимо при входе в прерывание сохранить регистр статуса SREG
;Если этого не сделать то в программе будут всевозможные,непредсказуемые сбои.

;---------------------------------------------------------------------;
;ПОДПРОГРАМЫ
;---------------------------------------------------------------------;
mak1:
ldi temp,3 ;запись в регистер 3

m4:
out portb,r17 ;установка порта в 0
rcall wait1 ;вызов задержки

out portb,r18 ;установка порта в 1
rcall wait1 ;вызов задержки

dec temp ;РОН:=РОН-1
brne m4 ;проверка РОНа не 0 ли?? да едем дальше, нет возврат на метку

ret
;---------------------------------------------------------------------;
; ПП задержки 1
;---------------------------------------------------------------------;
wait1: ;Все что снизу задержка на таймере.
push temp

ldi temp,0
out tcnt0,temp
wt1:
in temp,tcnt0
cp temp,r19
brlo wt1

pop temp
ret

;---------------------------------------------------------------------;
; ПП задержки 2
;---------------------------------------------------------------------;
wait2: ;Все что снизу задержка на таймере.
push temp
ldi temp,0
out tcnt0,temp
wt2:
in temp,tcnt0
cp temp,r21
brlo wt2

pop temp
ret


Движок форума ужасен, замучился вставлять код!!!

Изменено пользователем korsaj
Ссылка на комментарий
Поделиться на другие сайты

На счет РОНа вы не поняли. Каждый раз когда нажимаеться кнопка срабатывает прерывание которое добавляет в РОН r20 по +1. и Он должен обнуляться если значение РОНа дошло до 4. Ведь по РОНу определяеться какая програма должна работать в даный момент. В цикле main стоит проверка РОНа, и если его там постояно обнулять то програма дальше 0 програмы не сдвинеться.

А в остальном правы.

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

Ссылка на комментарий
Поделиться на другие сайты

Подчистил.

.include "tn13adef.inc"
.list

.def temp=r16 ;переименуем регистр под удобное имя

;--------------------------------------
;ПАМЯТЬ И УСТАНОВКА ПРЕРЫВАНИЙ
;--------------------------------------
.cseg ;выбор памяти. внашем случае работаем с flesh.

.org 0 ;начальный адрес
rjmp reset ;прерывание по сбросу

.org 2
rjmp int_0 ;прерывание по порту int0

.org 0x0b
;------------------------------------------
;ИНИЦИАЛИЗАЦИЯ ПОРТОВ, ПРЕРЫВАНИЙ,ТАЙМЕРОВ.
;------------------------------------------

reset: ;
cli ;запрет прерывания
ldi temp,ramend ;установка нижней границы стека
out spl,temp ;

ldi temp,0b00000100 ;3 пину разрешено рерыване
out PCMSK,temp

ldi temp,(1<<PCIE) ;глобальное разрешение прерывния для пинов порта
out GIMSK,temp

ldi temp,0b11111000 ;настройка порта на
out ddrb,temp ;вод.вывод

ldi temp,0b00000111 ;подтяжка резистрами
out portb,temp ;установка в порте лог.0

ldi temp,0x05 ;пред-делитель
out tccr0b,temp ;таймера

ldi temp,0x80 ;отключение
out acsr,temp ;чегото там

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

;-------------------------------------------
;ОСНОВНАЯ ПРОГРАМА.
;-------------------------------------------
main:
tst r20 ;проверка на нулевое значение
breq pro1 ;если равно переход по метке

cpi r20,1 ;сравнение с РОН
breq pro2 ;если равно переход по метке

cpi r20,2 ;сравнение с РОН
breq pro3 ;если равно переход по метке

cpi r20,3 ;сравнение с РОН
breq pro4 ;если равно переход по метке

cpi r20,4 ;сравнение с РОН
brne main ;если НЕ равно переход по метке

clr r20 ;обнуление РОНа

rjmp main

;-------------------------------------------
pro1:
ldi r19,100 ;задержка
ldi r17,0b00010111 ;установка порта в 0
rcall mak1 ;вызов подпрограмы
rcall wait ;вызов задержки

ldi r17,0b00001111 ;установка порта в 1
rcall mak1 ;вызов подпрограмы
rcall wait ;вызов задержки
rjmp main ;безусловный переход

;-------------------------------------------
pro2: ;програма мерцания светодиодом
ldi r19,100 ;задержка
ldi r17,0b00010000
ldi r18,0b00000000
rcall out_port
rjmp main

;-------------------------------------------
pro3: ;програма мерцания светодиодом
ldi r19,100 ;задержка
ldi r17,0b00001000
ldi r18,0b00000000
rcall out_port
rjmp main

;-------------------------------------------
pro4: ;програма мерцания 2 светодиодами
ldi r19,200 ;задержка
ldi r17,0b00011111
ldi r18,0b00000111
rcall out_port
rjmp main

;-------------------------------------------
out_port: ;подпрограмма вывода в порт
out portb,r17
rcall wait
out portb,r18
rcall wait
ret

;---------------------------------------------------;
;ПРЕРЫВАНИЯ
;---------------------------------------------------;
int_0: ;метка вызова прерываний по порту int0
in r5,SREG ;сохраним регистр статуса
sbic portb,2
inc r20
out SREG,r5 ;восстановим при выходе
reti

;---------------------------------------------------------------------;
;ПОДПРОГРАМЫ
;---------------------------------------------------------------------;
mak1:
ldi temp,3 ;запись в регистер 3
ldi r19,100 ;задержка
m4:
rcall out_port
dec temp ;РОН:=РОН-1
brne m4 ;проверка РОНа не 0 ли?? да едем дальше, нет возврат на метку
ret

;---------------------------------------------------------------------;
; ПП задержки
;---------------------------------------------------------------------;
wait: ;Все что снизу задержка на таймере.
ldi r25,0
out tcnt0,r25
wt1:
in r25,tcnt0
cp r25,r19
brlo wt1
ret

Да... Вставить блок кода проблематично.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо за код но он все равно не работает. НЕ мой не ваш. При запуске программа пропускает prog1 и начинает с prog2 после нажатия клавиши пропускает prog3 и после 3 нажатия виснет.

Но если поставить кнопку между reset и -. То при нажатии программа функционирует так как нужно. При сбросе программа меняеться. Точнее кнопка сброса работает как должна работать кнопка вызывающая прырывание Не понимаю в чем причина???

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

Ссылка на комментарий
Поделиться на другие сайты

.cseg ;выбор памяти. внашем случае работаем с flesh. //работаем с плотью?! С чьей, интересно.

.org 0 ;начальный адрес

rjmp reset ;прерывание по сбросу

.org 2

rjmp int_0 ;прерывание по порту int0 //а даташит считает, что INT0 находится по адресу 0х01, а по 0х02 - PCINT

.org 0x0b

Чтобы не мучиться с адресами прерываний, я обычно просто копирую таблицу векторов из даташита:

rjmp RESET
reti;INTO
rjmp PCINT
reti;TIMER0OVF
reti;EE_RDY
reti;ANA_COMP
reti;TIMER0COMPA
reti;TIMER0 COMPB
reti;WDT
reti;ADC

В RESET'е нет инициализации r20 (кстати, дали бы ей имя, что ли .def prognum=r20). В прерывании нет защиты от дребезга, оно может отрабатывать произвольное число раз.

Движок форума ужасен, замучился вставлять код!!!
Вот с этим согласен!

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Нашел причину. Все из за подтяжки пинов резисторами. Прерывание работает когда уровень на пине меняеться с 0 на 1 или с 1 на 0.

Снял подтяжку по всем регистрам. И теперь работает только 1 команда так как прерывание не вызываеться. и в регистер не записываеться +1.

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

Ссылка на комментарий
Поделиться на другие сайты

А чему у вас равно r20 после старта??? Его нужно обнулить при старте. Есть хорошее правило - инициализировать все перед началом основного цикла. Еще замечание, как вы узнаете что r20 больше 4? Вывод, выход за диапазон стоит проверять в прерывании, так как в основной программе вы не заметите что r20 стало равно 4 или больше.

Насчет подтяжки - я в начале писал что у вас сразу установлен флаг прерывания - именно из-зи подтяжки. В реальной схеме (в протеусе это тоже симулируется) есть некая емкость вывода порта. Это влечет за собой некоторую задержку установки лог 1 на выводе. За это время в мк устанавливается флаг прерывания. Именно по этому я написал, что нужно сбросить флаг изменения уровня на выводе порта (именно этот флаг и вызывает первое прерывание).

Изменено пользователем korsaj
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...