ReAl (14.06.2007 17:12, просмотров: 1) ответил Т.Достоевский на Превед! Ксати у меня подобная праблема! Как сделать в иаре так: ?
Или так, как С++ посоветовал. На avr-gcc это выглядело бы как-то так: <c>
#include <avr/io.h>
#include <avr/interrupt.h>
uint8_t val;
/* сама сохранит что надо и восстановит */
void INT0_vect_body(void) __attribute__((signal));
void INT0_vect_body(void)
{
if( --val == 0 ) {
val = 100;
}
}
void INT0_vect(void) __attribute__((naked));
void INT0_vect(void)
{
/* быстренько-быстренько выталкиваеем val в порт
* С фиксацией регистров не разбирался, поэтому зачитываем из памяти
* Сохраняем/восстанавливаем минимум. К сожалению, в INT0_vect_body() этот __tmp_reg__ сохранится/восстановится ещё раз,
* но больше я за 5 минут не придумал. Я как-то без такого обходился.
*/
__asm__ volatile (
"push __tmp_reg__ \n\t"
"lds __tmp_reg__, val \n\t"
"out %0, __tmp_reg__ \n\t"
: : "I" (_SFR_IO_ADDR(PORTB))
);
sei();
INT0_vect_body();
__asm__ volatile (
"pop __tmp_reg__ \n\t"
"reti"
: :
);
}
void main(void)
{
/* понятное дело - тут нужно кучу всего, но это непринципиально */
for(;;);
}
</c>