2016-07-05 11 views
3

メモリを節約するためにArduino UNO(= ATMega328P-PU)プログラムを書いていますので、avra.exe(Atmelスタジオのavrasm32と同じ)を使用して、コンパイルしてavrdudeをアップロードしてシンプルにします点滅するようなプログラムは正常に動作します。しかし、今私はpwmでLEDを半分明るくしようとしました。私はエラーのために私のコードをチェックしたが、私は何も見つけられなかったが、LEDはちょうど完全なbrighs。私は配線もチェックしました。ここに私のpwm.asmコード:Arduino PWMフェーディングwith 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%に設定しても、人間の目には違いはありません。だから私は16をocr0b(デューティサイクル= 6.25%)に入れようとしました。そして、私は本当の違いに気付きました。これは対数ロジックに従っているため、50%と100%のデューティサイクルの差は実際には非常に小さい

+0

さて、あなたが視力のリーダーを動かすと、目が速すぎても "点滅する跡"が見えます。 – KIIV