Перейти к содержанию

Язык СИ для микроконтроллеров


Рекомендуемые сообщения

Вы обращайте на номер строки указанный в описании ошибки.

Я всегда туда смотрю если есть ошибки. Но не знаю почему в этот раз ошибку показало в другой строке?? Может так программа устроена. Что не ищет лёгких путей.

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

товарищ напоминаю вы в разделе микроконтроллеров.... для них не только Си , но и бейсик и паскаль отличаются от стандартов....

а на счет комбинации... для пиков на Си в хайтеке будет описана так:

volatile unsigned char counter @ 0x30;
volatile bit counter_bit0 @ (unsigned)&counter*8+0;
volatile bit counter_bit1 @ (unsigned)&counter*8+1;
volatile bit counter_bit3 @ (unsigned)&counter*8+3;

и обращение будет

if(counter_bit0){}

для ХС8 описание , да будет в виде структуры....

typedef union {
struct {
 unsigned bit0	 :1;
 unsigned bit1	 :1;
 unsigned bit2	 :1;
 unsigned bit3	 :1;
 unsigned bit4	 :1;
 unsigned bit5	 :1;
 unsigned bit6	 :1;
 unsigned bit7	 :1;
};
} counterbits_t;
static volatile counterbits_t counter @ 0x030;

и обращение будет

counter++;
if(counter.bit0){}

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Специально проверил в CBuilder и WinAVR/avr-gcc (и то и другое компиляторы Си, первый для ПК, второй для МК) ни там ни там не работает, хотя сомневаться, что они не поддерживают стандарт Си, не приходится. Единственное отклонение avr-gcc от стандарта, которое я заметил - адресация флеша (библиотека avr/pgmspace.h и, соответственно, функции серии char pgm_read_byte(unsigned short address), но это из-за разделения памяти в Гарвардской архитектуре, Си вообще под нее не заточен) и, разумеется, порты ввода-вывода (впрочем, они ведут себя как типичные переменные типа unsigned char или unsigned int так что противоречия нет). Если сильно хотите, могу проверить еще на gcc, правда сомневаюсь, что это что-то изменит.

Так что стандарту Си подобные конструкции не соответствуют.

Про бейсик и паскаль сказать ничего не могу, никогда не пробовал кодить на них для контроллеров. Но, по аналогии, ассемблеры для каждой архитектуры свои, а под x86 их вообще с десяток. И у каждого свой синтаксис, несовместимый с остальными. Однако ассемблеры и не позиционируют как кроссплатформенный или переносимый язык. Про бейсик где-то слышал (за достоверность не ручаюсь, буду благодарен если поправите), что точно так же существует десяток диалектов для определенных компиляторов и интерпретаторов. То есть он тоже не имеет единого стандарта. В отличие от Си.

На самом деле если уж учить язык, то распространенный либо простой. Чтобы знания могли пригодиться где-то кроме узкой области, ради которой все и затевалось, либо чтобы не требовал особых затрат на изучение, просто потратить даже неделю на специальный ассемблер не так уж и жалко. А вот отвыкать потом от всяких counter.bit1 может быть сложно. Или непонятно на что ругается компилятор в соответствующей строке, другой ведь воспринял эту же строку нормально. А потом задают вопросы на форуме: "почему такая штука не работает".

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Так что стандарту Си подобные конструкции не соответствуют.

может просто не ленится посмотреть хедер на предмет описания битов регистров , потратить несколько минут на описание нужных битов для своей переменной, чем писать простыни типа PORTB |= (1<<3),вспоминая потом, что же там в 3-м бите...

Ссылка на комментарий
Поделиться на другие сайты

_BV(3) в помощь. Да и, если надо, никто не мешает пользоваться константами (1<<PB3), (1<<TIOE0) и комментариями.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Ну-ка, ну-ка, приведите полный код который бы таким образом скомпилировался любым компилятором Си а не только специализированными под пики или cvavr. Конкретно интересует комбинация
counter++;
if(counter.bit0){}

Вы меня не совсем поняли. Речь шла о записи PORTB.RB3=1; и о понимании такой записи языком Си. Я Вам сказал, что такая запись совершенно вменяема для Си, т.к. PORTB в этой записи - это структура. И, естественно, к ней нужно обращаться как к структуре, а не как к переменной (инкремент в Вашем случае).
Ссылка на комментарий
Поделиться на другие сайты

Скажете в этом диалекте нельзя записывать в PORTB непосредственное значение (PORTB=0xFF например)? Если можно то какая же это структура? Ну либо приведите ее описание, которое бы восприняли компиляторы Си.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Alex, в таком варианте к ней можно обращаться только как к структуре. Не верю что в этом диалекте отсутствует непосредственный доступ к портам (что код PORTB=0xFF; вызывает ошибку). Или все-таки вызывает?

IMHO, извините, мне лень приглядываться к скриншоту. Не поясните ли, что вы им хотели сказать? Что конкретным компилятором этот код компилируется? Так это никем и не оспаривалось.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

вы уже определитесь... то:

PORTB.RB3=1; Такого Си не знает. Даже, в стиле cvavr (PORTB.3=1) тоже не знает.

то:

Что конкретным компилятором этот код компилируется? Так это никем и не оспаривалось.

..... :unknw::bye:
Ссылка на комментарий
Поделиться на другие сайты

