ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
15 мая
91676 Топик полностью
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>