Усё работает корретно, однако предупреждения засоряют окно отладчика, что напрягает. 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 раз(а).
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!
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
Заголовок сообщения: Re: Програмирование pic на СИ.
Добавлено: Пт дек 11, 2015 22:30:20
Модератор
Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4568 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
vinni_puh писал(а):
А вот itoa() пока мозг парит
Код:
itoa(str,T,10);
itoa принимает указатель на char, т.е. char*. Имя массива - это и есть указатель на char, указывающий на первый элемент массива. А Вы пытаетесь передать адрес указателя. Вот он Вас и материт Если амперсанд Вам покоя не даёт, и Вы хотите с ним :
Код:
itoa(&str[0],T,10); // Укладываем строку, начиная с 1-ого элемента массива itoa(&str[5],T,10); // Укладываем строку, начиная с 6-ого элемента массива
Заголовок сообщения: Re: Програмирование pic на СИ.
Добавлено: Пт дек 11, 2015 22:55:31
Модератор
Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4568 Откуда: Планета Земля
Рейтинг сообщения:1 Медали: 1
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 - тоже самое }
По itoa получилось, и так и так. Как в анекдоте про врачей - вторая заповедь врача - внимательность!)
Извиняюсь) Только тему начал постигать, вот вопрос: Написал:
while(num<(int)(delay/2))
Тут я понял, что во-первых если в условии получается float работать не будет, надо к целому приводить, и все равно - такое приведение в условии не проканало. Сделал: int del3=delay/3; while(num<del3)
Это работает. Вопрос - вначале хотел на переменных сэкономить, но насколько я понимаю - если операция все равно выполняется, хоть явно хоть неявно - экономии все равно не будет? 2-й работающий вариант вероятно, не особенно отягощен данными в сравнении с 1-м?
Явно не проверял как ведет себя GCC на таких делениях, но пока такую особенность встретил только сейчас.
Помогите специалисту, учившему программирование на фортране с перфокартами.......)))) Задача. Вывожу на порт одновременно некое состояние портов PORTB = 0b00001111, Если меняю назначение портов, согласно лучшей разводке платы.или замена МК, к примеру, то необходимо выводить другое значение, пусть PORTB = 0b0101010101. Вопрос - если при чтении я могу через дефайн назначить IN RA5, к примеру, то как это сделать для выхода? То есть назначаю out1 RB4, out5 RB6. И при этом единичное значение ставиться в нужный бит? То есть в дефйне нужно назначить номер бита?
Заголовок сообщения: Re: Програмирование pic на СИ.
Добавлено: Сб дек 12, 2015 15:03:40
Я уже давно с PIC переехал, так что не помню, но... Вроде LATB - отвечает за выход, PORTB - за вход. TRISB - направление: вход/выход. Поэтому наверное надо так:
Код:
#define out1 LATB4; #define out2 LATB6;
(Синтаксис зависит от Вашего компилятора) При этом настроить нужные пины PORTB на выход (приравнять их TRISB к "0")
Кстати, состояние TRIS запомнить легко мнемонически: "1" - это Input "0" - это Output
Зависит от того, что вы хотите с этими битами делать. Если только по одному менять, то объявляйте LATBx, но если для заполнения маски, то просто число. Но в обоих случаях можно безболезненно переопределяться только в пределах одного порта. Или если подразумевается доступ только одного типа, то можно писать полную подстановку типа LATBbits.LATB6
DISCLAIMER: это точно относится к компилятору picc18, как порты определены в XC8 я пока не в курсе. Вот пример, как у меня было сделано определение. используются все 3 варианта.
Буду ковырять 1-wire... Вопрос - можно ли использовать требуемый delay на базе простейшего delay-а сделанного из пустого декрементирующегося for-а? Посчитаю на реальном кристалле сколько витков такого for-a производится за секунду, и на базе этого тайм-слоты сформирую.
Буду ковырять 1-wire... Вопрос - можно ли использовать требуемый delay на базе
Ковырять delay конечно можно, но тогда это будет ЕДИНСТВЕННОЙ функцией в main, которую МК будет способен выполнять во время передачи. Кроме того, прием придется организовывать уже с помощью таймера. Может все таки логичней все делать на таймере? Делать медленный интерфейс на задержках годится только для учебных задач для нестрогого препода...
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 - тоже самое }
Экспериментирую с протеусом и кристаллом... Кристалл - 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 работает... Осталось посмотреть в железе.
Эту хрень разобрал уже. Надо было в PCON задать 4-й бит 1 а не 0. Вот и шпарило 37кГц... Неутешительно для новичка - без подробного ковыряния в даташитах не обойтись... И вариантов глюков столько - угадать на пальцах никто не сможет.
Ладно, завелось вроде 4МГц, по крайней мере на линии TX от наушников потрескивание в точности такое, как осциллограмма в протеусе, и временные интервалы в серии.
Лиха беда начало... Отправляю в ТХ ANSI - байты А, В,С 6 штук за серию. Пока переходник 232 их не видит в гипертерминале... Дальше ковыряемся)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 78
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения