そのため、ラボの割り当てを実行しようとしており、ピンをパルスするように設定することでこの問題に遭遇し続けています。PWM モードで 2 つのタイマーを使用して正弦波を生成し、モーターを駆動したいと考えています。ある時点でタイマーがポートを「(OCR*A)」点滅させ、別の「(OCR*B)」で再び点滅し、カウンターをゼロにリセットする必要があります。
OCR * AとOCR * Bの違いを制御できる限り、ポートのどのピンがちらつくかはあまり気にしないので、たとえば、あるピンで70%の電力を取得し、別のピンで30%の電力を取得できます。2 つのタイマーが必要なので、独立したモーター制御を行いますが、モーターを異なるデューティ サイクルに設定できる限り、1 つのタイマーでそれを行うことができれば問題ありません。
最後の落とし穴が 1 つあります。私のコードはすべてアセンブリ コードでなければなりません。私はあなたに私のコードを書いてほしくないのですが、私はマニュアルを何度も読んでいて、タイマーを間違って設定したことに困惑しています。
ここに私がこれまで持っているコードがあります。私のコードの書き方では、OCR2A と OCR0A がちらつくはずですが、よくわかりません。お知らせください。また、よろしくお願いいたします。
.INCLUDE <m48Pdef.inc>; Include in program
.CSEG; Start code segment.
.ORG 0x0000
RJMP MAIN
MAIN:
LDI R16, LOW(RAMEND)
OUT SPL, R16
LDI R16, HIGH(RAMEND)
OUT SPH, R16
SBI DDRD, 3 ; set correct pins to read and write
SBI DDRD, 2
SBI DDRD, 1
SBI DDRD, 0
SBI DDRB, 3 ; set correct pins to read and write
SBI DDRB, 2
SBI DDRB, 1
SBI DDRB, 0
CLR R16
CLR R17
CLI ;clear global interrupts
LDI R16, 0b01000011
STS 0xB0, R16
LDI R16, 0b00001011
STS 0xB1, R16
CLI
LDI R17, 0b01000011
STS 0x44, R17
LDI R17, 0b00001011
STS 0x45, R17
LDI R19, 7
LDI R18, 3
SEI
LOOP:
RCALL DelayA
STS OCR2A, R18
STS OCR0A, R18
STS OCR2B, R19
STS OCR0B, R19
LDI R20, 0xFF
LDI R22, 0x00
LDI R23, 0x00
RCALL DelayA
RJMP LOOP ;repeats loop to keep the output going
DelayA:
CP r20, r22 ;standard double nested delay loop
BREQ RELOOP
NOP
NOP
NOP
Dec r20
ldi r21, 0xFF
RJMP DelayB
DelayB:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CP r21, r22
BREQ DelayA
Dec r21
RJMP DelayB
RELOOP:
RET