Страница 1 из 1

Atmega88 не могу завести ШИМ 10 бит

Добавлено: Пн мар 17, 2014 09:20:27
Biquad
Подниму тему. Мой моск уже сломан. Прошу совета.
Итак, камень Atmega88PA.
Какая-то чертовщина :) Делаю тест - простая программа на С для Codevision, версия 2.05.3, сгенерировано кодевизардом:
считываю показания ацп в 10 бит режиме, настраиваю таймер 1 на шим 10 бит WGM:7, из ацп выдаю в OCR1A, делю показания ацп на 4 и одним байтом шлю на платку с трехразрядным семисегментным индикатором, там тоже стоит мега, просто преобразует байт в три десятичных разряда и выводит на индикатор. Дополнительно в цикле опрашиваю нажатие кнопки и при нажатии вместо ацп/4 выдаю старший байт ацп. Для контроля выдаю шим и на OCR1A, и на OCR1В.
Кручу ручку переменника от минимума до максимума, на индикаторе показания меняются от 0 до 255 (ацп/4), при нажатии кнопки - от 0 до 3 (старший байт ацп) - все ок, ацп читает ровно, это часть работает. На выходе OCR1A вольтметр показывает изменение от 0 до 1,12В (62 по индикатору), сбрасывает в 0 и снова от 0 до 1,12В (124 по индикатору), и так 4 раза от мин до макс, как будто шим в 8-битном режиме работает, а не в 10-битном. А на выходе OCR1В все четко - напряжение изменяется от 0 до 4.95В ! Запись в OCR1A и OCR1В делаю друг за дружкой.

Чтение показаний ацп, сгенерировано кодевизардом:
Спойлер// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x60;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
Упрощеннй текст программы:
СпойлерTCCR1A = 0b10100011; // 0xA3 Старт таймера 1 WGM: 7) PWM 10bit fast
TCCR1B = 0b00001010 ; // 0x0А CK=8MHz, T_PWM= CK/8*1024 = 1024 мкс F_PWM 1кГц
while (1)
{
delay_ms(20);
SPEED= read_adc(1); // Чтение результата АЦП

OCR1AH = (char)(SPEED>>8); // Загрузка OCR1A
OCR1AL = (char)SPEED;

OCR1BH = (char)(SPEED>>8); // Загрузка OCR1В
OCR1BL = (char)SPEED;

PWM=SPEED/4; //

if(PIND.3 == 0){
putchar(ADCH); // ВЫВОД В USART
goto A6;
}

putchar(PWM); // ВЫВОД В USART
A6:
}
Что не так?
Есть две таких платы, поведение идентичное. Сегодня попробую мегу заменить на особь из другой партии.

Re: Atmega88 не могу завести ШИМ 10 бит

Добавлено: Пн мар 17, 2014 13:30:58
ИС-пытатель
Я бы не стал опираться на показания вольтметра, хотя действительно странно, что для одного вывода он нормально показывает, а для другого - меньше при одинаковых значениях. А попробуйте выводить на экран значение переменной, в которой результат АЦП, после загрузки в OCRA. А потом измените и выводите после загрузки в OCRB. На предмет меняется переменная или нет. И попробуйте загрузить в OCRA, а потом OCRB=OCRA; И что если поменять очередность загрузки в регистры?
А что Протеус показывает?
Упрощенный текст программы работает?
Дайте полный текст

Re: Atmega88 не могу завести ШИМ 10 бит

Добавлено: Пн мар 17, 2014 13:40:26
Biquad
Сегодня ориентировочно в 6:30 утра по Киеву снизошел ко мне великий и могучий бог программеров H_BYTE (условно так его назовем) и воцарилось царсивие его на моей отладочной плате :) А короче - проснулся, еще три раза перепроверил код, скомпилил и залил в камень - смотрю, уже при вращении переменника напряжение меняется от 0 до 1,12В, думаю, уже хорошо. Смотрю внимательнее плату, по схеме OCR1A рулит светодиодом оптопары PC817 через резистор 330 Ом, вижу что вольметром стал уже после резистора. Тыкаюсь вольтметром напрямую на ногу контроллера - ЕСТЬ СИГНАЛ! 0 - 4,95В при повороте переменника от нуля до максимума. Зашил и во вторую плату - все ОК.
Я так и не понял, что это были за глюки, может чего накосячил с настройкой таймеров, старый код не сохранил. Всем спасибо за терпение и умные мысли, тему можно считать закрытой, рабочий код приведен в предыдущем сообщении.

Re: Atmega88 не могу завести ШИМ 10 бит

Добавлено: Пн мар 17, 2014 13:45:32
ИС-пытатель
Усталость сказывается. ) отдыхать тоже надо! ;)