имеется тини 2313v (от кварца на 4 мгц). хочу использовать его 16-бит таймер для быстрого шима на ножке OC1A(PB3), для чего собрал типовую схемку с контроллером и драйвером l293, коим управляю с помощью ножки OC1A(PB3) и земли. Не работает - в смысле не получается изменять скорость моторчика,ну или напряжение на ножке контроллера. В отладчике авр студио нашел такую "непонятку" - записываю в 16 битный регистр сравнения OCR1A число более 1024- и в режиме отладки оно сначала записывается ,например 30000(DEC),но потом перезаписывается на какую то ахинею всегда менее 1024,если записываю изначально число менее 1024 - все нормально. Шим настроил на сравнение в каждом цикле с OCR1A , уменьшил частоту таймера в 1024 раз по сравнению с контроллером ()
ldi ZL, LOW (MegaArray*2) ldi ZH , HIGH (MegaArray*2)
ldi XH, 0xFF ;записываем число от 0 до 65535 для сравнения с TCNT таймера ,конкретно сейчас максимальное 65535 out OCR1AH,XH ldi XL, 0XFF out OCR1AL,XL
ldi temp,0b11100001 ;разрешить прерывание компаратора таймера 0 и 1 out TIMSK,temp
ldi temp,0b00011101 ;настраиваем таймер на 4МГц/1024 тактов в секунду, 65000 за 16 секунд, а также fastpwm out TCCR1B,temp
ldi temp,0b10000011 ;WGM13:0 = 15 (COMnx1:0 = 2),дабы сравнивать TCNT и OCR1A out TCCR1A,temp
ничерта не врубаюсь, если убрать TCCR1A то OCR1A уже не сбрасывается, где то досадная ошибка. Может у кого нить есть типовой код на ассемблере по быстрому шиму ?
1."In non-inverting Compare Output mode, the Output Compare (OC1x) is set on the compare match between TCNT1 and OCR1x, and cleared at TOP"
"в неинвентированном режиме ножка OC1x устанавливается при совпадении TCNT1 и OCR1x ,очищается в TOP"
2."The counter counts from BOTTOM to TOP then restarts from BOTTOM" "Счетчик считает от начала(BOTTOM) до конца(TOP) затем перезапускается заново"
3."In fast PWM mode the counter is incremented until the counter value matches either one of the fixed values 0x00FF, 0x01FF, or 0x03FF (WGM13:0 = 5, 6, or 7), the value in ICR1 (WGM13:0 = 14), or the value in OCR1A (WGM13:0 = 15)"
"в быстром режиме шим счетчик увеличивается пока его значение не совпадет с одним из фиксированных значений 0x00FF, 0x01FF, or 0x03FF (WGM13:0 = 5, 6, or 7),регистром ICR1 (WGM13:0 =14) или регистром OCR1A (WGM13:0 = 15 - что мне и нужно)" - это так мы задаем TOP."
4."The PWM waveform is generated by setting (or clearing) the OC1x Register at the compare match between OCR1x and TCNT1, and clearing (or setting) the OC1x Register at the timer clock cycle the counter is cleared (changes from TOP to BOTTOM)."
"ШИМ формируется (waveform) установкой(или сбросом) регистра OC1x при совпадении OCR1x и TCNT1, и очистке(или установке) регистра OC1x при сбросе таймера(в Bottom "
Похоже я настраивал режим когда TOP=OCR1A (WGM13:0 = 15), и пытался в OCR1A записать 16 бит число, но больше 0x03FF не записывалось.-Почему??!! А гланное как вообще работает этот вариант шима?,куда записать число сравнения с TCNT1,если OCR1A УЖЕ ЗАНЯТ как TOP?? Варианты -ICR1 или OCR1B ?
п.с. By using ICR1, the OCR1A Register is free to be used for generating a PWM output on OC1A. когда используем ICR1 для опеределения TOP можно смело юзать OCR1A для шима,это мне понятно)
Похоже разобрался: при WGM13:0 = 15 используем в качестве регистра сравнения OCR1B, TOP OCR1A; еще лучше WGM13:0 =14 и в качестве регистра сравнения OCR1A/B, TOP ICR1 ,а самый лучший вариант поставить TOP 0x00FF, 0x01FF, or 0x03FF (WGM13:0 = 5, 6, or 7),8-10 бит более чем достаточно для этих говномоторчиков. Но теперь есть новая проблема,c драйвером L293. На вход IN1 подаю GND(-),на GND1-4 тоже (-), на IN2 ШИМ с OC1A,на Vss, Vs, Enable1 питание +5v.И допустим с OC1A шпарит ШИМ на 2.5-3 V, НО на выходе L293 стабильные дурацкие 4.5V.Но без паники. В свободное время пересоберу все это дело,если не прокатит выложу схему)