02.06.2019, 21:28
|
|
Гражданин KAZUS.RU
Регистрация: 10.06.2010
Сообщений: 598
Сказал спасибо: 222
Сказали Спасибо 234 раз(а) в 154 сообщении(ях)
|
Re: Перевод из asm в С
Сообщение от mike-y-k
|
Самым продуктивным будет путь с выделением из кода на asm алгоритма и его реализация на C.
|
Зачем его выделять? алгоритм полностью описан в апноте AN955
|
|
|
Сказали "Спасибо" DmitriyVDN
|
|
|
02.06.2019, 21:42
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,169
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Перевод из asm в С
DmitriyVDN, а я написанное не к конкретному куску кода написал. Таки этот подход универсален и не только в данном конкретном случае даст результат. Это даёт нормальное направление мысли при ступоре с разборками на строках голого кода. Тут даже комментирование по описаниям машинных команд и описанию алгоритма очень помогает. Дальше разобранное на C нормально реализуется.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
09.06.2019, 16:01
|
|
Гражданин KAZUS.RU
Регистрация: 28.11.2007
Адрес: харьков
Сообщений: 850
Сказал спасибо: 339
Сказали Спасибо 43 раз(а) в 23 сообщении(ях)
|
я со всем согласен - только у меня все таки возникают проблемы с переводом . особенно касаемо табличного чтения )))
Код:
|
//ISR_PWM
PIR3bits.PTIF = 0;//BCF PIR3,PTIF ;CLEAR PWM TIMER INTERUPT FLAG
if (ACSVM_FLAGS_1.FWD_REV) { // BTFSS ACSVM_FLAGS_1,FWD_REV
//BRA FIND_VECTOR_ANGLE_FOR_REV_DIR
//MOVFF PARAMETER_BUFFER+LOC_UPDATE_STEP_LSB,WREG ;INCREMENT VECTOR BY UPDATE STEP SIZE
VECTOR_ANGLE_LSB = VECTOR_ANGLE_LSB + PARAMETER_BUFFER[LOC_UPDATE_STEP_LSB]; //ADDWF VECTOR_ANGLE_LSB,F
//MOVFF PARAMETER_BUFFER+LOC_UPDATE_STEP_MSB,WREG
VECTOR_ANGLE_MSB = VECTOR_ANGLE_MSB + PARAMETER_BUFFER[LOC_UPDATE_STEP_MSB];//ADDWFC VECTOR_ANGLE_MSB,F
//BNC READ_TIME_TB_COUNT ;DUE TO VECTOR INCREMENT, FOR CARRY = 0, CALCULATE CORRESPONDING TIME VALUES
//INCF SECTOR_NO,F ;DUE TO VECTOR INCREMENT, FOR CARRY = 1, INCREMENT SECTOR NO
//BRA CHECK_SECTOR_OF
} |
BNC READ_TIME_TB_COUNT - вот этот кусочек - проверка на перенос - перенос в случае переполнения - значит как вариант вычесть значение PARAMETER_BUFFER[LOC_UPDATE_STEP_MSB] из 65535 и сравнить с VECTOR_ANGLE_MSB?
вот оригинал
Код:
|
BCF PIR3,PTIF ;CLEAR PWM TIMER INTERUPT FLAG
BTFSS ACSVM_FLAGS_1,FWD_REV
BRA FIND_VECTOR_ANGLE_FOR_REV_DIR
MOVFF PARAMETER_BUFFER+LOC_UPDATE_STEP_LSB,WREG ;INCREMENT VECTOR BY UPDATE STEP SIZE
ADDWF VECTOR_ANGLE_LSB,F
MOVFF PARAMETER_BUFFER+LOC_UPDATE_STEP_MSB,WREG
ADDWFC VECTOR_ANGLE_MSB,F
BNC READ_TIME_TB_COUNT ;DUE TO VECTOR INCREMENT, FOR CARRY = 0, CALCULATE CORRESPONDING TIME VALUES
INCF SECTOR_NO,F ;DUE TO VECTOR INCREMENT, FOR CARRY = 1, INCREMENT SECTOR NO
BRA CHECK_SECTOR_OF |
Последний раз редактировалось mike-y-k; 09.06.2019 в 17:28.
|
|
|
|
09.06.2019, 17:24
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,169
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Перевод из asm в С
Dtolok, таки напишите каждую операцию на asm словами - что происходит.
Потом напишите этот же алгоритм на C. Некоторые конструкции нет смысла воспроизводить на C - они вполне себе являются его свойствами. Например контроль границ массива…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
Сказали "Спасибо" mike-y-k
|
|
|
09.06.2019, 22:24
|
|
Гражданин KAZUS.RU
Регистрация: 28.11.2007
Адрес: харьков
Сообщений: 850
Сказал спасибо: 339
Сказали Спасибо 43 раз(а) в 23 сообщении(ях)
|
Re: Перевод из asm в С
Код:
|
//MOVLW UPPER(TABLE_TB_COUNT_LSB) ;LOAD BASE ADDRESS FOR TB LSB COUNT TABLE TO TABLE POINTER
//MOVWF TBLPTRU
//MOVLW HIGH(TABLE_TB_COUNT_LSB)
//MOVWF TBLPTRH
//MOVLW LOW(TABLE_TB_COUNT_LSB)
//MOVWF TBLPTRL
//MOVF VECTOR_ANGLE_MSB,W ;ADD VECTOR ANGLE TO TABLE POINTER AS OFFESET
//ADDWF TBLPTRL,F
//TBLRD*
//MOVFF TABLAT,TB_COUNT_LSB ;READ TB LSB COUNT AND STORE
//COMF TBLPTRL,F ;COMPLEMENT TABLE POINTER LSB TO READ TA
//TBLRD* ;NOTE TB AND TA ARE COMPLEMENT OF EACH OTHER IN THE SAME SCTOR
//MOVFF TABLAT,TA_COUNT_LSB ;READ TA LSB COUNT AND STORE
//MOVLW UPPER(TABLE_TB_COUNT_MSB) ;LOAD MSB AND USB OF TB MSB COUNT TABLE TO TABLE POINTER
//MOVWF TBLPTRU
//MOVLW HIGH(TABLE_TB_COUNT_MSB)
//MOVWF TBLPTRH
//TBLRD*
//MOVFF TABLAT,TA_COUNT_MSB ;READ TA MSB COUNT AND STORE
//COMF TBLPTRL,F ;COMLEMENT TABLE POINTER LSB TO READ TB
//TBLRD*
// MOVFF TABLAT,TB_COUNT_MSB ;READ TB MSB COUNT AND STORE |
табличное чтение - так где ж здесь указатель таблицу??!!!TABLE_TB_COUNT_LSB - это начало таблицы???
Код:
|
TABLE_TB_COUNT_LSB
GLOBAL TABLE_TB_COUNT_LSB
DATA 0X0400 |
приращение по чтению?
|
|
|
|
10.06.2019, 03:06
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,169
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Перевод из asm в С
Таки напишите нужный Вам алгоритм словами. Потом напишите его на C.
Есть таблица значений известной длины. В процессе она должна быть каким-то образом прочитана и считанные данные должны быть соответствующим образом использованы.
Собственно уже готовый скелет программы:
unsigned char table[размер в байтах];
for (table_index = 0; table_index ‹ размер в байтах; table_index++) {
Операторы обработки для table[table_index]
}
Перевод тут не покомандно делается, а именно алгоритмически.
Рядом с каждой командой напишите для себя выполняемую функцию и используемые операнды, тогда будет сильно понятнее.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
Сказали "Спасибо" mike-y-k
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:29.
|
|