PORTB.RB3, это какой компилятор имеет такой синтаксис? Я виде лтолько у cvavr похожее (PORTB.3). Но ни то ни другое не соответствует стандарту, о чем и сказал.

P.S. может переедем с этим спором куда-нибудь еще, а то оффтоп получается.

Изменено пользователем COKPOWEHEU

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

P.S. может переедем с этим спором куда-нибудь еще, а то оффтоп получается.

у cvavr обращение к битам портаБ возможно как :

PORTB.3

PORTB.RB3

PORTB.PORTB3

Ссылка на комментарий
Поделиться на другие сайты

Спасибо, насчет наименования битов в cvavr буду знать.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Atmel studio, как писать/подключать свои библиотеки что бы они компилировались не полностью вместе со всем проектом, а только те их функции, которые используются?

Ссылка на комментарий
Поделиться на другие сайты

как-то так

post-58864-0-00813700-1377144809_thumb.jpg

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Что то я не понял. Если я добавляю в тексте программы

#include <my libraries/7seg_lib.h>

то этот файл полностью присоединяется к данному? И компилируются вместе полностью?

Ссылка на комментарий
Поделиться на другие сайты

#include на этапе препроцессирования добавляет текст заголовочного файла к исходному коду программы. То, что я указал - как добавить исходный код модуля. Компилируется он отдельно, командой build all а подключается автоматически.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Добрый день. Дней 5 уже мучаюсь с Юартом. Присылает по коду постоянно что то, как и задуманно, но всегда приходит крякозябля.

Земля подключена. Все ноги выходы. Провод витая пара. Com адаптер рабочий. Уже работал с ним все приходило, и по моему туже программу использую , а оно не работает. В чем может быть причина?

pic16f877. MicroC for Pic

char uart_rd;
void main() {
TRISB=0x00;
PORTB=0x00;
TRISA=0x00;
PORTA=0x00;
TRISC=0x00;
PORTC=0x00;
TRISD=0x00;
PORTD=0x00;
 UART1_Init(9600);			
 Delay_ms(100);			  
 UART1_Write_Text("NA4ALO..");
 while (1) {	  
   if (UART1_Data_Ready()==1) {  
  uart_rd = UART1_Read();  
  UART1_Write(uart_rd);
 }
   UART1_Write_Text("RabotaU");
 }
}

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Люди добрые, помогите в начинаниях..

Есть 2 куска кода.

Это общее для обоих кусков:

unsigned int buf1;
unsigned long buf2;
unsigned char ss1[15];
unsigned char ss2[15];

Вот первый:

lcd_puts(" I=");
 itoa(&ss1,buf1,10);
 lcd_puts(&ss1);
 lcd_puts(".");
 if (buf2<10) lcd_puts("0");
 itoa(&ss1,buf2,10);
 lcd_puts(&ss1);
 lcd_puts("A");

Вот второй, как я думал, оптимизированный вариант первого куска:

 memset(&ss2, '\0', strlen(ss2));
 memset(&ss1, '\0', strlen(ss1));
 strcat(&ss2, " I=");
 itoa(&ss1,buf1,10);
 strcat(&ss2, &ss1);
 strcat(&ss2, ".");
 memset(&ss1, '\0', strlen(ss1));
 if (buf2<10) strcat(&ss2, "0");
 itoa(&ss1,buf2,10);
 strcat(&ss2, buf2);
 strcat(&ss2, "A");

 lcd_puts(&ss2);

Проблема в том, что первый кусок работает, а написанный мной второй кусок пишет мусор..

Результат работы первого:

post-172770-0-97098300-1379534906.jpg

Результат работы второго:

post-172770-0-16141000-1379534907.jpg

Подскажите пож, что не так делаю? :help:

Прошу сильно не пинать, можно сказать первый проект на си :thank_you2:

Изменено пользователем denkop
Ссылка на комментарий
Поделиться на другие сайты

Сидит программист глубоко в отладке. Подходит сынишка:

- Папа, почему солнышко каждый день встает на востоке, а садится на западе?

- Ты это проверял?

- Проверял.

- Работает?

- Работает.

- Тогда ради бога, сынок, ничего не трогай, ничего не меняй.

От себя добавлю - тем более, когда не знаешь как работает. :)

ЗЫ:

unsigned int buf1;
unsigned long buf2;
unsigned char ss[15];
.......

sprintf(ss,"I=%d.%d", buf1, buf2);
lcd_puts(ss);

Ссылка на комментарий
Поделиться на другие сайты

sprintf не хочется использовать, сильно расточительно по ресурсам.. да и спортивный интерес утолить нужно, хоронить проблему не хочется

Ссылка на комментарий
Поделиться на другие сайты

sprintf не сильно и расточительней чем itoa. А ради спортивного интереса включают отладку, шагают по программе и ищут баг, а не просят кого-то это сделать :) Тем более, отладчик у Вас в руках, судя по скринам.

Ссылка на комментарий
Поделиться на другие сайты

По поводу sprintf, проверил плюс лишних 300 слов, sprintf по сравнению с itoa. Это по вашему не много? Тем более если взять какой нибудь рядовой f628...

А по поводу отладчика, спасибо, но я о них слышал и даже убил много времени на поиск, но моих знаний не хватило найти проблему.. Я никого не прошу за меня в отладчике проверить.. А лишь прошу помощи у тех кто без использования отладчика сможет подсказать куда копать.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...