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

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


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

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

HTML-тег мог быть добавлен при копивасте откуда-нибудь, так что вряд ли он реально был в коде.

#include <avr/io.h> - стандартная библиотека с прописанными адресами портов и регистров для каждого контроллера

#include <avr/interrupt.h> - стандартная библиотека для работы с прерываниями в AVR.

Угловые скобки <> показывают, что искать надо в стандартных путях (переменная среды $PATH если не ошибаюсь), кавычки - искать рядом с исходным файлом.

Что тут еще может быть непонятно незнаю.

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

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

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

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

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

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

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

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

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

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

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

Ребята. Иногда роюсь в чужих кодах, че там стесняться, многие из нас лопатят чужие коды, в надежде найти что то новое и интересное... Так вот, я тут нашел интересный код под Winavr, хотел скомпилировать в Atmel studio, а она проругалась на некоторые, не знаю как их правильно назвать, директивы "cbi" "sbi" "_BV" и еще что то там. Где об этом почитать? Что это? И на что это заменить чтобы студия почала компилировать. А может, можно ее научить понимать этот синтаксис??

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

cbi и sbi - ассемблерные команды, к Си (в том числе avr-gcc, он же winavr) прямого отношения не имеющие. Возможно, ассемблерная вставка, но без куска кода говорить не о чем.

_BV(х) - ассемблерный же макрос, эквивалентный (1<<x), можете смело заменить.

Почитать где угодно, где рассказывается о программировании на ассемблере под AVR.

avr-gcc (winavr) понимает этот синтаксис только в контексте ассемблерных вставок, либо с ключом совместного использования исходников на asm и c.

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

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

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

  • 1 месяц спустя...

Привет! Как в AVR Studio 6 выявить все переменные (глобальные) которые объявлены и используют память, но не использованы в большой программе? Спасибо. При компиляции конечно создается список предупреждений, но как им воспользоваться, т.к. там не ничего типа "declare, but no used"?

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

Глобальные переменные - никак.

Молодых и талантливых чрезвычайно много. Целеустремлённых и готовых довести дело до конца — гораздо меньше.

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

Студия сама определяет и ругается на объявленные переменные , если они нигде не задействованы . Много раз в этом сам убеждался , объявишь переменную в прок , студия сразу же ругается .

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

Ругается только на локальные переменные

Молодых и талантливых чрезвычайно много. Целеустремлённых и готовых довести дело до конца — гораздо меньше.

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

Может быть , что только на локальные . Все глобальные переменные объявляются до майна , посмотреть какая "пустая" , можно щелкнув мышкой по переменной и выпадающем меню выбрать переименовать , в появившемся окне будет указано в каких местах встречается эта переменная . Может есть способ и проще .

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

Да, только так, либо в выпадающем меню выбрать find references (shift + alt + f). Тогда внизу отобразятся все строки во всех файлах проекта, где используется данная переменная.

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

Молодых и талантливых чрезвычайно много. Целеустремлённых и готовых довести дело до конца — гораздо меньше.

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

Да, только так, либо в выпадающем меню выбрать find references (shift + alt + f). Тогда внизу отобразятся все строки во всех файлах проекта, где используется данная переменная.

Нечто подобное и делал... Просто после переустановки АВР в контекстном меню правом... почему то нет этой опции. Ок - будем юзать горячие клавиши.. Спасибо. (Просто думал, что есть отдельная опция, поэтому и спросил... )

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

  • 1 месяц спустя...

Добрый день. Подскажите как с помощью sprintf вывести строку AT+COPS = 4, 2, "25506".

Вывожу обычно так:

sprintf((char*)gsm_TxBuffer, "AT+COPS = 4, 2, 25506")

Но тут нужно ещё добавить символы " возле 25506, а они являются атрибутом начала и конца ASCII кода.

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

sprintf(&gsm_TxBuffer, "AT+COPS = 4, 2, %c25506%c", 34, 34)

спецификатор приведения типа перед массивом можно не ставить, sprinf сам приводит типом аргумента в прототипе. Можно вообще написать просто gsm_TxBuffer, будет передан указатель типа char на первый элемент независимо от типа данных массива

запись \" не каждая реализация sprinf понимает, так что может не сработать, так же как не везде работает спецификатор #

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

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

