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

[atmega32][asm] - problem z Timer1

sebastiankozub 11 Sty 2009 22:52 1591 1
REKLAMA
  • #1 5985707
    sebastiankozub
    Poziom 11  
    witam mam problem z wywolaniem przerwania od timer1 - od zdarzenia typu CTC, program ma wygrywac melodyjke na buzzerku, przerwanie od timer0 smiga - jest odpowiedzialne za generowanie sygnalu na wyjsciu OC0, a timer1 ma zmieniac nutki - podmieciac liczbe w OCR0 liczba z tablicy melodia... ale nie zmienia i nie moge znalezc przyczyny :/ wydaje mi sie ze wogle nie jest wywolywane przerwanie od timer1

    .include "m32def.inc"
    
    rjmp init					;inicjalizacja
    .org OC1Aaddr				;przerwanie od timer1
    rjmp int_T1
    
    init:
    
    ldi r16,low(RAMEND)		
    out SPL,r16
    ldi r16,high(RAMEND)
    out SPH,r16
    
    ldi Zh,high(melodia<<1)
    ldi Zl,low(melodia<<1)
    
    ldi r18,1
    
    ldi r16,0					;timer0 inicjalizacja
    out TCCR0,r16				;tryb Clear Timer on Compare Match
    sbi DDRB,DDB3  				;zmienia stan na wyjsciu OC0
    lpm r16,Z+		     		;gdy zliczy do wart wpisanej do OCR0
    out OCR0,r16
    ldi r16,0b00011011
    out TCCR0,r16
    
    ldi r16,0					;timer1 inicjalizacja
    out TCCR1A,r16
    out TCCR1B,r16
    
    ldi r17,high(256)
    ldi r16,low(256)
    sts OCR1AH,r17
    sts OCR1AL,r16
    
    ldi r17,0
    ldi r16,0b00001101
    sts TCCR1A,r17
    sts TCCR1B,r16
    
    ldi r16,0b00010000
    sts TIMSK,r16
    
    sei
    
    main:
    rjmp main
    
    ;------------------------------------------------------------------------------
    int_T1:
    
    lpm r16,Z+		            ;wpisanie wysokosci nuty
    out OCR0,r16 
    cpse r16,r18		   		;jesli koniec melodyjki pomiń reti
    reti
    ldi Zh,high(melodia<<1)	  	;i wroc do poczatku tablicy
    ldi Zl,low(melodia<<1)
    reti
    
    ;------------------------------------------------------------------------------------------------
    
    melodia:
    .db 30,90,120,29,0,26,0,26,0,26,26,0,26,26,26,26,0,29,29,0,29,29,0,29,29,0,29,29,0,25,0,
    25,0,25,25,0,25,25,25,25,0,26,26,0,26,26,0,26,26,0,29,29,0,26,0,26,0,26,26,0,26,26,
    26,26,0,29,29,0,29,29,0,29,29,0,1 	
    
    ;------------------------------------------------------------------------------------------------
    
  • REKLAMA
  • #2 5986894
    chudybyk
    Poziom 31  
    Zwykle w przerwaniu się zapisuje używane rejestry na stos, ale widzę, że program główny zatrzymuje się w pętli. Nie napisałeś procedurki z timera T0, gdyby używała tych samych rejestrów co przerwanie T1, to będzie kaszana. Gorąco polecam pop i push! ;-)

    Zmień instrukcje sts na out, zdaje się, że adresy dla tych instrukcji są przesunięte.
REKLAMA