Ассемблер (ASM) для AVR в вопросах и ответах
Re: Ассемблер (ASM) для AVR в вопросах и ответах
В прерываниях вместо rjmp MAIN поставьте reti
При входе в прерывания флаг глобального разрешения прерываний сбрасывается и Ваш rjmp его не возвращает.
При входе в прерывания флаг глобального разрешения прерываний сбрасывается и Ваш rjmp его не возвращает.
- Vicont
- Прорезались зубы
- Сообщения: 201
- Зарегистрирован: Пт июл 25, 2008 14:09:04
- Откуда: Зауралье
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Спасибо. Теперь разобрался.
А раньше я все думал: почему же при выходе из обработчика прерываний пишется не ret а reti...
А раньше я все думал: почему же при выходе из обработчика прерываний пишется не ret а reti...
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да, будь внимательнее. Многие вещи делаются не просто так...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Подскажите в чем прикол:
prer: ;прерывание по CTC
ldi temp,(1<<int0) ;
out EIMSK,temp;
reti
preriv: ;прерывание по INTO
sbrc r23,0;
rjmp dalshe;
reti
как только заканчивается прерывание по СТС тут же начинается прерывание по INTO ,хотя изменение сигнала вообще нет(как было 5В так и осталось),можно его какнить запретить до изменения сигнала?
prer: ;прерывание по CTC
ldi temp,(1<<int0) ;
out EIMSK,temp;
reti
preriv: ;прерывание по INTO
sbrc r23,0;
rjmp dalshe;
reti
как только заканчивается прерывание по СТС тут же начинается прерывание по INTO ,хотя изменение сигнала вообще нет(как было 5В так и осталось),можно его какнить запретить до изменения сигнала?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
после каждых разных прерывание(INTO СТС) тут же делает другое.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
как только заканчивается прерывание по СТС тут же начинается прерывание по INTO ,хотя изменение сигнала вообще нет(как было 5В так и осталось)
А как оно (INT0) настроено? Если на высокий уровень, то так и должно быть.
... хотя нет:
Код: Выделить всё
; ISC01 ISC00
; 0 0 - The low level of INT0 generates an interrupt request.
; 0 1 - Any logical change on INT0 generates an interrupt request.
; 1 0 - The falling edge of INT0 generates an interrupt request.
; 1 1 - The rising edge of INT0 generates an interrupt request.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Настройки покажите и какой проц
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Мне кажется делов в ненастройках INTO и CTC ,где то я прочитал ,что сначало делается одно прерывание,и если происходит во время него второе,там сохраняется флаг,и после первого,выполняется второй?

