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

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

Сообщение ILYAUL »

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

Сообщение Vicont »

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

Сообщение Alexeyslav »

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

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

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


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

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

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

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

Сообщение ILYAUL »

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

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

Мне кажется делов в ненастройках 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 КБ) 727 скачиваний
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

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

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

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

Сообщение Alexeyslav »

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

Сообщение BOB51 »

:shock:
при обращении к РСФ как к ячейке памяти адрес должен быть (name+0x20)
для Вас хотя-бы как-то так:
sts (EIFR+0х20),temp
не говоря уже каким уровнем сбрасывается флаг - читать конкретный даташит на выбранную ИС надо - у аврок где 1, а где 0 требуется ...
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Ср июн 20, 2012 10:49:46
Откуда: Україна, Черкаська область

Сообщение КотЭ Мужчина »

Здравствуйте комраден! Вот начал учить асм для АТмега8. Делал мигалку для данного камня, учился по обучалке. В разделе "Бегущий огонек с функциями", я написал такую прошивку, ну скомпилил ее, протестировал в Протеусе, вроде мигают светоидиоты. Залил в реальный камень (у меня ATmega8A), но там загорелся PORTB,0 и все, не мигает ништо, хотя я настроил мигалку на PB0, PB1, PB2. На Си все мигает. Даже симулировал в AVR Studio 4.19, Studio 5, Atmel Studio 6 - везде на пошаговой отладке все застраяет на
Loop:
dec Temp1;
brne Loop;
Дальше никуда не идет.
Помогите што делать штоб замигало?
Betelgeuse
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Сообщение BOB51 »

так Сии не асм... 8)
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Ср июн 20, 2012 10:49:46
Откуда: Україна, Черкаська область

Сообщение КотЭ Мужчина »

Спойлер.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
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

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

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

Сообщение Engineer_Keen »

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

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

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

Сообщение shads »

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

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

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

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