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

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
shindax
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Сб сен 19, 2009 07:02:19

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

Сообщение shindax »

Приведите весь код и текст сообщений компилятора.
Реклама
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

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

Сообщение Roman Venom »

Усё работает корретно, однако предупреждения засоряют окно отладчика, что напрягает. PIC24, XC16.

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

char str[]="Temperature=";
char ii;
char data_length;
data_length=strlen(str);
for (ii=0;ii<data_length;ii++)
{
   WriteData(str[ii]);//warning: array subscript has type 'char' Пробовал int - тоже самое
}

itoa(&str,T,10);warning: passing argument 1 of 'itoa' from incompatible pointer type. 
Последний раз редактировалось Roman Venom Пт дек 11, 2015 09:49:51, всего редактировалось 4 раза.
Успех - императив!
Реклама
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

vinni_puh писал(а): void function(char *DI_GIT){...}
char digi[4]="10";
function(digi); - не компилится - не нравится указатель (char *DI_GIT).
функция принимает char* а вы ей передаёте char[]. Явно приведите к (char*) - скушает.
PS: Кстати, общепринято, что капслоком объявляются макроопределения препроцессора - и в данном конкретном случае DI_GIT режет глаз и не даёт расслабиться подсознанию. ;)
PS2: Да и функцию объявить лучше как void function(const char *DI_GIT){...}
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

Roman Venom писал(а):

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

char str[]="Temperature=";
char ii;
[...]
   WriteData(str[ii]);// warning: array subscript has type 'char'
[...]
itoa(&str,T,10); //warning: passing argument 1 of 'itoa' from incompatible pointer type
По странной прихоти хочет чтобы индекс массива был беззнаковым, хотя классическое знаковое int в этом качестве возражений не вызывает. [риторически в пространство] Где логика, где разум ?
В itoa принимается ЕМНИП char* а вы передаёте туда указатель на char[] - т.е. фактически char**. Амперсанд не нужен ©. Когда начнётся ругань про несоответствие типа - явно приведите к char* - см. моё сообщение в этой теме 5 минутами ранее. ;)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Реклама
Эиком - электронные компоненты и радиодетали
vinni_puh
Встал на лапы
Сообщения: 99
Зарегистрирован: Ср мар 25, 2015 09:12:45

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

Сообщение vinni_puh »

>>void function(const char *DI_GIT){...}

Уже победил! Именно как раз это и требовалось.)

И strlen() победил... А вот itoa() пока мозг парит(
Тут ведь все на уровень ниже, чем под ОСЬ писать... Внимательность х10 требуется!
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

vinni_puh писал(а):А вот itoa() пока мозг парит

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

itoa(str,T,10);
itoa принимает указатель на char, т.е. char*. Имя массива - это и есть указатель на char, указывающий на первый элемент массива.
А Вы пытаетесь передать адрес указателя. Вот он Вас и материт :)
Если амперсанд Вам покоя не даёт, и Вы хотите с ним :

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

itoa(&str[0],T,10);   // Укладываем строку, начиная с 1-ого элемента массива
itoa(&str[5],T,10);   // Укладываем строку, начиная с 6-ого элемента массива
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Roman Venom писал(а):

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

   WriteData(str[ii]);//warning: array subscript has type 'char' Пробовал int - тоже самое
Где нужен амперсанд - не пишите, где не нужен - пишите. Странно как то... :)
Судя по вызову, WriteData у Вас обрабатывает 1 символ. Зачем Вы тогда в ней принимаете указатель (char*) ? Так бы и принимали просто символ (char) и обрабатывали его.
И ещё, вот это :

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

data_length=strlen(str);
for (ii=0;ii<data_length;ii++)
{
   WriteData(str[ii]);//warning: array subscript has type 'char' Пробовал int - тоже самое
}
можно заменить на :

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

char* p;
......
......
p=str;
while(*p)  WriteData(*p++);
тем самым избавляясь от strlen. Зачем лишний раз перебирать всю строку (strlen это делает), если перебор итак будет выполняться ?
vinni_puh
Встал на лапы
Сообщения: 99
Зарегистрирован: Ср мар 25, 2015 09:12:45

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

