- Вложения
-
- main.c
- (3.96 КБ) 332 скачивания
Програмирование pic на СИ.
- Сообщения: 9
- Зарегистрирован: Чт ноя 05, 2020 21:43:31
Всем добрый день, я в программировании не понимаю, нужна прошивка для pic12f675 или pic12f629 для датчика скорости одометра вектра б, в мплаб пробовал компилировать исходники и постоянно выбрасывает ошибки, прошу вашей помощи.
- Реклама
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
igorua27, какой у вас компилятор, какая версия mplab?
Добавлено after 1 minute 2 seconds:
Вангую, что у вас стоит XC8. А прошивка написана под HI-TECH PICC.
Добавлено after 1 minute 2 seconds:
Вангую, что у вас стоит XC8. А прошивка написана под HI-TECH PICC.
- Сообщения: 9
- Зарегистрирован: Чт ноя 05, 2020 21:43:31
mplab x ide v5.45 компилятор XC8. А как переписать под XC8? Что нужно изменить?
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
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
- Реклама
- Сообщения: 7853
- Зарегистрирован: Ср фев 11, 2009 20:35:58
- Сообщения: 9
- Зарегистрирован: Чт ноя 05, 2020 21:43:31
- Сообщения: 7853
- Зарегистрирован: Ср фев 11, 2009 20:35:58
- Сообщения: 9
- Зарегистрирован: Чт ноя 05, 2020 21:43:31
Выдает ошибку nbproject/Makefile-default.mk:107: recipe for target 'build/default/production/40_629.o' failed
- Сообщения: 7853
- Зарегистрирован: Ср фев 11, 2009 20:35:58
- Сообщения: 9
- Зарегистрирован: Чт ноя 05, 2020 21:43:31
А можете скомпилировать этот файл, здесь я поменял множитель
Добавлено after 6 minutes 4 seconds:
Большое всем спасибо, извините за беспокойствие.
Добавлено after 6 minutes 4 seconds:
Большое всем спасибо, извините за беспокойствие.
- Вложения
-
- 40_629.asm
- (5.7 КБ) 299 скачиваний
- Сообщения: 7853
- Зарегистрирован: Ср фев 11, 2009 20:35:58
- Сообщения: 9
- Зарегистрирован: Чт ноя 05, 2020 21:43:31
- Сообщения: 7853
- Зарегистрирован: Ср фев 11, 2009 20:35:58
- Сообщения: 9
- Зарегистрирован: Чт ноя 05, 2020 21:43:31
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
igorua27, переделал исходник под XC8 бесплатную версию. Множитель 1.5, но целочисленно. Сначала делим на 2, потом прибавляется треть. Так чуть погрешность будет, но собирается на бесплатной XC8:
Добавлено after 21 minute 3 seconds:
Писал еще аналогичное для PIC12F683. Там уже с коэф. в реальных числах и с возможностью задавать коэф. подстроечным резистором от 1.0 до 2.0 плавно. Там ресурсов по-больше - влазиет и с бесплатным 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 скачивания
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Аlex, у вас всё-равно объявления конфиг слова, ISR и прочего - в стиле HI-TECH. Их бесплатная версия XC8 не понимает. Я в варианте выше переписал в стиле нативном для xc8.
И еще per_tmp умножая на 10 - переполнения не может возникать там?
И еще per_tmp умножая на 10 - переполнения не может возникать там?
[uquote="NStorm",url="/forum/viewtopic.php?p=3922657#p3922657"]Их бесплатная версия XC8 не понимает.[/uquote]Всё понимает. Я проверил

PS: XC8, от части - HI-TECH.
Она long. Там до переполнения - как до Китая ракомNStorm писал(а):И еще per_tmp умножая на 10 - переполнения не может возникать там?
PS: XC8, от части - HI-TECH.
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Неа. У вас же PRO лицензия, об этом еще в той теме писали. Откуда там понимание нотации _CONFIG и _isr()? (см. ниже, есть пояснение что нужно выставить, чтобы работало) Сейчас покажу ругань.Всё понимает. Я проверил
Пардон, думал она 16-битная под счетчик.Она long. Там до переполнения - как до Китая раком
Добавлено 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Ага, нашел где собака зарыта. Если в опциях проекта XC8 Global Options поставить C Standard на C90 - начинает собираться и в стиле HI-TECH код. А по умолчанию при создании нового проекта MPLAB X ставит там C99 и там уже не работает )
Там еще CCI какой-то придумали - тоже новые особенности. По-умолчанию пока выключено, но включение тоже меняет многие требования по коду. В мануле расписано.
Последний раз редактировалось NStorm Ср ноя 11, 2020 18:26:35, всего редактировалось 1 раз.