Всем доброго времени суток, пытаюсь понять работу таймера в Attiny13. написал код а он не работает

#include <io.h>
#asm("sei")
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
PORTB.0=~PORTB.0;
 TCNT0=0; //обнуляем таймер
};
void main(void)
{
PORTB=0x00;
DDRB=0xff;
TCCR0A=0x00;
TCCR0B=(0<<WGM02) | (1<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=0x00;
OCR0A=0x249F;
OCR0B=0x00;
TIMSK0=(0<<OCIE0B) | (1<<OCIE0A) | (0<<TOIE0);
while (1)
 {

 }
}

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

С уважением, 22580.

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

Что конкретно в этом коде у Вас не работает ? По синтаксису, на первый взгляд, всё верно.

Единственное, что смущает, это вставка #asm("sei") , находящаяся вне кода.

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

Alex, код должен "дергать" пином 0 порта В, но на пине ничего нет. Симулирую в протеусе 8.1.

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

С уважением, 22580.

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

написал код а он не работает

Как уже выше правильно заметили, общее разрешение прерывания #asm("sei") в вашем коде не работает. Его надо вставить в тело функции main. И второе: таймер в тини13 8-разрядный и все его регистры соответственно тоже. А вы пишете OCR0A=0x249F;

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

Здравствуйте, уважаемые.

Помогите, пожалуйста, разобраться. возникла следующая проблема.

Опишу часть кода, где проблема.

1. Программа выполняется, в основном цикле есть условие, если кнопка MENU нажата - то перейти в настройки. выглядит так:

if (MENU) //MENU - длинное нажатие
{
bt_flags &=~ (1<<3); //сброс некоего флага кнопки
settings(); //открываем настройки
}

2. В настройках в дальнейшем планируется собственно настройка времени, но до этого еще не дошел. Хотел сделать следующим образом. создать в функции settings цикл while, и он должен длиться, пока не нажмется кнопка выхода из настроек. Вот так:

void settings () //функция настроек
{
IND_BlinkMask (0xff); //включить мигание
while (!MENU_SAVE_CANCEL) //будет выполняться, пока не нажмется кнопка выхода
{
asm("nop"); //выполняем пока ничего.
}
IND_BlinkMask (0x00); //как закончился цикл while, выключить мигание
}

Но это никак не работает. цикл выполняется всегда. Вы можете подумать, что где то косяк с моими макросами, но нет, все проверено, они хорошо работают в других местах программы.

Далее я попробовал вообще для теста сделать проверку if, и сделать всегда верное условие, программа туда заходит:

void settings () //функция настроек
{
IND_BlinkMask (0xff); //включить мигание
while(2)
{
if (1==1)
{
IND_BlinkMask (0x00); //как закончился цикл while, выключить мигание
bt_flags &=~ (1<<4); //сброс некоего флага кнопки
break;
}
}
}

а вот если добавить в if более нормальное условие, например сравнить с константой, которая определена в самом начале, то условие не выполняется.. хотя в Watch видно, что константа равняется единице.

Помогите пожалуйста разобраться. Заранее спасибо

UPD: Проблема решилась, товарищ подсказал, ключевое слово volatile решило проблему сразу.

Не стал удалять пост, может понадобится вдруг кому

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

Вот, видите, в втором куске кода, где while(!MENU...). Этот макрос, да и вообще вся мною написанная функция опроса кнопок, она ставит флаги в переменной uint8_t, объявленной в начале программы.

Так вот, я добавил слово volatile к объявлению, и все получилось. Причина, как я понимаю, следующая. Это слово говорит компилятору, что переменная может внезапно измениться. А когда его не было, цикл становился бесконечным, потому что он даже и не хотел смотреть на условие в while.

Если интересно, могу скинуть реализацию опроса кнопок. Работает вроде как хорошо, о дребезга и наводок защитил, случайное срабатывание предусмотрел, и на одну кнопку 3 нажатия распознает: короткое, длинное и зажим (типа, зажали кнопку, и часы/минуты должны будут быстро добавляться)

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

про кнопки кстати была отдельная тема, там как раз ваш код желательно и разместить

туть http://forum.cxem.net/index.php?showtopic=154144&st=20&hl=+%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20+%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA#comment-2218151

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

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

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

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

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

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

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

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

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

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

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

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