02.06.2019, 12:09
|
|
Гражданин KAZUS.RU
Регистрация: 28.11.2007
Адрес: харьков
Сообщений: 850
Сказал спасибо: 339
Сказали Спасибо 43 раз(а) в 23 сообщении(ях)
|
Перевод из asm в С
использую для своих нужд программу микрочипа по управлению асинхронного двигателя AN955 но возникла необходимость немного ее модифицировать - пришла в голову идея использовать ее совместно с "С" . однако не тут то было - то что нормально функционирует в Х16 - не работает в Х8 - а именно совместное использование файлов асм и С. пытался как то переписать на С всю программу - результат плачевный ![Расстроен](images/smilies/icon_sad.gif) ! в ступор вводит меня кусок кода - MOVFF PRODH,PARAMETER_BUFFER+LOC_REQD_SPEED_HZ - последние 2 параметра определены как константы .... кто подскажет как соединить не соединяемое???
|
|
|
|
02.06.2019, 13:05
|
|
Гражданин KAZUS.RU
Регистрация: 10.06.2010
Сообщений: 598
Сказал спасибо: 222
Сказали Спасибо 234 раз(а) в 154 сообщении(ях)
|
Re: Перевод из acm в С
PRODH - адрес регистра(название переменной) откуда производится запись
PARAMETER_BUFFER - адрес начала массива в ОЗУ
LOC_REQD_SPEED_HZ - смещение адреса (номер элемента массива)
на Си:
PARAMETER_BUFFER[LOC_REQD_SPEED_HZ]=PRODH
или структура
PARAMETER_BUFFER - адрес начала структуры или название структуры в ОЗУ
LOC_REQD_SPEED_HZ - смещение адреса в структуре (название переменной в структуре)
на Си:
PARAMETER_BUFFER.LOC_REQD_SPEED_HZ=PRODH - если PARAMETER_BUFFER название структуры
PARAMETER_BUFFER-›LOC_REQD_SPEED_HZ=PRODH - если PARAMETER_BUFFER адрес структуры
Последний раз редактировалось DmitriyVDN; 02.06.2019 в 13:22.
|
|
|
Сказали "Спасибо" DmitriyVDN
|
|
|
02.06.2019, 13:16
|
|
Гражданин KAZUS.RU
Регистрация: 28.11.2007
Адрес: харьков
Сообщений: 850
Сказал спасибо: 339
Сказали Спасибо 43 раз(а) в 23 сообщении(ях)
|
Re: Перевод из acm в С
MOVFF fs, fd Пересылка из fs в fd
извините а может быть вот так?
PARAMETER_BUFFER[LOC_REQD_SPEED_HZ] = PRODH;
|
|
|
|
02.06.2019, 13:22
|
|
Гражданин KAZUS.RU
Регистрация: 10.06.2010
Сообщений: 598
Сказал спасибо: 222
Сказали Спасибо 234 раз(а) в 154 сообщении(ях)
|
Re: Перевод из acm в С
Сообщение от Dtolok
|
PARAMETER_BUFFER[LOC_REQD_SPEED_HZ] = PRODH;
|
да именно так , пост исправил и дополнил
|
|
|
Сказали "Спасибо" DmitriyVDN
|
|
|
02.06.2019, 13:40
|
|
Гражданин KAZUS.RU
Регистрация: 28.11.2007
Адрес: харьков
Сообщений: 850
Сказал спасибо: 339
Сказали Спасибо 43 раз(а) в 23 сообщении(ях)
|
Re: Перевод из acm в С
в программе указано как
#DEFINE PARAMETER_BUFFER_SIZE 0X35 ;SYSTEM PARAMETER BUFFER SIZE
это буфер размером с 0х35 и смещение будет 0х2С
значит надо в С указать буфер с таким же размером
char PARAMETER_BUFFER_SIZE [0X35];
а #DEFINE LOC_REQD_SPEED_HZ 0X2C так и оставляем?
|
|
|
|
02.06.2019, 14:17
|
|
Гражданин KAZUS.RU
Регистрация: 10.06.2010
Сообщений: 598
Сказал спасибо: 222
Сказали Спасибо 234 раз(а) в 154 сообщении(ях)
|
нет.
так и пишем:
#DEFINE PARAMETER_BUFFER_SIZE 0X35
#DEFINE LOC_REQD_SPEED_HZ 0X2C
создаем масив
char PARAMETER_BUFFER [ PARAMETER_BUFFER_SIZE];
обращаемся к 0х2с элементу массива
х=PARAMETER_BUFFER[LOC_REQD_SPEED_HZ]
бегло просмотрел код, использование PARAMETER_BUFFER_SIZE и обращение к элементам буфера в цикле не увидел, может не доглядел. поэтому буфер лучше оформить в виде структуры
Код:
|
struct TYPE_BUFFER
{
char LOC_BUFFER_CHKSUM_1;
char LOC_BUFFER_CHKSUM_2;
char LOC_MOTOR_VOLTAGE_LSB;
char LOC_MOTOR_CURRENT;
//......
//......
char LOC_REQD_SPEED_HZ;
char LOC_UPDATE_STEP_LSB;
//.......
//.......
char LOC_FUTURE_USE_4;
char LOC_FUTURE_USE_5;
}PARAMETER_BUFFER; |
и обращаться
x= PARAMETER_BUFFER.LOC_REQD_SPEED_HZ
это будет правильней.
Последний раз редактировалось mike-y-k; 02.06.2019 в 19:08.
|
|
|
Сказали "Спасибо" DmitriyVDN
|
|
|
02.06.2019, 17:47
|
|
Гражданин KAZUS.RU
Регистрация: 28.11.2007
Адрес: харьков
Сообщений: 850
Сказал спасибо: 339
Сказали Спасибо 43 раз(а) в 23 сообщении(ях)
|
никак не соображу с этой записью :
LFSR FSR0,PARAMETER_BUFFER ;LOAD PARAMETER_BUFFER BASE ADDRESS
при том что:
PARAMETER_BUFFER RES PARAMETER_BUFFER_SIZE ;PARAMETER BUFFER
вот весь кусок
Код:
|
READ_SYSTEM_PARAMETERS
LFSR FSR0,PARAMETER_BUFFER ;LOAD PARAMETER_BUFFER BASE ADDRESS
MOVLW SYSTEM_PARAMETER_COUNT
MOVWF TEMP5 ;LOAD SYSTEM PARAMETERS COUNT
BCF EECON1,CFGS ;ACCESS FLASH/EEPROM MEMORY
BCF EECON1,EEPGD ;ACCESS EEPROM MEMORY
CLRF EEADR ;POINT TO FIRST DATA TO BE READ
NEXT_READ
BSF EECON1,RD ;ENABLE READ
MOVFF EEDATA,POSTINC0
INCF EEADR ;POINT TO NEXT DATA TO BE READ
DECFSZ TEMP5,F ;ALL DATA READ COMPLETE?
BRA NEXT_READ ;NO - READ NEXT DATA
RETURN ;YES - ALL READ OVER. RETURN TO MAIN |
собственно из него следует что идет чтение из еепром по адресу FSR0 в буфер PARAMETER_BUFFER ? или я что то путаю?
Код:
|
void READ_SYSTEM_PARAMETERS(void) {
EECON1bits.CFGS = 0; //ACCESS FLASH/EEPROM MEMORY
EECON1bits.EEPGD = 0; //ACCESS EEPROM MEMORY
EEADR = 0x00; //POINT TO FIRST DATA TO BE READ
for (TEMP5 == 0; TEMP5 ‹= SYSTEM_PARAMETER_COUNT ; TEMP5++) {
EECON1bits.RD = 1; //ENABLE READ
PARAMETER_BUFFER[TEMP5] = EEDATA;
EEADR++; //POINT TO NEXT DATA TO BE READ
}
} |
Последний раз редактировалось mike-y-k; 02.06.2019 в 19:09.
|
|
|
|
02.06.2019, 19:14
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,169
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Перевод из asm в С
Dtolok, попробуйте поиском. В прошлом веке на эту тему были программы конвертации и даже с настройкой под систему команд конкретного процессора с возможностями его ассемблера.
Но ручной работы на полученном было немало.
Очень помогает листинг ассемблера после компиляции для анализа…
Самым продуктивным будет путь с выделением из кода на asm алгоритма и его реализация на C.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
Сказали "Спасибо" mike-y-k
|
|
|
02.06.2019, 19:52
|
|
Гражданин KAZUS.RU
Регистрация: 10.06.2010
Сообщений: 598
Сказал спасибо: 222
Сказали Спасибо 234 раз(а) в 154 сообщении(ях)
|
Re: Перевод из asm в С
Сообщение от Dtolok
|
собственно из него следует что идет чтение из еепром по адресу FSR0 в буфер PARAMETER_BUFFER ? или я что то путаю?
|
таки да , не путаете.
но что-то на Си вы намудрили...по моему это выглядит так:
Код:
|
void READ_SYSTEM_PARAMETERS(void) {
char TEMP5 = SYSTEM_PARAMETER_COUNT;
while(TEMP5--)
{
PARAMETER_BUFFER[TEMP5]=EEPROM_READ(TEMP5);
}
} |
|
|
|
Сказали "Спасибо" DmitriyVDN
|
|
|
02.06.2019, 20:16
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,169
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Перевод из asm в С
Dtolok, вдогонку ![Прикольно](images/smilies/icon_wink3.gif)
Наоборот (C-›asm) таки совсем без проблем - этого не обойти никак ![Озадачен](images/smilies/icon_confused.gif) , а вот наоборот в общем случае только через реализацию алгоритма получится.
Анализ полученного из C машинного кода сильно поможет в понимании работы компилятора и представлении конструкций C в машинных командах. Заодно стоит посмотреть на работу опций компилятора для оптимизации. При написании эффективного кода на C, поиске ошибок и отладке впоследствии очень поможет…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
Сказали "Спасибо" mike-y-k
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:31.
|
|