шим attin261..

whoim
Offline
Зарегистрирован: 03.11.2011

 И снова здравствуйте!

была очень хорошая тема про fastpwm аттини13, хотел аналогично заюзать attiny261. Но - не выходит..

Помогите по аналогии?

здача: fast pwm, /256=122,5гц, PB1 пин.

TCCR1A = (1 << PWM1A) | (1 << PWM1B) | (1 << COM1A0); // non inverting fast pwm OC1A
//выбор предделителя
TCCR1B = (1 << CS13) | (1 << CS10); //делитель 256, частота 8000000/256/255=122,5гц
TCCR1D = (1 << PWM1A) | (1 << PWM1B);
TCCR1E = (1 << OC1OE1);
//TIMSK = (1<<OCIE0A);
//скважность канала
OCR1C = 255;
OCR1A = 127;

asm("sei"); //разрешить прерывания

whoim
Offline
Зарегистрирован: 03.11.2011
//FAST PWM настройка
void timer_setup(void) {
	//PWM Settings

	OCR1C = 0xFF; // основной счетчик
	OCR1A = 200;  //значение совпадения (скважность)
	TCCR1A = (0x2 << COM1A0) | (0x1 << PWM1A); //FastPwm PB1
	TCNT1 = 0;
	PLLCSR = (1 << PLLE);
	while (!(PLLCSR & (1 << PLOCK)));
	PLLCSR = (1 << PCKE) | (1 << PLLE);
	TCCR1B = (0x1 << CS10) | (0x1 << CS13); //=8000000/255/256 = 122.5hz
	TIMSK = (1<<OCIE0A);
	asm("sei"); //разрешить прерывания
  }

//обработчик таймера
ISR (TIMER1_COMPA_vect) {
	millis = millis + 7; //счетчик миллисекунд
}

 Ну как то так

 

step962
Offline
Зарегистрирован: 23.05.2011

На всякий случай (в порядке параноидального бреда - в принципе, этот бит должен быть сброшен при старте):

PLLCSR &=~(1<<PCKE); // выбираем системный генератор (CK) в качестве источника тактов - синхронный режим работы таймера.

Далее - где вы взяли значения битов для выбора режима? Я нашел в дейташите на тиньку261 табличку 16-19, которая утверждает, что режим fast PWM включается комбинацией битов PWM1x = 1 и WGM11...10 = 00.

Строка TCCR1D = (1 << PWM1A) | (1 << PWM1B);

Но в этом регистре нет битов с именами PWM1A и PWM1B.

И вообще - почему первый таймер? Почему не нулевой? Уж больно первый таймер в этой тиньке навороченный...

step962
Offline
Зарегистрирован: 23.05.2011

 А вот это что такое страшное:

TCCR1A = (0x2 << COM1A0) | (0x1 << PWM1A); //FastPwm PB1
 

В битовых операциях всегда единички двигают. Двойка может использоваться только для шифрования своих потаенных мыслей (2 соответствует 1<<1)

Строка

PLLCSR = (1 << PCKE) | (1 << PLLE);
 

Согласно дейташиту это переход на работу таймера от внешнего генератора - оно вам надо?

step962
Offline
Зарегистрирован: 23.05.2011

 TCCR1B = (0x1 << CS10) | (0x1 << CS13); //=8000000/255/256 = 122.5hz

и

millis = millis + 7; //счетчик миллисекунд

122,5 Гц - это одно прерывание каждые 1000/122,5 = 8,16 мсек

необходимо плюсовать хотя бы восьмерку
 

whoim
Offline
Зарегистрирован: 03.11.2011

 Привет! Все перечитал, поужасался откровенной глупости своей )) 0x2 простительно - ибо спер у кого то и не заметил вначале, но часок назад все же глаз зацепился. По другим критикам вроде понял, что к чему, и хочу занулить результы и перейти на нулевой таймер БЕЗ шима на ноге.

8mhz/62=125khz. 125khz в сравнении с OCR1C=125 дают четко килогерц (на самом деле 8, я так и не понял почему).

Давайте попробуем запустить timer0? первый и правда навороченный..

-- Горжусь собой - запустил прерывание int0 по lowlevel, поняв кусочек даташита ))))