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

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


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

Да в задницу эту utoa... Даже вникать лень. Для своих нужд написал свою функцию. Единственный минус(хотя как сказать) - это работа только с unsigned char и лидирующие нули(обусловлено нединамическим формированием строки).

У меня теперь другая тема. Нужно менюшку сделать небольшую.

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

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

Изначально высвечивается ноль. По кнопке, в момент прерываения таймера переменная SetReg становится в 1, и на дисплее единица. При втором нажатии SetReg становится снова нулем, и, вроде бы, на дисплее, должен быть ноль, установленный в основном цикле. Однако остается единица…. Почему? Помогите, пожалуйста!

int SetReg;

Int main()
{
while(1)
{
if (SetReg==0)
{
LCD(0);
}
}
}

ISR(TIMER1_COMPA_vect)
{
if((PINC & (1 << PC0))==0) // кнопка
{
_delay_ms(350);

if (SetReg==0) // тригер
{
SetReg=1;
LCD(1);
}
else
{
SetReg=0;
}
}
}

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

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

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

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

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

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

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

В примере нашел строку вида

uint8_t aTxBuffer[] = "строка с текстом"

объясните, насколько я понимаю в массив из int8 запихивают строку, как такое может быть?

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

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

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

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

как такое может быть?
Интересно, что Вас смущает ?

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

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

uint8_t и char это по сути один и тот же тип, только названия разные. Байт без знака. Оперируются идентично

строка - не что иное как строчка циферок для компилятора (номера символов)

так что все более чем нормально, просто не совсем очевидно

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

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

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

Не совсем. char не обязательно беззнаковый (зависит от настроек компилятора, для gcc это флаги -fsigned-char / -funsigned-char) и не обязательно 8-битный (тут я об исключениях не слышал, но вроде не гарантируется).

То есть char платформо-зависимый, зато лучше оптимизируется, а uint8_t платформо-независимый, но оптимизируется чуть хуже, по крайней мере в общем случае. Обычно же они одинаковы.

Со строками тоже не все так просто (например, есть расширение для wchar_t), но в большинстве случаев этого достаточно.

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

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

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

Почему тогда компилятор ругается?

hz@debian:~/Develope/temp$ cc main.c -o main
main.c: In function ‘main’:
main.c:4:5: error: unknown type name ‘uint8_t’
uint8_t myBuf[] = "The test buffer";
^
main.c:4:5: error: wide character array initialized from non-wide string

Объясните тогда популярно, я догадываюсь, что отличие в том, что я компилирую не для МК, но ведь язык един!

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

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

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

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

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

не сочтите за флуд,

если char & uint_8 одно и тоже, то в чем разница каким словом обозвать тип переменной??

где не посмотриш, все пихают этот uint_8 и у всех какието проблемы, и не разу еще не встречал чтоб проблема с char'ом была

Не знаеш как? Спроси у Google'а !!!

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

потому что чар это стандартный тип, а uint_8 обьявлен на основе стандартного типа для конкретной платформы (в заголовочном файле камня обычно)

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

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

не сочтите за флуд,

если char & uint_8 одно и тоже, то в чем разница каким словом обозвать тип переменной??

Только что ведь расписал в чем разница. Вкратце для char не гарантируется размер 8 бит и наличие/отсутствие знака. Что, так сложно было 3 предложения прочитать? Кстати, не uint_8, а uint8_t, если по inttypes.h.

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

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

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

и не разу еще не встречал чтоб проблема с char'ом была

Всё очень просто. Потому, что char - стандартный тип языка, конкретно - символ, и необязательно размером 8 бит. Сколько компилятор посчитает нужным на него отвести, столько и будет. Отсюда и отсутствие проблем.

А (u)int8_t - пользовательский тип, созданный через typedef в подключаемом файле. По этому, могут быть проблемы, если он не определён.

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

Всем добрый вечер начал изучать язык С для авр . Но к сожалению столкнулся с проблемой везде справочники по С .

Посоветуйте или поделитесь литературой для изучения С для авр .

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

Всем доброго времени суток.

Пытаюсь писать на си для PIC16f886. Есть куча вопросов.

Проект пишу не с начала а позаимствовал основу. IDE CCS C Compiler.

Основной вопрос касается прерываний и АЦП.

Код привожу сокращенно:

void main()

