Attiny13 и ADC

Оба варианта

Если у тебя всё хорошо а у меня нет, то где-то что-то не так…

Мне стало интересно. Проблема ещё не решилась? Я смогу после шести заняться, если что. Только не хочется, если проблема уже решена. Если нет, скиньте протеусную схему, хоть скриншотом.

Кстати, какая версия протеуса? У меня 8.8 SP1.

1 лайк

Уточняю,(см выше #18) проверил на ATtiny24.
Сейчас надо немного отойти. Если будет время, проверю на ATtiny13

1 лайк

Фактически нет, так как работает только если отбросить (а точнее не читать совсем ADCL).

Моя версия протеуса:

Если нужно, можно скачать у меня из облака:

а проект :smiling_face:

Схема практически такая же как и в #1

а вставь ка перед чтением ADCH вот это

  while (ADCSRA & _BV(ADSC));

Зачем? ADCH нормально читается и так.

ну вставь, жалко что ли))

ISR(ADC_vect) {

  while (ADCSRA & _BV(ADSC));
  highb = ADCH;
  lowb = ADCL;
  analogData = (lowb + (highb << 8));

}

Ща, минутку.

Вот такое ошибку не выдает:

ISR(ADC_vect) {
	uint8_t lowb, highb;
	
	while (ADCSRA & (1<<ADSC));
	highb = ADCH;
	lowb = ADCL;
	analogData = (lowb + (highb << 8));
}

Я видел подобное решение в функциях, где вместо прерывания (ADC_vect) использовалась задержка в 250 us. Как оно работает в прерывании так - я не понимаю. Если кто объяснит - буду благодарен! :slight_smile:

Вот, хотите верьте, хотите - нет, но я внёс одно (ОДНО!) изменение в код и у меня всё работает. Изменение (№1 на картинке) – читаю регистр ADC сразу. Как видите журнал чистый (№2), хотя симуляция идёт уже давно (№3).

Видел, что Вы и сами прбовали такое изменение, но … у меня тут два варианта:

  1. или Вы пробовали это изменение, забыв что что-то ещё уже поправлено;
  2. или в Вашей версии протеуса модель 13-ой кривая.

Попробуйте в чистую копипастнуть код из первого сообщения в студию, поправить в нём одну строку как у меня и запустите. Если не заработает, значит у Вас кривая модель.

Кстати, пока не поправил эту строчку, у меня было то же самое сообщение, что и у Вас и лезло постоянно.

Евгений Петрович, я уже пробовал ADC.
Но мне не сложно, сейчас создам новые проекты…

ЗЫ: Вы в атмел студио выбирали Attiny13 или Attiny13A?

Но, у меня ж работает. Если никак, то разница только в версии протеуса, могу предположить, что модель кривая.

Кстати, если не секрет, зачем Вам фрираннинг? Я как-то заметил, что так часто обычно не нужно и ставлю автотриггеринг по таймеру.

13 - как Вы сказали

Я так и не понял где и когда я умудрился начудить )))
Действительно вот так всё работает:

Я еще с предделителем “игрался”, может это как-то повлияло…
Пол дня с этим “бьюсь”, глаз уже замылин (да и устал). Хватит, думаю, на сегодня.
Если завтра что “вылезет” - напишу.

Мне показалось так проще. Идея хорошая, возьму на заметку.


И напоследок - мозги отказываются работать :smiley:
Настроена внутренняя опора 1.1В

Туплю - не могу формулу составить вычисления напряжения на входе АЦП по его значению… )))) Памаггите ))))


вон оно че, читать надо сначала младший и тока потом старший, иначе блок.

1 лайк
//  mvRefference - опорное напряжение в милливольтах
//  divider - 1024 (или 512 если 9 бит - это бывает на 85-ой тиньке)
//  value - попугаи, снятые с АЦП
//  результат в милливольтах
Vmv = (mvRefference * value + divider / 2) / divider;
1 лайк