Форум РадиоКот https://radiokot.ru/forum/ |
|
Не правильная компиляция СИ кода в HEX / MPLAB X | C https://radiokot.ru/forum/viewtopic.php?f=58&t=154174 |
Страница 1 из 1 |
Автор: | Lublu_megy [ Чт апр 12, 2018 23:06:18 ] |
Заголовок сообщения: | Не правильная компиляция СИ кода в HEX / MPLAB X | C |
Всем привет! Пытаюсь освоить PIC12F629. В качестве IDE выбрал MPLAB X. Сделал блинк, компилирую... загружаю в PicKit 3 Programmer... и не работает. PIC выдаёт 0.10 вольт на пине. Посмотрел в HEX и тут вижу: в самом начале какой-то "2BFD" на 000. На "3e2" уже начинаются какие-то данные. Почему так произходит? (При компиляции ассеблерского кода всё нормально.) СпойлерКод: // CONFIG #pragma config FOSC = EXTRCCLK // Oscillator Selection bits (RC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin, RC on GP5/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = ON // Power-Up Timer Enable bit (PWRT enabled) #pragma config MCLRE = ON // GP3/MCLR pin function select (GP3/MCLR pin function is MCLR) #pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled) #pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled) #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include <xc.h> #include <pic12f629.h> #define _XTAL_FREQ 4000000 void main(void){ //Вспомогательная переменная //для организации временной задержки unsigned long counter; //Настройка портов ввода/вывода PIC12F675 //Выключение подтягивающих резисторов WPU = 0x00; //Запретить использование подтягивающих резисторов OPTION_REGbits.nGPPU = 1; // отключить компаратор CMCON = 0x07; //Настрока выходов GP4, GP5 на выход TRISIO = 0; //Установка на выходах GP4, GP5 лог. 0 GPIO = 0; //Бесконечный цикл. while(1){ GPIO4 ^=1; //выв. 3 инверсия бита 4 //Задержка на 1 сек __delay_ms(1000); } } |
Автор: | oleg110592 [ Пт апр 13, 2018 10:49:48 ] |
Заголовок сообщения: | Re: Не правильная компиляция СИ кода в HEX / MPLAB X | C |
... и не работает поправил, расположил тут: viewtopic.php?p=3352979#p3352979 в протеусе мигает з.ы. у этих пиков, насколько помню, в начале программы должна быть команда загрузки константы для внутреннего RC генератора или переход в конец. А компилятор вроде с давних времен код с конца размещал. |
Автор: | КРАМ [ Сб апр 14, 2018 07:50:26 ] |
Заголовок сообщения: | Re: Не правильная компиляция СИ кода в HEX / MPLAB X | C |
Посмотрел в HEX и тут вижу: в самом начале какой-то "2BFD" на 000. На "3e2" уже начинаются какие-то данные. Почему так произходит? 0x2BFD это команда goto 0x03FD, то есть безусловный переход по адресу 0x03FD. Так как в исходном коде нет обработчика прерываний, кода по вектору 0х0004 нет. Размещение кода "снизу" флеша - стандартная фича микрочиповских компиляторов для 8-разрядных контроллеров. Сверху (младшие адреса) обычно размещаются таблицы констант. Даже тело обработчика прерываний размещается снизу, а на векторе 0004 тоже обычно goto. PS. Далее исполнение выглядит так (в коде нет вызова калибровочной константы): Код: 0x03FD 0x0183 clrf STATUS
0x03FE 0x2BE2 goto 0x03E2 0x03E2 0x1683 bsf STATUS, RP0 0x03E3 0x0195 clrf WPU ; WPU=0x00 0x03E4 0x1781 bsf OPTION_REG, GPPU 0x03E5 0x3007 movlw 0x07 0x03E6 0x1283 bcf STATUS, RP0 0x03E7 0x0099 movwf CMCON0 ; CMCON=0x07 0x03E8 0x1683 bsf STATUS, RP0 0x03EA 0x0185 clrf TRISIO ; TRISIO=0x00 0x03EB 0x1283 bcf STATUS, RP0 0x03EC 0x0185 clrf GPIO ; GPIO=0x00 0x03ED 0x1283 bcf STATUS, RP0 0x03EE 0x3010 movlw 0x10 ..... |
Автор: | Lublu_megy [ Вс апр 15, 2018 00:01:00 ] | |||
Заголовок сообщения: | Re: Не правильная компиляция СИ кода в HEX / MPLAB X | C | |||
... и не работает поправил, расположил тут: viewtopic.php?p=3352979#p3352979 в протеусе мигает з.ы. у этих пиков, насколько помню, в начале программы должна быть команда загрузки константы для внутреннего RC генератора или переход в конец. А компилятор вроде с давних времен код с конца размещал. Урааа!!! Работает!! Только надо было поправить GPIO4 на GPIO2. Я рад как ребёнок!!!!11 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Код: СпойлерКод: #pragma config FOSC = INTRCIO // #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = ON // Power-Up Timer Enable bit (PWRT enabled) #pragma config MCLRE = OFF // #pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled) #pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled) #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include <xc.h> #define _XTAL_FREQ 4000000 void main(void){ //Вспомогательная переменная //для организации временной задержки unsigned long counter; //Настройка портов ввода/вывода PIC12F675 //Выключение подтягивающих резисторов WPU = 0x00; //Запретить использование подтягивающих резисторов OPTION_REGbits.nGPPU = 1; // отключить компаратор CMCON = 0x07; //Настрока выходов GP4, GP5 на выход TRISIO = 0; //Установка на выходах GP4, GP5 лог. 0 GPIO = 0; //Бесконечный цикл. while(1){ GPIO2 ^=1; //выв. 3 инверсия бита 4 //Задержка на 1 сек __delay_ms(1000); } }
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |