Решил в первую очередь разобраться с модулем ШИМ, целый день вчера запускал его - запустил, но на avr123 по одному написано (перевел на асм) - не работает, нашел еще гдет кусок кода, заделал - работает, НО нифига не понятно. Даташит вообще понять не реально, видать потому что давно не сталкивался,а мож просто там написано не для тех кто не шарит) Вообщем хочу попросить помочь разобраться со всем этим
И так что не ясно по ШИМ:
1. Какие регистры\биты конфигурируют режим? Я взялся сразу за FastMode т.к. хочу макс частоту получить(в обучающих целях) <The fast Pulse Width Modulation or fast PWM mode (WGM01:0 = 3)> выходит WGM01 - и есть наш конфиг, но если залесть в хедеры, то
- Код: Выделить всё
; ***** TIMER_COUNTER_0 **************
; TCCR0 - Timer/Counter Control Register
.equ CS00 = 0 ; Clock Select 1
.equ CS01 = 1 ; Clock Select 1
.equ CS02 = 2 ; Clock Select 2
.equ WGM01 = 3 ; Waveform Generation Mode 1
.equ CTC0 = WGM01 ; For compatibility
.equ COM00 = 4 ; Compare match Output Mode 0
.equ COM01 = 5 ; Compare Match Output Mode 1
.equ WGM00 = 6 ; Waveform Generation Mode 0
.equ PWM0 = WGM00 ; For compatibility
.equ FOC0 = 7 ; Force Output Compare
WGM01 - дефайн всеголишь WGM01:0 = 3 - в даташите имелось ввиду что 3-й бит установить и будет нам FastMode? Немножко непонятен "синтаксис" того даташита(
едем дальше..
2. Задаем частоту - тут ваще не понятно нифига - если можно в двух словах о главных регистрах\каунтерах - буду крайне признателен!
TCCR1A - каунтер 1 часть А = на конфиг самого таймера (дефаны выше, по ним както проще понять чем по даташиту.) Тут вроде все понятно как и с TCCR1B.
TCNT1H & TCNT1L - сюда как понимаю мы инитим начальное значение в таймере, например - захотели чтобы первый импульс\пауза были короче чем последующие(ну как пример_для смысла понятия)
Теперь то что не понятно:
ICR1H - ху из ит? == регистр(число) с которым будут сравниваться inc\dec-ты TCNT1? Вроде с OCR1AH сравниваеться = тут беда полная Зачем тафмер, число для сравнения и еще какойто регистр...если там есть ток два варианта 1 или 0 ну и время для 1 и 0:) - таймер просто юзаеться модулем PWM как таймер а ICR1 и OCR1A уже как - до скольки считать и сколько на паузу выделить(соответственно)?
3. Частота. Вот это интересный момент, т.к. сам МК работает припустим на 8Мгц, все что у меня вышло с него выжать - 7.5*0.5мкс = 3.75мкс(26.6666Кгц) период при ICR1=0xFF, т.е. сильно много не разгонишься при регулировке мошности(15 позиций, маловато) - Беру формулу из даташита для фаст режима fOCnPWM = fclk_I/O \ N ⋅ 256, <The N variable represents the prescale factor (1, 8, 64, 256, or 1024)> = N - wtf??, как понял это наш TCCR0 0-2 биты?
4. Вот нашкрябаный кодез который вроде робит, но быстрей никак не хочет шуршать)
- Код: Выделить всё
.include "m16def.inc"
.def savesreg =r2
.def flags =r16
.equ f_complit =0
.equ TOP =0x0F
.def tmpa =r17
.def cntstepL =r26
.def cntstepH =r27
.equ c_Tpwm =1667
.cseg
.org 0 rjmp _reset
.org INT_VECTORS_SIZE
_reset:
ldi tmpa,high(RAMEND)
out SPH,tmpa
ldi tmpa,low(RAMEND)
out SPL,tmpa
ldi tmpa, 0xFF ;0b00110000
out DDRD,tmpa
out PORTD,tmpa
ldi tmpa, 0xA0
out TCCR1A, tmpa
ldi tmpa, 0b00010001
out TCCR1B, tmpa
ldi tmpa, 0xFC
out TCNT1H, tmpa
ldi tmpa, 0x1
out TCNT1L, tmpa
ldi tmpa, high(TOP)
out ICR1H, tmpa
ldi tmpa, low(TOP)
out ICR1L, tmpa
ldi tmpa, 0x00
out OCR1AH, tmpa
ldi tmpa, 0x07
out OCR1AL, tmpa
ldi tmpa, 0x00
out OCR1BH, tmpa
out OCR1BL, tmpa
_stop: rjmp _stop
сори что он такой беспорядный, но первый сорс + это куски чьихто исходников + я там подописывал своего уже(переписывал сишкин код. Возможно ли поднять частоту, и как вообще правильно его подправить дабы оно начало валить на максимуме частоты?
ну и кодез который я перевёл с сишки камрада avr123
- Код: Выделить всё
ldi tmpa, 0
out TCCR1B, tmpa
ldi tmpa, 0xFC
out TCNT1H, tmpa
ldi tmpa, 0x01
out TCNT1L, tmpa
ldi tmpa, 0x03
out OCR1AH, tmpa
ldi tmpa, 0xFF
out OCR1AL, tmpa
; ldi tmpa, 0x03
; out OCR1BH, tmpa
; ldi tmpa, 0xFF
; out OCR1BL, tmpa
ldi tmpa, 0x03 ;high(TOP)
out ICR1H, tmpa
ldi tmpa, 0xFF ;low(TOP)
out ICR1L, tmpa
ldi tmpa, 0b10000011
out TCCR1A, tmpa
ldi tmpa, 0b00001001
out TCCR1B, tmpa
ldi tmpa, 0x01 ;high(TOP)
out ICR1H, tmpa
ldi tmpa, 0xFF ;low(TOP)
out ICR1L, tmpa
но он не робит ваще - мож надо что-то там проконфигурировать, типа мастер йода из CVAVR в помощь)
это был мой первый курс по авр который надеюсь вы поможете пройти и я буду дальше разбираться с АЦП и тп. Благодарю за внимание, всегда рад помочь, я)