Не правильная компиляция СИ кода в HEX / MPLAB X | C

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Lublu_megy
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вт дек 12, 2017 16:52:57
Откуда: Вам широту и долготу скинуть?

Не правильная компиляция СИ кода в HEX / MPLAB X | C

Сообщение Lublu_megy »

Всем привет! Пытаюсь освоить 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);
    }
     
}

ааааааааааааааааааааааааа็аааааааааааааааааааааааа็аааааааааааааааааааааааа, I love this.ааааааааааааааааааааааааа็аааааааааааааааааааааааа็аааааааааааааааааааааааа

Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Не правильная компиляция СИ кода в HEX / MPLAB X | C

Сообщение oleg110592 »

[uquote="Lublu_megy",url="/forum/viewtopic.php?p=3352735#p3352735"]... и не работает[/uquote]
поправил, расположил тут:
http://radiokot.ru/forum/viewtopic.php? ... 9#p3352979
в протеусе мигает
з.ы. у этих пиков, насколько помню, в начале программы должна быть команда загрузки константы для внутреннего RC генератора или переход в конец. А компилятор вроде с давних времен код с конца размещал.
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Не правильная компиляция СИ кода в HEX / MPLAB X | C

Сообщение КРАМ »

[uquote="Lublu_megy",url="/forum/viewtopic.php?p=3352735#p3352735"]Посмотрел в HEX и тут вижу: в самом начале какой-то "2BFD" на 000. На "3e2" уже начинаются какие-то данные. Почему так произходит?[/uquote]
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
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вт дек 12, 2017 16:52:57
Откуда: Вам широту и долготу скинуть?

Re: Не правильная компиляция СИ кода в HEX / MPLAB X | C

Сообщение Lublu_megy »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3352999#p3352999"][uquote="Lublu_megy",url="/forum/viewtopic.php?p=3352735#p3352735"]... и не работает[/uquote]
поправил, расположил тут:
http://radiokot.ru/forum/viewtopic.php? ... 9#p3352979
в протеусе мигает
з.ы. у этих пиков, насколько помню, в начале программы должна быть команда загрузки константы для внутреннего RC генератора или переход в конец. А компилятор вроде с давних времен код с конца размещал.[/uquote]
Урааа!!! Работает!! Только надо было поправить GPIO4 на GPIO2. Я рад как ребёнок!!!!11 :)) :lol: :) 8) :love: :wink: :))) :idea:
Изображение
Код:
Спойлер

Код: Выделить всё

#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);
    }
}
Вложения
MAIN.c
pic12f629 blink C
(1.42 КБ) 590 скачиваний
worked_test.X.production.hex
pic12f629 blink
(215 байт) 599 скачиваний

ааааааааааааааааааааааааа็аааааааааааааааааааааааа็аааааааааааааааааааааааа, I love this.ааааааааааааааааааааааааа็аааааааааааааааааааааааа็аааааааааааааааааааааааа

Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «PIC»