Подниму тему. Мой моск уже сломан. Прошу совета.
Итак, камень 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:
}Что не так?
Есть две таких платы, поведение идентичное. Сегодня попробую мегу заменить на особь из другой партии.