Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <avr/interrupt.h>
- #include <stdalign.h>
- #include <stdint.h>
- static alignas(256) uint8_t regs[4];
- volatile register uint8_t regsh asm("r30");
- volatile register uint8_t regsl asm("r31");
- ISR_NAKED ISR(PCINT1_vect)
- {
- asm volatile(
- // чтение шины адреса
- "in r31, %0 \n\t"
- "andi r31, 0xfc \n\t"
- // установка указателя на образ регистра
- "ld r31, Z \n\t"
- "out %1, r31 \n\t"
- "ldi r31, 0xff \n\t"
- "out %2, r31 \n\t"
- ::
- "I"_SFR_IO_ADDR(PORTA),
- "I"_SFR_IO_ADDR(PORTB),
- "I"_SFR_IO_ADDR(DDRB)
- );
- //asm volatile("sbi %0, 0x07" :: "I" (_SFR_IO_ADDR(PORTB)));
- // управление итд DRQ INRQ
- asm volatile(
- // переключение порта на вход
- "ldi r31, 0x00 \n\t"
- "out %0, r31 \n\t"
- "reti\n\t"
- ::
- "I"_SFR_IO_ADDR(DDRB)
- );
- }
- int main(void)
- {
- regsh = (uint16_t)regs >> 8;
- regsl = (uint16_t)regs & 0xff; // должно быть 0 в бинарнике
- while (1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement