Програмирование pic на СИ.

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Родился
Сообщения: 9
Зарегистрирован: Чт ноя 05, 2020 21:43:31

Сообщение igorua27 »

Всем добрый день, я в программировании не понимаю, нужна прошивка для pic12f675 или pic12f629 для датчика скорости одометра вектра б, в мплаб пробовал компилировать исходники и постоянно выбрасывает ошибки, прошу вашей помощи.
Вложения
main.c
(3.96 КБ) 332 скачивания
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

igorua27, какой у вас компилятор, какая версия mplab?

Добавлено after 1 minute 2 seconds:
Вангую, что у вас стоит XC8. А прошивка написана под HI-TECH PICC.
Реклама
Родился
Сообщения: 9
Зарегистрирован: Чт ноя 05, 2020 21:43:31

Сообщение igorua27 »

mplab x ide v5.45 компилятор XC8. А как переписать под XC8? Что нужно изменить?
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

igorua27, а под XC8 она не соберется, т.к. в бесплатной версии плохая оптимизация и по месту из-за float операций не влезет. Если найдете PRO версию, то вот так переделать:
Спойлер

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

/****************************************************************/
/* Множитель/делитель частоты                                   */
/* http://radiokot.ru/forum/viewtopic.php?f=20&t=59172          */
/*                                                              */
/* МК:          PIC12F675                                       */
/*                                                              */
/* Автор:       Alex                                            */
/*              al.kl@list.ru                                   */
/*              http://ChipMk.ru                                */
/****************************************************************/
// CONFIG
#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-Up Timer Enable bit (PWRT disabled)
#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)

#include <xc.h>
#include <stdbool.h>       /* For true/false definition */
#include <pic12f675.h>

#define _XTAL_FREQ 4000000 // 4 MHz INTOSC

//static volatile near unsigned int	TMR1		@ 0x00E;
/****************************************************************/
#define MUL         1.5        // Множитель
#define PIN_OUT     GPIO0       // Выходной ПИН
#define TRIS_OUT    TRISIO0     //
/****************************************************************/
volatile unsigned long Per_In = 0; // Преобразованный период входного сигнала
static bool In_Fl = 0; // Флаг окончания преобразования периода
volatile unsigned long Per_Out = 0; // Период выходного сигнала
/****************************************************************/

/****************************************************************/

/****************************************************************/
void main() {

    CMCON = 7; // Настраиваем порты как цифровые
    ANS0 = 0; //
    ANS1 = 0; //
    ANS2 = 0; //
    ANS3 = 0; //

    TRIS_OUT = 0;
    PIN_OUT = 0;

    T0CS = 0;
    PSA = 1;
    PS2 = 0;
    PS1 = 0;
    PS0 = 0;
    TMR0 = 0;
    T0IE = 1;

    TMR1ON = 1;
    TMR1IE = 0;

    INTE = 1;
    INTEDG = 0;

    PEIE = 1;
    GIE = 1;

    Per_Out = 0;

    while (1) {
        unsigned long per_tmp;

        if (In_Fl) {
            In_Fl = 0;

            //--------------------
            GIE = 0;
            per_tmp = Per_In;
            GIE = 1;
            per_tmp /= 2;
            //--------------------
            if (per_tmp) {
                per_tmp = (unsigned long)(per_tmp / MUL);
                GIE = 0;
                Per_Out = per_tmp;
                GIE = 1;
                TMR1IE = 1;
            } else {
                TMR1IE = 0;
                PIN_OUT = 0;
            }
        }
    }
}
/****************************************************************/
void interrupt isr() {
    static bool p_fl = 0; // Флаг преобразования входного периода
    static unsigned int H_Per_In = 0; // Старшие байты вх. периода
    static unsigned char H_Per_Out = 0; // Старший байт вых. периода
    //-------------------------------------//
    if (INTF) {
        INTF = 0;
        if (!p_fl) {
            p_fl = 1;
            TMR0 = 0;
            H_Per_In = 0;
        } else {
            *((char*) &Per_In) = TMR0 + 5;
            TMR0 = 0;
            if (T0IF) // Если было переполнение
                H_Per_In++; // обрабатываем его
            *((int*) ((char*) &Per_In + 1)) = H_Per_In;
            H_Per_In = 0;
            In_Fl = 1; // Ставим флаг окончания преобразования
        }
        T0IF = 0;
    }
    //-------------------------------------//
    if (T0IF && T0IE) {
        T0IF = 0;
        H_Per_In++; //  +256
        if (*((char*) &H_Per_In + 1) >= 16) { //  >=16*65536 ~1000000 МЦ
            H_Per_In = 0;
            p_fl = 0; // Сброс флага преобразования
            Per_In = 0; // Период = 0
            In_Fl = 1; // Ставим флаг окончания преобразования
        }
    }
    //-------------------------------------//
    if (TMR1IF && TMR1IE) {
        TMR1IF = 0;
        if (!H_Per_Out--) {
            TMR1 -= *((int*) ((char*) &Per_Out));
            H_Per_Out = *((char*) &Per_Out + 2);
            PIN_OUT = !PIN_OUT;
        }
    }
    //-------------------------------------//
}

Вам частоту импульсов нужно умножить на некий коэф? Какой будет коэф у вас ?
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 9
Зарегистрирован: Чт ноя 05, 2020 21:43:31

Сообщение igorua27 »

Коэффициент 1,5. Есть еще исходник на асаблере под это камень.
Реклама
Друг Кота
Сообщения: 7853
Зарегистрирован: Ср фев 11, 2009 20:35:58

Сообщение otest »

А с ними что не так?
Реклама
Родился
Сообщения: 9
Зарегистрирован: Чт ноя 05, 2020 21:43:31

Сообщение igorua27 »

Тоже ругаеться, какието ошибки.
Вложения
40_629.asm
(5.7 КБ) 292 скачивания
Друг Кота
Сообщения: 7853
Зарегистрирован: Ср фев 11, 2009 20:35:58

Сообщение otest »

Не ругается
Родился
Сообщения: 9
Зарегистрирован: Чт ноя 05, 2020 21:43:31

Сообщение igorua27 »

Выдает ошибку nbproject/Makefile-default.mk:107: recipe for target 'build/default/production/40_629.o' failed
Друг Кота
Сообщения: 7853
Зарегистрирован: Ср фев 11, 2009 20:35:58

Сообщение otest »

Я тебе НЕХ скомпилировал для прошивки МК. Что ещё нужно?
Родился
Сообщения: 9
Зарегистрирован: Чт ноя 05, 2020 21:43:31

Сообщение igorua27 »

А можете скомпилировать этот файл, здесь я поменял множитель

Добавлено after 6 minutes 4 seconds:
Большое всем спасибо, извините за беспокойствие.
Вложения
40_629.asm
(5.7 КБ) 299 скачиваний
Друг Кота
Сообщения: 7853
Зарегистрирован: Ср фев 11, 2009 20:35:58

Сообщение otest »

Нет не могу. 1.5 асм в таком виде не примет.
Родился
Сообщения: 9
Зарегистрирован: Чт ноя 05, 2020 21:43:31

Сообщение igorua27 »

Ну тогда 2.
Друг Кота
Сообщения: 7853
Зарегистрирован: Ср фев 11, 2009 20:35:58

Сообщение otest »

Два
Родился
Сообщения: 9
Зарегистрирован: Чт ноя 05, 2020 21:43:31

Сообщение igorua27 »

Большое спасибо.
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

igorua27, переделал исходник под XC8 бесплатную версию. Множитель 1.5, но целочисленно. Сначала делим на 2, потом прибавляется треть. Так чуть погрешность будет, но собирается на бесплатной XC8:

Добавлено after 21 minute 3 seconds:
Писал еще аналогичное для PIC12F683. Там уже с коэф. в реальных числах и с возможностью задавать коэф. подстроечным резистором от 1.0 до 2.0 плавно. Там ресурсов по-больше - влазиет и с бесплатным XC8.
Вложения
radiokot-pic12f675-proj.X.production.hex
(1.98 КБ) 275 скачиваний
main.c
(5.12 КБ) 302 скачивания
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Версия без float.
Кэф = 1.5
taho_675.zip
(184.85 КБ) 279 скачиваний
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Аlex, у вас всё-равно объявления конфиг слова, ISR и прочего - в стиле HI-TECH. Их бесплатная версия XC8 не понимает. Я в варианте выше переписал в стиле нативном для xc8.
И еще per_tmp умножая на 10 - переполнения не может возникать там?
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

[uquote="NStorm",url="/forum/viewtopic.php?p=3922657#p3922657"]Их бесплатная версия XC8 не понимает.[/uquote]Всё понимает. Я проверил :)
NStorm писал(а):И еще per_tmp умножая на 10 - переполнения не может возникать там?
Она long. Там до переполнения - как до Китая раком :))

PS: XC8, от части - HI-TECH.
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Всё понимает. Я проверил
Неа. У вас же PRO лицензия, об этом еще в той теме писали. Откуда там понимание нотации _CONFIG и _isr()? (см. ниже, есть пояснение что нужно выставить, чтобы работало) Сейчас покажу ругань.
Она long. Там до переполнения - как до Китая раком
Пардон, думал она 16-битная под счетчик.

Добавлено after 1 minute 59 seconds:
Ошибки сборки:

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

main.c:21:8: error: unknown type name 'bit'
static bit               In_Fl=0;        // Флаг окончания преобразования периода
       ^
main.c:27:6: error: variable has incomplete type 'void'
void interrupt _isr(void){
     ^
main.c:27:15: error: expected ';' after top level declarator
void interrupt _isr(void){
              ^
              ;
3 errors generated.
(908) exit status = 1
Добавлено after 4 minutes 10 seconds:
Ага, нашел где собака зарыта. Если в опциях проекта XC8 Global Options поставить C Standard на C90 - начинает собираться и в стиле HI-TECH код. А по умолчанию при создании нового проекта MPLAB X ставит там C99 и там уже не работает )

Там еще CCI какой-то придумали - тоже новые особенности. По-умолчанию пока выключено, но включение тоже меняет многие требования по коду. В мануле расписано.
Последний раз редактировалось NStorm Ср ноя 11, 2020 18:26:35, всего редактировалось 1 раз.
Ответить

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