Witam, pisze program w assemblerze który pozwarciu INT0, będzie wykonywać określoną czynność(łączyć się z innym urządzeniem), Ale narazie utknąłem w martwym punkcie, napisałem program który po zwarciu INT0 wywołuje przerwanie które zapala diodę podpiętą do lini PC0 5 razy i gasi(zapalenie uzyskuje poprzez ustawienie PC0 w stan wysoki). Całość funkcjonuje na dobrze znanym zestawie uruchomieniowym AVT3505 (schemat układu zamieszczam poniżej)
Natomiast kod jest następujący
W kodzie już trochę kombinowałem ale narazie bezskutecznie, pomyślałem że może to być wina lini PC0 więc odłączyłem od plytki wszystkie dodatkowe moduły ale to nic nie dało, na lini PC0 nadal nie ma żadnej odpowiedzi na zwarcie INT0.
Natomiast kod jest następujący
.nolist
.include "m162def.inc"
.list
.cseg
.org 0
rjmp program ; ***** INTERRUPT VECTORS ************************************************
rjmp EXT_INT0 ;0x0002 ; External Interrupt Request 0
reti ;0x0004 ; External Interrupt Request 1
reti ;0x0006 ; External Interrupt Request 2
reti ;0x0008 ; Pin Change Interrupt Request 0
reti ;0x000a ; Pin Change Interrupt Request 1
reti ;0x000c ; Timer/Counter3 Capture Event
reti ;0x000e ; Timer/Counter3 Compare Match A
reti ;0x0010 ; Timer/Counter3 Compare Match B
reti ;0x0012 ; Timer/Counter3 Overflow
reti ;0x0014 ; Timer/Counter2 Compare Match
reti ;0x0016 ; Timer/Counter2 Overflow
reti ;0x0018 ; Timer/Counter1 Capture Event
reti ;0x001a ; Timer/Counter1 Compare Match A
reti ;0x001c ; Timer/Counter Compare Match B
rjmp TIM1_OVF ;0x001e ; Timer/Counter1 Overflow
reti ;0x0020 ; Timer/Counter0 Compare Match
reti ;0x0022 ; Timer/Counter0 Overflow
reti ;0x0024 ; SPI Serial Transfer Complete
reti ;0x0026 ; USART0, Rx Complete
reti ;0x0028 ; USART1, Rx Complete
reti ;0x002a ; USART0 Data register Empty
reti ;0x002c ; USART1, Data register Empty
reti ;0x002e ; USART0, Tx Complete
reti ;0x0030 ; USART1, Tx Complete
reti ;0x0032 ; EEPROM Ready
reti ;0x0034 ; Analog Comparator
reti ;0x0036 ; Store Program Memory Read
program:
;wyłączenie przerwan
cli
;załadowanie adresu konca pamieci
ldi R16, LOW(RAMEND)
out SPL, R16
ldi R16, High(RAMEND)
out SPH, R16
;dioda na linii PB0
sbi DDRC,0
;narazie wyłączona
cbi PORTC, 0
;ustawienia dla przerwania INT0
;a) włącz obsluge przerwania INT0
ldi R16, (1<<INT0)
out GICR, r16
;b) wybierz reakcje na opadajaze zbocze
ldi r16, (1<<ISC01)
out MCUCR, r16
;c) ustaw linie INT0 (PD2) w kierunku wejsciowym
cbi DDRD, 2
;d) włącz na linii rezystor podciagajacy
sbi PORTD, 2
;ustawienia timera
;a) wartosc preskalera = 8
; (65535 * 8 = 524280, czyli nieco ponad 1/2 s
ldi r16, (1<<CS11)
out TCCR1B, r16
;b) włacz obsluge przerwania przepełnienia Timer1
ldi r16, (1<<TOIE1)
out TIMSK, r16
;włącz obsługe przerwań
sei
;rejestr r17 = liczba migniec diody
ldi r17, 0
;rejestr r18 = wartosc poczatkowa dla instrukcji eor wystepujacej w TIM1_OVF
ldi r18, 1;
;petla glowna
petla:
rjmp petla;
;***obslugi przerwan***;
;obsluga przerwania zewnetrznego INT0
EXT_INT0:
ldi r17, 10
;powrot
reti
;obsluga przerwania wewnetrznego Timer1
TIM1_OVF:
;czy mrugnac dioda
cpi r17, 0
breq TIM1_OVF_stop
;odwroc wartosc na linii PC0
in r16, PORTC
eor r16, r18
out PORTC, r16
;zmniejsz licznik mrugniec
dec r17
rjmp TIM1_OVF_koniec
TIM1_OVF_stop:
;jesli licznik mrugniec wynosi 0 zgas diode
cbi PORTC, 0
TIM1_OVF_koniec:
;powrot z obslugi przerwania
reti
W kodzie już trochę kombinowałem ale narazie bezskutecznie, pomyślałem że może to być wina lini PC0 więc odłączyłem od plytki wszystkie dodatkowe moduły ale to nic nie dało, na lini PC0 nadal nie ma żadnej odpowiedzi na zwarcie INT0.