ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
12 июля
416074 Топик полностью
Adept (08.06.2013 14:11, просмотров: 91) ответил Лeoнид Ивaнoвич на Долго переубеждать - неблагодарное занятие. Фраза "прозрачность АСМ-кода" вызывает лишь улыбку.
Не знаю, как у Вас (хоть Ваши проекты вызывают уважение), но мои исходники повольно понятные и мне не составляет труда "поднять" проект, скажем 5-летней давности. Видел многие примеры Си-кода, которые абсолютно непонятны что тут может вызывать усмешку - неразумею. посмотрите, к примеру: push TMP2 PUSH_X ; RUN_ADCA_pipeline1_atCHANEL 1 ;Запускаем преобразование на канале "1", конвейере 1 (контроль напряжения на выходе ШИМ-генератора) ; -- посчитаем момент окончания следующего периода и обновим compare-регистр "A" lds XL,TCD1_CCA ;Считаем в "X" текущее значение компаратора "A" (время начала следующего периода) lds XH,TCD1_CCA+1 ; ldi TMP,low(PWMbase_Period) ;Загрузим длительность периода ldi TMP2,high(PWMbase_Period) ; add XL,TMP ;Вычислим новое значение времени окончания следующего периода (компаратор "A") adc XH,TMP2 ; sts TCD1_CCA,XL ;Запишем вычисленное новое значение в COMPARE_A-регистр sts TCD1_CCA+1,XH ; ;----------------------------- Замеряем напряжение на ШИМ-выходе, сравниваем его с требуемым и корректируем скважность (S_PWMbase_DutyCycle) Wait_for_ADCA_pipeline1_finished ;Ожидаем конца активного преобразования АЦП (измерение напряжения на выходе ШИМ-генератора) ; lds XL,ADCA_CH1_RES ;Загрузим для анализа данные с АЦП lds XH,ADCA_CH1_RES+1 ; ldi TMP,low(baseLevel+baseLevel_correction) ;Загрузим для сравнения с результатами АЦП, константу опорного уровня в TMP,TMP2 ldi TMP2,high(baseLevel+baseLevel_correction) cp XL,TMP cpc XH,TMP2 breq PWMbase_PeriodControl_exit;Если опорный уровень такой, какой нужно, то ничего не делаем и просто выходим. brcs PWM_plus ;Если опорный уровень меньше требуемого, то увеличиваем его PWM_minus: ; иначе уменьшаем его. ; (Уменьшение опорного уровня) lds XL,S_PWMbase_DutyCycle0 lds XH,S_PWMbase_DutyCycle1 subi XL,1 ;Текущее значение скважности -- sbci XH,0 rjmp PWMbase_Verify ;Проверим изменённое значение на корректность ;---------- PWM_plus: ; (Увеличение опорного уровня) lds XL,S_PWMbase_DutyCycle0 lds XH,S_PWMbase_DutyCycle1 adiw XL,1 ;Текущее значение скважности ++ ;---------- PWMbase_Verify: ;проверим изменённое значение скважности (регистр "X") на корректность: д.б. PWM_min<X<PWM_max ldi TMP,low(PWM_min) ldi TMP2,high(PWM_min) cp XL,TMP cpc XH,TMP2 brcc Verify_max ;Если PWMbase не меньше PWM_min, то проверяем её на "максимум" ldi XL,low(PWM_min) ; иначе присвоим коэффициенту PWMbase значение PWM_min ldi XH,high(PWM_min) rjmp PWMbase_store ; и сохраним его. Verify_max: ldi TMP,low(PWM_max) ldi TMP2,high(PWM_max) cp XL,TMP cpc XH,TMP2 brcs PWMbase_store ;Если PWMbase меньше PWM_max, то запомним его, ldi XL,low(PWM_max) ; иначе присвоим коэффициенту PWMbase значение PWM_max ldi XH,high(PWM_max) ; и сохраним его. PWMbase_store: sts S_PWMbase_DutyCycle0,XL ;Сохраним изменённое значение скважности sts S_PWMbase_DutyCycle1,XH ;---------------------------------- PWMbase_PeriodControl_exit: PWMpin_to_High ;Установим ножку контроллера ШИМ-генератора в "1" ; POP_X pop TMP2 ret что здесь непонятного ??
...делать нужно так, как нужно. А как ненужно - делать не нужно (С) Винни-Пух :)