Спойлер
Код: Выделить всё
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m48def.inc"
.list
.nolist
.list
;
.def temp =r16;
.def delay =r17;
.def delay1 =r18;
.equ XTAL = 8000000
.equ baudrate = 9600
.equ bauddivider = XTAL/(16*baudrate)-1
.org 0x000
rjmp init;
.org INT0addr
rjmp preriv;
.org 0x000b
rjmp perepoln; совпадение CTC
rjmp init;
init:
ldi r16,high(RAMEND) ;
out SPH,r16 ;
ldi r16,low(RAMEND) ;
out SPL,r16 ;
ldi temp,0b11111111;
out DDRB,temp;
ldi temp,0b11111111;
out DDRc,temp;
ldi temp,0b00110010;
out DDRD,temp;
sei;
;прерывание по INTO
ldi temp,(1<<int0) ;int0
out EIMSK,temp; ;
ldi temp,(0<<isc00)|(1<<isc01);
sts EICRA,temp;
LDI temp,0b00000100;
out PortD,temp;
;прерывание по совпадению
Ldi temp,0
sts TCCR1A,temp;
Ldi temp,(1<<CS11)|(1<<WGM12)|(0<<WGM13);делитель 8,режим CTC
sts TCCR1B,temp;
Ldi temp,(0<<OCIE1A);прерыание при сравнении TNT и OCRA
sts TIMSK1,temp;
ldi temp,0;
sts TCNT1H,temp;
sts TCNT1l,temp;
start:
nop;
rjmp start;
;ПРЕРЫВАНИЕ ПО СТС
perepoln:
inc r24;
cpi r24,18;
breq vixod_perepoln;
ldi temp,0;
sts TCNT1H,temp;
sts TCNT1l,temp;
sts OCR1Ah,r27;
sts OCR1Al,r28;
reti
vixod_perepoln:
ldi temp,(1<<int0) ;разрешаем прерывание int0
out EIMSK,temp;
Ldi temp,(0<<OCIE1A);запрещаем прерыание при сравнении TNT и OCRA
sts TIMSK1,temp;
clr r24;
reti
;ПРЕРЫВАНИЕ ПО INTO
preriv:
sbrc r23,0;
rjmp dalshe;
inc r23;
ldi temp,0;
sts TCNT1H,temp;
sts TCNT1l,temp;
rjmp exit_into;
dalshe:
lds r27,TCNT1H;
lds r28,TCNT1l;
lds r25,TCNT1H;
lds r26,TCNT1l;
clr r23;
ldi temp,(0<<int0) ;запрещаем прерывание int0
out EIMSK,temp;
Ldi temp,(1<<OCIE1A);разрешаем прерыание при сравнении TNT и OCRA
sts TIMSK1,temp;
lsr r26;просто сдвиг
ror r25
lsr r26;просто сдвиг
ror r25
ldi temp,0;
sts TCNT1H,temp;
sts TCNT1l,temp;
sts OCR1Ah,r25;
sts OCR1Al,r26;
exit_into:
reti- Вложения
-
- Безымянный.GIF
- (8.72 КБ) 723 скачивания
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Не сохраняется... где ему сохранится? Флаги все на месте! Просто после обработки прерывания и разрешения выполняется одна инструкция и снова проверяются флаги прерываний... если ты обрабатывал таймер - ты сбросил флаг, но флаг прерывания по уровню остался, он аппаратный - поэтому тут же после обработки прерывания выполняется следующее и так пока не будут сброшены все разрешенные флаги прерываний. В обработчике прерывания от таймера можно сбросить прерывание по уровню, если это нужно.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну в принцие я это и имел ввиду)просто неправильно выразился
я пробывал вписать в прерыванию по таймеру сбросить :
clr temp;
sts EIFR,temp;
непомогло,я правильно написал?а при следующем смене сигнала,должен происходить прерывание?
я пробывал вписать в прерыванию по таймеру сбросить :
clr temp;
sts EIFR,temp;
непомогло,я правильно написал?а при следующем смене сигнала,должен происходить прерывание?
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Смотри даташит, там все написано как правильно сбрасывать прерывание. Просто имеет значение ГДЕ ты его сбрасываешь. Ведь между сбросом и выходом из прерывания оно может возникнуть вновь, признак прерывания ведь аппаратный - обыкновенный асинхронный триггер.
По этой причине разрешать прерывания тоже надо аккуратно, сначала сбросить признак прерывания(даже если он не установлен) затем его разрешить. Иначе после следующей команды после разрешения получишь прерывание.
По этой причине разрешать прерывания тоже надо аккуратно, сначала сбросить признак прерывания(даже если он не установлен) затем его разрешить. Иначе после следующей команды после разрешения получишь прерывание.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
при обращении к РСФ как к ячейке памяти адрес должен быть (name+0x20)
для Вас хотя-бы как-то так:
sts (EIFR+0х20),temp
не говоря уже каким уровнем сбрасывается флаг - читать конкретный даташит на выбранную ИС надо - у аврок где 1, а где 0 требуется ...
- КотЭ Мужчина
- Открыл глаза
- Сообщения: 64
- Зарегистрирован: Ср июн 20, 2012 10:49:46
- Откуда: Україна, Черкаська область
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Здравствуйте комраден! Вот начал учить асм для АТмега8. Делал мигалку для данного камня, учился по обучалке. В разделе "Бегущий огонек с функциями", я написал такую прошивку, ну скомпилил ее, протестировал в Протеусе, вроде мигают светоидиоты. Залил в реальный камень (у меня ATmega8A), но там загорелся PORTB,0 и все, не мигает ништо, хотя я настроил мигалку на PB0, PB1, PB2. На Си все мигает. Даже симулировал в AVR Studio 4.19, Studio 5, Atmel Studio 6 - везде на пошаговой отладке все застраяет на
Loop:
dec Temp1;
brne Loop;
Дальше никуда не идет.
Помогите што делать штоб замигало?
Loop:
dec Temp1;
brne Loop;
Дальше никуда не идет.
Помогите што делать штоб замигало?
Betelgeuse
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Весь код выложите.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
так Сии не асм... 
- КотЭ Мужчина
- Открыл глаза
- Сообщения: 64
- Зарегистрирован: Ср июн 20, 2012 10:49:46
- Откуда: Україна, Черкаська область
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Спойлер
.cseg.org 0
;ldi Temp,RamEnd - ЛДИ Темпа и РамЕнда не проходит в АТмега8А, так как 16-битку у 8 битный регистр не засунешь
;out SPL,Temp
ldi Temp,0b00000111 ;настройка портов
out DDRB,Temp
Begin: ldi Temp,0b00000001 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки
ldi Temp,0b00000010 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки
ldi Temp,0b00000100 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки
rjmp Begin ;поехали по новой!
;****************************************************
;Задержка
Delay: out PortB,Temp
ldi Temp1,0
ldi Temp2,5
ldi Temp3,4
Loop: dec Temp1; На этом месте отладка в Студии зависает, зацикливается
brne Loop; тут тоже виснет
dec Temp2
brne Loop
dec Temp3
brne Loop
ret
Вот такой исходник. Прошу помощи.
Betelgeuse
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Код: Выделить всё
;ldi Temp,RamEnd - ЛДИ Темпа и РамЕнда не проходит в АТмега8А, так как 16-битку у 8 битный регистр не засунешь
;out SPL,TempБЛЯАААаха-хахах....

В даташите сразу после описания вектора прерываний есть пример кода установки стека.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Engineer_Keen
- Друг Кота
- Сообщения: 3868
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Мда, весело... Стек не помещается в регистр, значит инициализировать его не надо
Ну и помимо прочего: константы загружаются (ldi), а в порт где они выводятся?
И отладка скорее всего не виснет, просто много циклов выполняется в том месте.
Ну и помимо прочего: константы загружаются (ldi), а в порт где они выводятся?
И отладка скорее всего не виснет, просто много циклов выполняется в том месте.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Engineer_Keen писал(а):Ну и помимо прочего: константы загружаются (ldi), а в порт где они выводятся?
В процедуре задержки.
Светик потому и не моргает, что стек не инициализирован.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
помоему так стек инициализируется:
Надо помоч человеку. Он на героический поступок пошел - изучать ассемблер после C......
Я ле 20 на асме писал, ща кое как C почти освоил, так теперь как ассемблерный проект (старый) открою, так сразу мутить меня начинает.....
(я не говорю о программках где светодиодом мигают, я говорю о проектах в килобайты..... на асме.....)
Код: Выделить всё
ldi Temp,low(RamEnd);
out SPL,Temp
ldi Temp,hi(RamEnd);
out SPH,Temp
Надо помоч человеку. Он на героический поступок пошел - изучать ассемблер после C......
Я ле 20 на асме писал, ща кое как C почти освоил, так теперь как ассемблерный проект (старый) открою, так сразу мутить меня начинает.....
(я не говорю о программках где светодиодом мигают, я говорю о проектах в килобайты..... на асме.....)