2013-06-10 3 views
3

나는 2 개의 포텐시오 미터에서 가져온 written a programm을 출력하며 2 개의 다른 사운드를 출력합니다.어셈블리의 타이머 관련 문제

문제는 신호음이 켜지거나 꺼질 때 신호음의 지연이 발생한다는 것인데, 이는 기본적으로 전위차계의 값입니다.

그러나 주파수가 높을수록 사운드가 재생되는 시간이 짧아지고 사운드가 재생되는 시간이 해당 주파수에 연결되지 않았 으면합니다.

그래서 타이머를 사용하기로 결정했습니다.

보시다시피
while(timer0counter > 0) 
    while(timer2counter > 0) 
     output on 
    while(timer2counter > 0) 
     output off 

, 이것은 지정된 시간에 주파수를 제공한다 :

계획은 다음과 같은 구조입니다. 타이머 오버 플로우 기능이

mainloop: 
    ldi r27,250;The value of one Potientiometer, here a static value 

    ldi r22,255 
    mov r23,r27 
    loop: 

      ldi r16,4 
      out PORTB,r16 

      tst r23 
      brne loop 

      mov r23,r27 

      inner: 
       ldi r16,0 
       out PORTB,r16 

       tst r23 
       brne inner 

      tst r22 
      brne loop 

rjmp mainloop 

동안 :

tmr0overflow: 
    tst r22 
    breq skip0 
    sub r22,1 
    skip0: 
reti 

tmr2overflow: 
     tst r23 
     breq skip2 
     sub r23,1 
     skip2: 
reti 

타이머 초기화 :

ldi r16,5 
out TCCR0,r16 
ldi r16,2 
out TCCR2,r16 

ldi r16,(1<<TOIE0) | (1<<TOIE2) 
out TIMSK,r16 
(PORTB는 신호음입니다) (이것은 단지 하나의 소리입니다) 다음과 같이 구현은 지금까지 보인다

T2OVF, T0OVF에 대한 인터럽트 벡터를 설정하고 일반적으로 활성화 된 인터럽트도 설정했습니다.

하지만 출력이 무작위 인 것처럼 보입니다. 뭐가 잘못 되었나요?

+2

"출력이 예상대로 아닙니다"- 예상되는 출력은 무엇이며 실제 출력은 무엇입니까? –

+0

T2OVF, T0OVF 및 활성화 된 인터럽트 ('sei')에 대한 인터럽트 벡터를 설정 했습니까? – MikeD

+1

더 이해할 수 있도록 텍스트를 다시 작성했습니다. –

답변

1
  ;PORTC 0 = INPUT 
      ;POT. 1[C0/ADC0] 
      cbi  DDRC,0 
      cbi  DDRC,1 
      ;PULLUP 
      sbi  DDRC,0 
      sbi  DDRC,1 

풀 업은 DDR이 아니라 포트를 통해 설정됩니다. 입력은 출력에서 ​​읽을 때 결정되지 않습니다.

+0

바보 같은 저! 감사 –