{setup();

duty1=0;n=0;

NextZykl:

adc1t=get_adc(1); //АЦП измеряем напряжение

dadcsum+=adc1t; //суммируем

if(n==2500) //ждем когда сумма будет = 2500 ----КАК ТУТ РАССЧИТАТЬ ВРЕМЯ?

{

dadcsumr=dadcsum;

dadcsumr=dadcsumr/2500; //находим среднее значение

n=0;adc0sum=0;dadcsum=0;//adc0m=0; // обнуляем

calcitogs(); //переводим значения квантов АЦП в нормальное напряжение

lcd_xy(9,2);lcd_putc("U2=");Fixed2ToA(u0sr,sTmp); lcd_putsf(&sTmp[2],4); // выводим на печать

..........

}

n++;

goto NextZykl;

}

Вопрос вот в чем: когда выполняется код выделенный красным цветом МК не считает данные по входу АЦП. Сколько будет потерянно информации за выполнение данного кода?

#use delay(internal=8000000)

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

Q-ti вот вам для начала. очень хорошие уроки

http://forum.cxem.ne...howtopic=136229

postaloi зачем вы до 2500 сумируете??? сумируйте просто 20 раз, потом полученую цифру поделите на эти 20 раз и получите среднее значение ацп

инициализацию ацп вы не выложили

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

Не знаеш как? Спроси у Google'а !!!

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

Сколько будет потерянно информации за выполнение данного кода?
Давайте начнём вот с чего.

Что за информация ? Что значит "потеряна" ? И почему она должна "потеряться" ?

Не совсем понятен Ваш вопрос.

Или Вы хотите расчитать время выполнения участка кода, выделенного красным цветом ? Тогда в отладчике посмотрите время выполнения.

void main()
{setup();
duty1=0;n=0;
NextZykl:

Кто Вас этому научил ? :)

Вынесите что не связанно с циклом до while(1) :

void main()
setup();
duty1=0;n=0;
while(1){
....
....
}

и не нужно будет никаких меток и гоуту.

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

Что за информация ? Что значит "потеряна" ? И почему она должна "потеряться" ?

Попробую объяснить на пальцах:

1 - в основном цикле мы следим за входом АЦП.

2 - когда n==2500 МК начинает выполнять еще кучу различных нужных операций - - - а вот вход АЦП в данный момент не отслеживает.

........просто код не весь. Там в calcitogs(); пересчитывается кванты в напряжение, ток, и АМПЕР*ЧАС. Вот и получается что ток протекает постоянно а МК в какой то момент его не фиксирует - следовательно АМПЕР*ЧАС будет меньше.

void calcitogs(void)
{
diu=(dadcsumr/(5*KYi));
if(STATUT.zr==1) {adc0sumr=adc0sumr-diu;}
else {adc0sumr=adc0sumr+diu;}
fIbatsr=fADCtoI*dadcsumr;
fIbatsr=fIbatsr/1000;
ibatsr=fIbatsr;

adc0sr=adc0sumr;
u0sr=adc0sr*ADCtoU;

if(fIbatsr > Ikzi) FatalErr(2);
fIbatsum+=fIbatsr;
amph=(float)fIbatsum/7200; /////////////////// вот на 7200 не смотреть - тут другая частота МК и величина n меньше....
}

Кто Вас этому научил ? :)

Вынесите что не связанно с циклом до while(1) :

void main()
setup();
duty1=0;n=0;
while(1){
....
....
}

и не нужно будет никаких меток и гоуту.

Размер .hex изменится?

повторюсь код не весь - в полной версии нужен будет как раз гоуту :)

И про отладчик можно поподробней?

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

зачем вы делаете это в основном цикле,?? существуют прерывания от ацп, и с помощью них канал ацп будет слушаться постоянно, а в основном цикле делайте что нить другое, например считайте ваши амперчасы и выводите их на экран

Не знаеш как? Спроси у Google'а !!!

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

ВОт тут я и туплю. В оригинальном коде автор запускает таймер и в нем слушает порт АЦП.

Но после того как я подключил аппаратный шим у меня не получается впихнуть код в таймер.

У автора было:

#INT_TIMER2
#separate
void TMR2_isr(void)
{int8 k;
if(n==0)
{
adc0t=get_adc(0);
adc1t=get_adc(1);
adc0sum+=adc0t;dadcsum+=adc1t;
if(n==499)
{
adc0sumr=adc0sum/500;
dadcsumr=dadcsum/500;
n=0;adc0sum=0;dadcsum=0;
EVENT.dready=TRUE;
}
n++;
}

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

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

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

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

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

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

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

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

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

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

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

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