; ; z1.asm ; ; ; Author : Superson Wojciech .org 0 ;dyrektywa wymuszająca położenie następujących po niej rozkazów poczynając od adresu 0x000 jmp Reset ;adres 0x000 to wektor przerwania inicjalizacyjnego umieszczmy tutaj skok bezposredni do podprogramu reset jmp Ext_int1 ;adres 0x004 to wektor przerwania zewnętrznego INT0 skok bezpośredni do podprogramu Ext_int1 Reset: ; podprogram obsługi przerwania inicjalizacyjnego ldi R16, HIGH(RAMEND) out SPH, R16 ldi R16, LOW(RAMEND) out SPL, R16 ;inicjalizacja stosu sei ;zezwolenie na obsługę przerwań ser R16 ;ustawienie wszystkich bitow rejestru R16 out DDRA, R16 ;ustawienie wszystkich pinow PA jako wyjściowe out DDRB, R16 ;ustawienie wszystkich pinow PB jako wyjściowe ldi R16, 0b11110000 ;załaduj stałą 11110000(b) -> R16 out PORTA, R16 ;wyjscie na PA wartosci 11110000(b) in R16, MCUCR ;wczytanie rejestr MCUCR -> R16 ori R16, 0b00000100 ;ustawienie R16.1 = 1 andi R16, 0b11110111 ;ustawienie R16.0 = 0 out MCUCR, R16 ;ustawienie trybu 'any logical change' dla przerwania INT1 in R16, GICR ;wczytanie rejestru GICR -> R16 ori R16, 0b10000000 ;ustawienie R16.6=1 out GICR, R16 ;odblokowanie przerwania INT1 jmp start ;skocz do programu głównego Ext_int1: ;podrpogram obsługi przerwania INT0 cli ;zablokuj obsługę przerwań push R16 ;zabezpieczenie zawartości R16 na stosie in R16, SREG ;wczytanie rejestru SREG -> R16 push R16 ;zabezpieczenie zawartości SREG na stosie in R16, PORTA ;wczytanie rejstru PORTA -> R16 com R16 ;negowanie bitow R16 out PORTA, R16 ;zapisanie zawartości rejestru R16 w rejestrze PORTA pop R16 ;zdejmij ze stosu pierwotną wartość SREG i zapisz w R16 out SREG, R16 ;przywrócenie zachowanego SREG pop R16 ;przywrócenie zachowanego R16 reti ;powróć z podprogramu obsługi przerwania INT0 start: ;program główny ldi R16, 0 ;wczytanie wartości 0 -> R16 ldi R17, -2 ;wczytanie wartości -2 -> R17 add R17, R16 ;dodanie wartości 0 do wartości -2 rcall opoznienie256 ;wywołanie podprogramu opozniajacego brbs 4, ujemny ;skok do etykiety jeśli wynik był ujemny nieujemny: ldi R16, 0b01010101 ;wczytanie wartości 01010101(b) -> R16 (wynik nieujemny) rjmp dalej ;pominięcie ustawiania wartości dla wyniku ujemnego ujemny: ldi R16, 0b10101010 ;wczytanie wartości 10101010(b) -> R16 (wynik ujemny) dalej: out PORTB, R16 ;zapisanie wartość rejestru R16 w rejestrze PORTB jmp start ;dopis zapętlający program główny opoznienie256: nop ;procedura opozniajaca o 256 cykli nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop ret ; powróć z podprogramu