2016-07-05 3 views
3

메모리를 절약하기 위해 Arduino UNO (= ATMega328P-PU) 프로그램을 작성 중이므로 avra.exe (atmel studio의 avrasm32와 동일)를 사용하여 컴파일하고 avrdude를 업로드하고 간단한 깜박 거리는 프로그램은 잘 실행됩니다. 하지만 지금은 PWM으로 LED를 반쯤 밝게하려고했습니다. 오류에 대한 코드를 확인했지만 아무 것도 찾지 못했지만 LED가 완전히 밝아졌습니다. 나는 배선도 점검했다. 내 pwm.asm 코드는 다음과 같습니다.Arduino PWM 페이딩, avra와 함께

.nolist 
.include "m328pdef.inc" 
.list 

.cseg 
.org 0x00 
    rjmp start 
.org 0x34 
start: sbi ddrb, 5 ;pin 13 
     sbi portb, 5 ;pin 13 on, just to compare with the PWMed led 
     sbi ddrd, 5 ;pin 5 pwm 
     ldi r16, 0b00100011 ;fast pwm mode, non inverted pwm at oc0b = pin 5 
     out tccr0a, r16 ;I'm using Timer0 
     ldi r16, 0b00000001 ;no prescaler 
     out tccr0b, r16 
     ldi r16, 128 ; duty cycle = 50% 
     out ocr0b, r16 

    loop: rjmp loop 

듀티 사이클 값을 변경하려고했지만 아무 것도 변경되지 않았습니다.

+0

avr-gcc와 함께 나는 .lss (어셈블리)가 더 많거나 적고 괜찮습니다. . 어쩌면 LED가 잘못 연결 되었나요? – KIIV

답변

2

나는 해결책을 찾았습니다. 코드가 정확하고 배선이 너무 큽니다. 듀티 사이클을 50 %로 설정해도 인간의 눈에는 차이가 없습니다. 그래서 나는 ocr0b (듀티 사이클 = 6.25 %)에 16을 넣으려고했고 그 다음에 나는 실제 차이를 발견했습니다. 이것은 대수 논리를 따르기 때문에 50 %와 100 %의 듀티 사이클의 차이는 실제로 매우 작습니다.

+0

글쎄, 만약 당신이 시력에 이끌려 움직이면 눈이 너무 빠르더라도 "깜박 거리는 흔적"을 볼 수 있습니다. – KIIV