Сообщение vinni_puh »

Спасибо котейники!)

По itoa получилось, и так и так. Как в анекдоте про врачей - вторая заповедь врача - внимательность!)

Извиняюсь)
Только тему начал постигать, вот вопрос:
Написал:

while(num<(int)(delay/2))

Тут я понял, что во-первых если в условии получается float работать не будет, надо к целому приводить, и все равно - такое приведение в условии не проканало.
Сделал:
int del3=delay/3;
while(num<del3)

Это работает. Вопрос - вначале хотел на переменных сэкономить, но насколько я понимаю - если операция все равно выполняется, хоть явно хоть неявно - экономии все равно не будет? 2-й работающий вариант вероятно, не особенно отягощен данными в сравнении с 1-м?

Явно не проверял как ведет себя GCC на таких делениях, но пока такую особенность встретил только сейчас.
const1105
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Сб мар 19, 2011 15:19:47
Откуда: Владивосток

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

Сообщение const1105 »

Помогите специалисту, учившему программирование на фортране с перфокартами.......))))
Задача. Вывожу на порт одновременно некое состояние портов PORTB = 0b00001111,
Если меняю назначение портов, согласно лучшей разводке платы.или замена МК, к примеру, то необходимо выводить
другое значение, пусть PORTB = 0b0101010101.
Вопрос - если при чтении я могу через дефайн назначить IN RA5, к примеру, то как это сделать для выхода?
То есть назначаю out1 RB4, out5 RB6. И при этом единичное значение ставиться в нужный бит?
То есть в дефйне нужно назначить номер бита?
Chettuser

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

Сообщение Chettuser »

Я уже давно с PIC переехал, так что не помню, но...
Вроде LATB - отвечает за выход, PORTB - за вход. TRISB - направление: вход/выход.
Поэтому наверное надо так:

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

#define out1 LATB4;
#define out2 LATB6;
(Синтаксис зависит от Вашего компилятора)
При этом настроить нужные пины PORTB на выход (приравнять их TRISB к "0")

Кстати, состояние TRIS запомнить легко мнемонически:
"1" - это Input
"0" - это Output
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Зависит от того, что вы хотите с этими битами делать. Если только по одному менять, то объявляйте LATBx, но если для заполнения маски, то просто число. Но в обоих случаях можно безболезненно переопределяться только в пределах одного порта. Или если подразумевается доступ только одного типа, то можно писать полную подстановку типа LATBbits.LATB6

DISCLAIMER: это точно относится к компилятору picc18, как порты определены в XC8 я пока не в курсе.
Вот пример, как у меня было сделано определение. используются все 3 варианта.

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

#define DISP_RS	0
#define RDISP_RS	LATE0
#define DISP_RW	1
#define RDISP_RW	LATE1
#define DISP_E		2
#define RDISP_E	LATE2
#define LED_RED	LATB5
#define INPUT		PORTBbits.RB0

LATBbits.LED_RED = 1;
....
	LATE = (1<<DISP_RS) | (0<<DISP_RW) | (0<<DISP_E) ;
	LATD = data;
	TRISD = 0x00;	// выводим данные на шину
	LATEbits.RDISP_E = 1;
	Delay10TCYx(2);
	LATEbits.RDISP_E = 0;
	Delay10TCYx(2);
	TRISD = 0xff;
....
Еще, регистр LATx отсутствует у старых PIC-ов. Тогда все операции ведутся с регистром PORTx и вместо LATBx, надо писать RBx.
const1105
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Сб мар 19, 2011 15:19:47
Откуда: Владивосток

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

Сообщение const1105 »

Огромное спасибо! Повернули мысли в нужном направлении.)))
vinni_puh
Встал на лапы
Сообщения: 99
Зарегистрирован: Ср мар 25, 2015 09:12:45

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

Сообщение vinni_puh »

Доброй ночи!

Буду ковырять 1-wire... Вопрос - можно ли использовать требуемый delay на базе простейшего delay-а сделанного из пустого декрементирующегося for-а? Посчитаю на реальном кристалле сколько витков такого for-a производится за секунду, и на базе этого тайм-слоты сформирую.
Chettuser

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

