logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega162][Assembler][Niedziałające przerwanie zewnętrzne]

skirki 04 Mar 2011 14:29 1344 1
REKLAMA
  • #1 9233817
    skirki
    Poziom 10  
    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
    
    
    
    .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.
  • REKLAMA
  • #2 9236779
    skirki
    Poziom 10  
    Po długich bojach udało się znaleźć winą były jakieś śmieci w rejestrze UCSR1A które sprawiły że jednocześnie oprócz int0 pd2 pracowała jako xck1 co chyba uniemożliwiało wywoływanie przerwania int0.
    Pisze bo może się komuś to przyda.
    Warto też zwrócić uwagę na fusebit M161C przy takich problemach
REKLAMA