Witam, mam kilka pytań dotyczących asemblera pod avr i nie tylko.
Dlaczego nie mogę się odwoływać do rejestrów poniżej 15 np r1 przez instrukcję ldi?
Czy ustawienie pinu jako wejście z pull-up'em oznacza że jego stan początkowy równy jest 1?
Ze wszystkich pinów mogę korzystać normalnie jeśli w odpowiednich rejestrach nie ustawie bitów odpowiedzialnych za ich inne funkcje(np. ADC, int0 itd.)?
Jak wygląda definiowanie zmiennych?
Oto schemat i program do sprawdzenia. Mam wątpliwości co do microswitchy i ustawień pinu jako wejście, a także przerwania INT0
Za wytykanie czytelności kodu//schematu także będę wdzięczny.
Dlaczego nie mogę się odwoływać do rejestrów poniżej 15 np r1 przez instrukcję ldi?
Czy ustawienie pinu jako wejście z pull-up'em oznacza że jego stan początkowy równy jest 1?
Ze wszystkich pinów mogę korzystać normalnie jeśli w odpowiednich rejestrach nie ustawie bitów odpowiedzialnych za ich inne funkcje(np. ADC, int0 itd.)?
Jak wygląda definiowanie zmiennych?
Oto schemat i program do sprawdzenia. Mam wątpliwości co do microswitchy i ustawień pinu jako wejście, a także przerwania INT0
.nolist
.include "m8def.inc"
.list
.listmac
.cseg
.org 0
rjmp start ;skok do początku programu
;przerwania
.org INT0addr ; Przerwanie zewnętrzne int0 (microswitch)
rjmp microswitch ; Skok do procedury przerwania
.org INT1addr ; Przerwanie zewnętrzne int1
reti
.org ICP1addr ; Input Capture1 Interrupt
reti
.org OVF0addr ; Przerwanie przepełnienia timer0
reti
.org OVF1addr ; Przerwanie przepełnienia timer1
reti
.org URXCaddr ; UART Receive Complete
reti
.org UDREaddr ; UART Data Register Empty
reti
.org UTXCaddr ; UART Transmit Complete
reti
.org ACIaddr ; Analog Comparator
reti
start:
cli ;wyłaczenie przerwań na czas ustawiania proca
ldi r16, LOW(RAMEND) ;załadowanie do rejestru r16 polowy stalej konca stosu
out SPL, r16 ;zapisania polowy konca stosu
ldi r16, HIGH(RAMEND) ;załadowania do rejestru r16 2 polowy stalej konca stosu
out SPH, r16 ;zapisanie 2 polowy konca stosu
ldi r16, 1 ;załadowanie 0b00000001
out DDRB, r16 ;ustawienie PB0 jako wyjście, reszta jako wejscia
out PORTB, r16 ;w stanie wysokim
ldi r16, 128 ;załadowanie 0b10000000
out DDRD, r16 ;ustawienie PD7 jako wyjście
ldi r16, 192
out PORTD, r16 ;w stanie wysokim PD7, z pullupem PD6
ldi r16, 64 ;ustawienie bitu odpowiedzialnego za akceptcję
out GICR, r16 ;przerwania INT0 w rejestrze GIMSK
ldi r16, 0 ;poziom niski sygnału na INT0 będzie
out MCUCR, r16 ;generowac przerwanie
sei ;włączenie przerwań
mainloop:
in r16, PIND ;do PD6 i PD2 microswitche, na PD2 jako przerwanie int0
ldi r20, 64 ;ustawienie bitu 6 w r20
and r16, r20 ;wyizolowanie bitu 6 (PD6)
ldi r20, 0
cpse r16, r20 ;jezeli jest rowny 0(wcisniety, zwarty do masy) opusc nastepna instrukcje
rjmp mainloop ;petla
;jesli 0 czyli microswitch wcisniety
in r16, PORTB ;wczytaj jak jest ustawiona dioda na PB0
ldi r20, 1
and r16, r20 ;izoluj bit 0
cpse r16, r20 ;jesli jest jeden
rjmp ustaw ;wyzeruj bit 7 portu d
;jesli nie to
cbi PORTB, 0 ;zeruj bit 7 portu d
rjmp mainloop ;petla
ustaw:
sbi PORTB, 0 ;ustaw
rjmp mainloop ;powrot
microswitch: ;przerwanie od przycisku, zmieniajacy stan diody na PD7
in r2, PORTD ;wczytaj jak jest ustawiona
ldi r19, 128
and r2, r19 ;izoluj bit 7
cpse r2, r19 ;jesli jest jeden
rjmp ustaw2
;jesli nie to
cbi PORTD, 7 ;zeruj bit 7 portu d
reti ;powrót z przerwania
ustaw2:
sbi PORTD, 7 ;ustaw bit 7 portu d
reti ;powrót z przerwania
Za wytykanie czytelności kodu//schematu także będę wdzięczny.