Advertisement
Guest User

Untitled

a guest
Jun 7th, 2017
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.04 KB | None | 0 0
  1.  
  2. #include <avr/interrupt.h>
  3. #include <stdalign.h>
  4. #include <stdint.h>
  5.  
  6. static alignas(256) uint8_t regs[4];
  7.  
  8. volatile register uint8_t regsh asm("r30");
  9. volatile register uint8_t regsl asm("r31");
  10.  
  11. ISR_NAKED ISR(PCINT1_vect)
  12. {
  13.     asm volatile(
  14.         // чтение шины адреса
  15.         "in     r31, %0   \n\t"            
  16.         "andi   r31, 0xfc \n\t"
  17.         // установка указателя на образ регистра
  18.         "ld     r31, Z    \n\t"
  19.         "out    %1, r31   \n\t"
  20.         "ldi    r31, 0xff \n\t"
  21.         "out    %2, r31   \n\t"
  22.         ::
  23.         "I"_SFR_IO_ADDR(PORTA),
  24.         "I"_SFR_IO_ADDR(PORTB),
  25.         "I"_SFR_IO_ADDR(DDRB)
  26.     );
  27.        
  28.     //asm volatile("sbi %0, 0x07" :: "I" (_SFR_IO_ADDR(PORTB)));
  29.        
  30.     // управление итд DRQ INRQ
  31.        
  32.     asm volatile(
  33.         // переключение порта на вход
  34.         "ldi    r31, 0x00 \n\t"
  35.         "out    %0, r31   \n\t"
  36.         "reti\n\t"
  37.         ::
  38.         "I"_SFR_IO_ADDR(DDRB)
  39.     );
  40. }
  41.  
  42. int main(void)
  43. {
  44.     regsh = (uint16_t)regs >> 8;
  45.     regsl = (uint16_t)regs & 0xff; // должно быть 0 в бинарнике
  46.    
  47.     while (1);    
  48. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement