Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ILYAUL »

В прерываниях вместо rjmp MAIN поставьте reti
При входе в прерывания флаг глобального разрешения прерываний сбрасывается и Ваш rjmp его не возвращает.
Аватара пользователя
Vicont
Прорезались зубы
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Vicont »

Спасибо. Теперь разобрался.
А раньше я все думал: почему же при выходе из обработчика прерываний пишется не ret а reti... :)))
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Alexeyslav »

Да, будь внимательнее. Многие вещи делаются не просто так...
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение спящий »

Подскажите в чем прикол:


prer: ;прерывание по CTC
ldi temp,(1<<int0) ;
out EIMSK,temp;
reti


preriv: ;прерывание по INTO
sbrc r23,0;
rjmp dalshe;
reti

как только заканчивается прерывание по СТС тут же начинается прерывание по INTO ,хотя изменение сигнала вообще нет(как было 5В так и осталось),можно его какнить запретить до изменения сигнала?
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение спящий »

после каждых разных прерывание(INTO СТС) тут же делает другое.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

как только заканчивается прерывание по СТС тут же начинается прерывание по 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.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ILYAUL »

Настройки покажите и какой проц
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

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 в вопросах и ответах

Сообщение Alexeyslav »

Не сохраняется... где ему сохранится? Флаги все на месте! Просто после обработки прерывания и разрешения выполняется одна инструкция и снова проверяются флаги прерываний... если ты обрабатывал таймер - ты сбросил флаг, но флаг прерывания по уровню остался, он аппаратный - поэтому тут же после обработки прерывания выполняется следующее и так пока не будут сброшены все разрешенные флаги прерываний. В обработчике прерывания от таймера можно сбросить прерывание по уровню, если это нужно.
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение спящий »

Ну в принцие я это и имел ввиду)просто неправильно выразился :))
я пробывал вписать в прерыванию по таймеру сбросить :
clr temp;
sts EIFR,temp;
непомогло,я правильно написал?а при следующем смене сигнала,должен происходить прерывание?
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Alexeyslav »

Смотри даташит, там все написано как правильно сбрасывать прерывание. Просто имеет значение ГДЕ ты его сбрасываешь. Ведь между сбросом и выходом из прерывания оно может возникнуть вновь, признак прерывания ведь аппаратный - обыкновенный асинхронный триггер.
По этой причине разрешать прерывания тоже надо аккуратно, сначала сбросить признак прерывания(даже если он не установлен) затем его разрешить. Иначе после следующей команды после разрешения получишь прерывание.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15552
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение BOB51 »

:shock:
при обращении к РСФ как к ячейке памяти адрес должен быть (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;
Дальше никуда не идет.
Помогите што делать штоб замигало?
Betelgeuse
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

Весь код выложите.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15552
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение BOB51 »

так Сии не асм... 8)
Аватара пользователя
КотЭ Мужчина
Открыл глаза
Сообщения: 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 в вопросах и ответах

Сообщение Gudd-Head »

Код: Выделить всё

;ldi Temp,RamEnd - ЛДИ Темпа и РамЕнда не проходит в АТмега8А, так как 16-битку у 8 битный регистр не засунешь
;out SPL,Temp

БЛЯАААаха-хахах.... :))) :facepalm: :facepalm: :facepalm:

В даташите сразу после описания вектора прерываний есть пример кода установки стека.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Engineer_Keen »

Мда, весело... Стек не помещается в регистр, значит инициализировать его не надо :facepalm:
Ну и помимо прочего: константы загружаются (ldi), а в порт где они выводятся?
И отладка скорее всего не виснет, просто много циклов выполняется в том месте.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

Engineer_Keen писал(а):Ну и помимо прочего: константы загружаются (ldi), а в порт где они выводятся?

В процедуре задержки.
Светик потому и не моргает, что стек не инициализирован.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение shads »

помоему так стек инициализируется:

Код: Выделить всё

 ldi Temp,low(RamEnd); 
 out SPL,Temp
 ldi Temp,hi(RamEnd);
 out SPH,Temp

Надо помоч человеку. Он на героический поступок пошел - изучать ассемблер после C......
Я ле 20 на асме писал, ща кое как C почти освоил, так теперь как ассемблерный проект (старый) открою, так сразу мутить меня начинает.....
(я не говорю о программках где светодиодом мигают, я говорю о проектах в килобайты..... на асме.....)
Ответить

Вернуться в «AVR»