Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

316 Часть 111. Практическое программирование микроконтроллеров АVR файлы ADC_mesuare_test.asm и ADC_mesuare_I NT_test .asm ) , укажулишь на изменения. Для начала мы подключаем прерывание готовности АЦП- указываем вектор в таблице прерываний и разрешаем его при включении АЦП в секции Reset (лис­ тинг 1 1 . 6). ; ==== прерывания rjmp RESET . org OVFOaddr rjmp TIMO_OVF ; переполнение таймераО . org ADCCaddr rjmp ADC_INT ; готовность ADC . org INT_VECTORS_S I ZE ; Конец таблицы прерываний - начало кода ; start ADC 1 / 32 = 1 2 5 кГц + ADC interrupt ; ldi temp , l<<ADEN l l<<ADIE l l<<ADPS2 1 l<<ADPSO out ADCSRA, temp Потом переносим в обработчик ADC_INT всю функциональность по подсчету суммы из 64 значений и вычислению среднего. Прерывание ADC_INT здесь будет возникать с частотой около 1 0 тыс. раз в секунду (время вызова и обработки прерывания мало в сравнении с длительностью преобразования), и управлять частотой этого процес­ са в должной мере мы не можем. Поэтому согласимся, что готовый результат будет у нас возникать примерно 1 50 раз в секунду ( 1 0 000/64). Требуется он нам, однако, гораздо реже. Чтобы не заниматься ненужной синхронизацией таймера и момента получения среднего, мы просто помещаем каждый раз результат в SRAM, а кто его оттуда извлечет и когда - это уже его дело. То есть вычисление среднего в преры­ вании АЦП будет заканчиваться так (листинг 1 1 . 7) - старший байт адреса zн ра­ вен о . ADC_INT : ; частота - 1 0 кГц <чтение АЦП и вычисление среднего 64 раза> ; записываем в память - 1 50 раз в секунду ldi ZL , Low ( SRAМ_START ) ;младший байт адреса RАМ st Z+ , AregH ; запоминаем старший st Z , AregL ; запоминаем младший clr AregL ; очистили младший к след . разу clr AregH ; очистили старший sbi ADCSRA, ADSC ; запуск нового преобразования reti

RkJQdWJsaXNoZXIy MTExODQxMg==