Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывание на ASM
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
_Артём_
Всем привет!

Нужно написать обработчик прерывания на ассемблере (остальная программа на Си);
процессор - AtxMega256A3, компилятор - IAR.

Нет ли у кого-нибудь примера кода?

Спасибо.
SasaVitebsk
Цитата(_Артём_ @ Feb 6 2011, 21:48) *
Всем привет!

Нужно написать обработчик прерывания на ассемблере (остальная программа на Си);
процессор - AtxMega256A3, компилятор - IAR.

Нет ли у кого-нибудь примера кода?

Спасибо.

А что именно Вам непонятно.
Код
    COMMON  INTVEC
    ORG     INT0_vect
    rjmp    loader


Код
        ORG        TIMER2_OVF_vect
        rjmp    TimeOutFor485


PS: Прошу прощения, это для обычной меги. Думаю, что для xmega будет аналогично, кроме, естественно имён векторов.
GDI
Почитайте в хэлпе как асм код встраивать в Си, точно не помню, нужно что-то типа
Код
#pragma asm+
... тут асм код...
#pragma asm-
_Артём_
Цитата(SasaVitebsk @ Feb 7 2011, 13:53) *
А что именно Вам непонятно.
Код
    COMMON  INTVEC
    ORG     INT0_vect
    rjmp    loader


Код
        ORG        TIMER2_OVF_vect
        rjmp    TimeOutFor485


PS: Прошу прощения, это для обычной меги. Думаю, что для xmega будет аналогично, кроме, естественно имён векторов.


Попробовал подключить к проекту файл:
Код
    NAME sst_spi
    
#include "ATxmega256A3.h"
    COMMON    INTVEC
    ORG        TCE1_OVF_vect
    RJMP    tce1_ovf_handler
  
  
  
    RSEG CODE; This code is relocatable, RSEG
    
    
tce1_ovf_handler:
    push r16
    in   r16,0x3f
    push r16
    push r17
    
    pop R17
    pop r16
    out   0x3f,r16
    pop r16
    
    reti    
    
END


IAR на ошбки не ругается, но работает как-то криво - явно что-то неправильно...
Но вот что?


defunct
Цитата(_Артём_ @ Feb 7 2011, 15:33) *
IAR на ошбки не ругается, но работает как-то криво - явно что-то неправильно...
Но вот что?

Попробуйте оттрассировать. (точку останова на каждый элемент таблицы векторов).
Благо конкретно в этой ситуации можно и симулятором воспользоваться.
andk
Все таки напишите, что нужно получить в итоге.
Сишный код у последних компиляторов вполне себе компактный, может асм и не нужен вовсе?
По приведенному выше коду:
Откуда уверенность, что сишный компилятор оставил вам достаточно стека?
совет от defunct +1
_Артём_
Попытаюсь описать что не так...

Программа компилится без ошибок, вроде бы правильно работает.
Но есть странности:
при установке точки прерывания симулятор (AVRStudio) открывает не мой исходный файл а окно Disasemdler-а, что странно и неудобно.



Цитата(andk @ Feb 7 2011, 16:59) *
Все таки напишите, что нужно получить в итоге.


В итоге хотелось бы:
прерывание должно быть написано в asm-файле, остальная программа на Си. И чтобы всё это работало...


Цитата(andk @ Feb 7 2011, 16:59) *
Сишный код у последних компиляторов вполне себе компактный, может асм и не нужен вовсе?


Можно и обойтись, но что-то слишком медленный код у IAR получился.

Цитата(andk @ Feb 7 2011, 16:59) *
Откуда уверенность, что сишный компилятор оставил вам достаточно стека?

Не то чтобы уверенность, я о стеке и не подумал...
ILYAUL
Цитата(_Артём_ @ Feb 7 2011, 19:39) *
Попытаюсь описать что не так...

Программа компилится без ошибок, вроде бы правильно работает.
Но есть странности:
при установке точки прерывания симулятор (AVRStudio) открывает не мой исходный файл а окно Disasemdler-а, что странно и неудобно.
Не то чтобы уверенность, я о стеке и не подумал...

А Вы стек вообще-то определили? Команды push и pop без стека не работают и не удивительно , что открывается Disasm. Компилятор не проверяет логику.
_Артём_
Цитата(ILYAUL @ Feb 7 2011, 19:28) *
А Вы стек вообще-то определили? Команды push и pop без стека не работают и не удивительно , что открывается Disasm. Компилятор не проверяет логику.


Стек определил. С запасом... потому и задумывался о нём...

ILYAUL
Цитата(_Артём_ @ Feb 7 2011, 21:19) *
Стек определил. С запасом... потому и задумывался о нём...

Что значит "...С запасом.. " Оределяют только "вершину" стека -обычно старший адрес общего адресного пространства SRAM, далее , как вершина айсберга, всё что туда вкладывается стремится к нулю. Так , что Ваш запас - это весь объём SRAM. C начального адреса SRAM обычно записываются все необходимые данные , которые Вы используете в программе. Так вот - нет ли перехлёста данных "впихнутых" в SRAM c данными записанными Вашей программой по тем же адресам SRAM
V_G
У вас прерывание единственное?
Когда несколько прерываний с разными приоритетами, нужно учитывать возможность вклинивания более приоритетного прерывания между извлечением статуса из стека и восстановлением статуса. Я на выходах из прерываний использую такую конструкцию:
Код
    POP        r16
    CLI
    POP        ac_tmp
    OUT        CPU_SREG,ac_tmp;restore Status register
    RETI
_Артём_
Цитата(V_G @ Feb 8 2011, 08:01) *
У вас прерывание единственное?
Когда несколько прерываний с разными приоритетами, нужно учитывать возможность вклинивания более приоритетного прерывания между извлечением статуса из стека и восстановлением статуса. Я на выходах из прерываний использую такую конструкцию:
Код
    POP        r16
    CLI
    POP        ac_tmp
    OUT        CPU_SREG,ac_tmp;restore Status register
    RETI


Зачем CLI?
ПРерывание произойдёт и что будет?
Палыч
Цитата(V_G @ Feb 8 2011, 09:01) *
нужно учитывать возможность вклинивания более приоритетного прерывания между извлечением статуса из стека и восстановлением статуса.
При входе в прерывание аппаратно сбрасывается флаг разрешения прерывания (речь, надеюсь, про AVR). В очень редких случаях, бывает, прерывания разрешают, но - только, если это действительно нужно и без этого не обойтись (обычно, такое - результат неправильного построения вычислительного процесса). Поэтому, никакого "вклинивания" при выполнении процедуры прерывания - нет (посему: команда CLI - абсолютно излишния). Да, и если - есть, то как это приведёт к "нехорошим" последствиям в интервале "между извлечением статуса из стека и восстановлением статуса" ?
_Артём_
Цитата(Палыч @ Feb 8 2011, 15:54) *
При входе в прерывание аппаратно сбрасывается флаг разрешения прерывания (речь, надеюсь, про AVR).


В xmega не сбрасывается.
_Артём_
В завершении темы выкладываю пример проекта на Си с asm-функцией прерывания.
Может пригодится кому-нибудь или кто покритикует...Нажмите для просмотра прикрепленного файла
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.