Сообщение Chettuser »

А таймер не проще?
Для особо ленивых полосатых - где то программка пробегала PIC Timer Calculator.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25237
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

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

vinni_puh писал(а):Доброй ночи!

Буду ковырять 1-wire... Вопрос - можно ли использовать требуемый delay на базе
Ковырять delay конечно можно, но тогда это будет ЕДИНСТВЕННОЙ функцией в main, которую МК будет способен выполнять во время передачи. Кроме того, прием придется организовывать уже с помощью таймера.
Может все таки логичней все делать на таймере?
Делать медленный интерфейс на задержках годится только для учебных задач для нестрогого препода...
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

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

Сообщение Roman Venom »

Аlex писал(а):
Roman Venom писал(а):

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

   WriteData(str[ii]);//warning: array subscript has type 'char' Пробовал int - тоже самое
Где нужен амперсанд - не пишите, где не нужен - пишите. Странно как то... :)
Судя по вызову, WriteData у Вас обрабатывает 1 символ. Зачем Вы тогда в ней принимаете указатель (char*) ? Так бы и принимали просто символ (char) и обрабатывали его.
И ещё, вот это :

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

data_length=strlen(str);
for (ii=0;ii<data_length;ii++)
{
   WriteData(str[ii]);//warning: array subscript has type 'char' Пробовал int - тоже самое
}
можно заменить на :

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

char* p;
......
......
p=str;
while(*p)  WriteData(*p++);
тем самым избавляясь от strlen. Зачем лишний раз перебирать всю строку (strlen это делает), если перебор итак будет выполняться ?
Да, и правда. Можно ведь просто перебирать адрес... Указатели - моё больное место. Нужно всё же выделить время и нормально с ними разобраться. :beer:
Успех - императив!
vinni_puh
Встал на лапы
Сообщения: 99
Зарегистрирован: Ср мар 25, 2015 09:12:45

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

Сообщение vinni_puh »

Доброо времени!

Экспериментирую с протеусом и кристаллом... Кристалл - 16F628A коего ящики валяются). В целом со скрипом работается, разобраться не могу со следующим. В протеусе 20000 оборотов цикла с 1 декрементом происходит за менее 1 сек, на кристалле - более 10 сек . Понять не могу - где я с тактированием напартачил? Управляю так:

#pragma target clock 4_000_000
#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF

Что надо подтягивать MCLRE уже понял, для проверки отключил это.

Понимаю, такими циклами время считать не надо, клятвенно заверяю что для 1wire буду юзать TMR))))) но все-же непонятно - что с тактированием?

И второе. Щас слепил код, для отправки по UART. Выходы RX & TX PICa совместимы напрямую с RX & TX микрухи FT232?
Я в отладочных целях данные в UART выбрасывать буду, а всякие там таблошки - LCDшки - потом...
Есть переходники на такой микрухе. Как водится, в proteus-е передача на TX работает... Осталось посмотреть в железе.
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

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

Сообщение Roman Venom »

vinni_puh
в протезе частота задаётся ещё в свойствах, MCLR в протезе тоже надо подтягивать. Ну и маш цикл это Fosc/4 для PIC16.
Успех - императив!
vinni_puh
Встал на лапы
Сообщения: 99
Зарегистрирован: Ср мар 25, 2015 09:12:45

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

Сообщение vinni_puh »

Эту хрень разобрал уже. Надо было в PCON задать 4-й бит 1 а не 0. Вот и шпарило 37кГц... Неутешительно для новичка - без подробного ковыряния в даташитах не обойтись... И вариантов глюков столько - угадать на пальцах никто не сможет.

Ладно, завелось вроде 4МГц, по крайней мере на линии TX от наушников потрескивание в точности такое, как осциллограмма в протеусе, и временные интервалы в серии.

Лиха беда начало... Отправляю в ТХ ANSI - байты А, В,С 6 штук за серию. Пока переходник 232 их не видит в гипертерминале... Дальше ковыряемся)
Ответить

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