МК AT90S8535, Аппаратная ШИМ по INT0

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
R41f
Сообщения: 9
Зарегистрирован: 28 фев 2008, 10:37

Необходимо реализовать аппаратную ШИМ с чатотой 500 Гц, запускающуюся по внешнему прерыванию INT0.

Ниже приведено то, что я накатал.

Код: Выделить всё

.include "8535def.inc"
.cseg
.org $000
  rjmp MAIN
.org $001
  rjmp EXT_INT

EXT_INT:
  in R16,SREG
  push R16
  ldi R16,(1<<CS11)
  out TCCR1B,R16
  ldi R16,(1<<COM1B1)|(1<<COM1B0)|(1<<PWM11)
  out TCCR1A,R16   
  pop R16
  out SREG,R16
  reti

MAIN:
  ldi R16,low(RAMEND)
  out SPL,R16
  ldi R16,high(RAMEND)
  out SPH,R16
  rcall IOINIT

LOOP:
  nop
  rjmp LOOP

IOINIT:
  ldi R16,(1<<DDD4)
  out DDRD,R16
  ldi R16,(1<<INT0)
  sei  
  out GIMSK,R16
  ldi R16,(1<<ISC10)|(1<<ISC01)
  out MCUCR,R16
  ldi R16,0x00
  out OCR1AH,R16
  ldi R16,0xFA
  out OCR1AL,R16
  ret
Тактовая частота 4МГц. Используется T/C1 в режиме 9-битного ШИМ, соответственно частота ШИМ получается около 490 Гц. В AVR Studio отладчик почему-то помимо

Код: Выделить всё

LOOP:
  nop
  rjmp LOOP
лопатит еще и обработчик прерывания EXT_INT. При симуляции в Proteus'e на осциллографе получаются иголки, в любом случае, несмотря на

Код: Выделить всё

  ldi R16,0x00
  out OCR1AH,R16
  ldi R16,0xFA
  out OCR1AL,R16
Ну если режим ШИМ обратный, то, разумеется, получим длиииинные импульсы с короткими впадинами (перевернутые иголки). В общем проблема в том, что не могу настроить нормальную скважность (коэффициент заполнения [длительности высокого/низкого уровней]). Я в асме практическе не шарю, так что сильно не бейте :) .
Ответить