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

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


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

А кто такой

<avr/interrupt.h>

???

А я так уже делал... Куча примеров... А какой правильный???

Д... Хочу то, сам не знаю чего...

Спасибо. Пойду, как говорится, на фик :crazy:

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

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

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

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

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

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

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

А я так уже делал... Куча примеров... А какой правильный???

Тот, который заработает, очевидно. Неужели трудно взять и попробовать?

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

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

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

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

Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

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

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

Как в Atmel Studio 6 разместить массив во flash памяти на языке Си?

Например, есть массив:

unsigned int tabz[] = {64, 128, 256, 512, 1024, 2048, 4096};

В CodeVisionAVR, чтобы разместить этот массив во flash, надо написать так:

flash unsigned int tabz[] = {64, 128, 256, 512, 1024, 2048, 4096};

В Atmel Studio 6 так нельзя.

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

#include <avr/pgmspace.h>
...
PROGMEM unsigned int tabz[] = {64, 128, 256, 512, 1024, 2048, 4096};

Учтите, что, поскольку адресные пространства ОЗУ, flash и EEPROM разные, а Си об этом не знает, прямое присвоение unsigned int x=tabz[2] приведет к неверному результату (чтение будет не из флеша, а из оперативки по тому же адресу). Правильно будет unsigned int x=pgm_read_word(&tabz[2]);

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

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

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

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

Добрый вечер уважаемые!

На досуге возник легкий вопрос, но не могу найти на него ответ.

Каким образом конвертировать char в int в microC for Pic?

Имеется массив char data[7];

И элементы data[2] и data[3] содержат символы (цифры 4 и 7) .

Необходимо вызвать цикл for от 0 до 47.

Как конвертировать в int? И как составить число из двух элементов? (Плюс или точка? - нелепо пробовал.) функция atoi() не дала результатов

Функций не нашел. Прошу помощи. Благодарю

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

функция atoi() не дала результатов
Почему ?

Эта функция, как раз для этого и создана :)

Ну а вообще, в Вашем случае это делается просто. Берёте первую цифру, умножаете её на 10 и складываете со второй. Вот и вся магия :)

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

Вы просто "не умеете их готовить" :) А если быть точнее - не понимаете как она работает, что в неё нужно передавать и в каком формате. Если хотите разобраться - читайте про строки в языке Си.

Пробуйте вариант, который я Вам предложил. Он самый простой.

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

Указатель не на char, а на массив char'ов - т.е. на строку. Ну а '\0' - само собой, т.к. это обязательное условие стандарта.

if((data_mes[1]<'0') || (data_mes[1]>'9'))  data_mes[1]='0';
if((data_mes[2]<'0') || (data_mes[2]>'9'))  data_mes[2]='0';
i=data_mes[1]-'0';
j=data_mes[2]-'0';
q=(i*10)+j;

for(j=0; j<=q; j++)

:)

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

Имеется массив char data[7];

И элементы data[2] и data[3] содержат символы (цифры 4 и 7) .

Необходимо вызвать цикл for от 0 до 47.

А остальные элементы надо учитывать? элементы data[2], data[3] содержат символы или значения 4 и 7?

На первый взгляд остальные элементы учитывать не надо (иначе почему нумерация не с 0?), а элементы содержат именно символы '4' и '7'. Тогда простейшим решением будет

int res=(data[2]-'0')*10+(data[3]-'0');

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

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

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

Товарищи, не получается.

int count_step, q[2];
char data_mes[7];
if(data_mes[0]=='1')
  {
					    UART1_Write_Text("Proverka");
						 UART1_Write(10);
						 UART1_Write(13);
			   //   q[0]=data_mes[1]-'0';
			   //   q[1]=data_mes[2]-'0';
			   //   q[2]=data_mes[3]-'0';

count_step=((data_mes[1]-'0')*100)+((data_mes[2]-'0'*10))+(data_mes[3]-'0');

				  UART1_Write(count_step);
										    for(x=0; x<=count_step; x++)
										    {
										    UART1_Write(x);
										    }
    }

data_mess[] - заполняется следующим образом.

i=0;
	  while(1)
		    {
			 if(i==7) {  break;  }
		    if (UART1_Data_Ready()) {
									 uart_rd = UART1_Read();
									 data_mes[i]=uart_rd;
									 i++;
									 }
		    }

data_mess[7] в таком виде 12341234

По первому data_mess[0] срабатывает условие. По первому, второму , третьему элементу - надо сделать трехзначное число, и запустить цикл такое количество раз как это число. Они символьные надо составить число.

Код:

count_step=((data_mes[1]-'0')*100)+((data_mes[2]-'0'*10))+(data_mes[3]-'0');

Не работает. В протеусе возвращается при выводе count_step неизвестный символ.

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

Если это число а не цифра, то все равно видно не будет. Самое простое - поставить симуляцию на паузу и полазить по переменным.

count_step=((data_mes[1]-'0')*100)+((data_mes[2]-'0'*10))+(data_mes[3]-'0');
А чего нумерация опять не с начала? Кстати, data_mes[2] неправильно обрабатывается, скобка не там.

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

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

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

//Проблему выше решил))) Типичные синтаксические ошибки были))

Добрый вечер! Возник ступор в коде.

Изначально было int speed=6 и одновременно все переключалось с необходимой скоростью. На схеме поменялась деталь и теперь необходимо что быPORTB переключался с speed=6, а PORTD с speed=4. Что бы они одновременно переключались.

PORTB=0b00000001;             VDelay_ms(speed/2);
PORTD=0b10000000;			 VDelay_ms(speed/2);
PORTB=0b00000100;            VDelay_ms(speed/2);
PORTD=0b00100000;			 VDelay_ms(speed/2);
PORTB=0b00000010;              VDelay_ms(speed/2);
PORTD=0b01000000;			 VDelay_ms(speed/2);
PORTB=0b00001000;             VDelay_ms(speed/2);
PORTD=0b00010000;			 VDelay_ms(speed/2);

Как тут быть? Подскажите пожалуйста

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

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

Код віше предназначен для управления 2-мя биполярными двигателями одновременно.

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

Советом было ввести вторую переменную

Ну нормальный был совет. Вы хотите менять 2 порта с разными скоростями :

необходимо что быPORTB переключался с speed=6, а PORTD с speed=4
Вам и посоветовали завести вторую переменную.

2 скорости - 2 переменные, всё логично :unknw:

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

Это управление шаговыми биполярными двигателями. Одинаковыми.

Изначально было вот так:

int speed=6;
int i=0;
for(i=0; i<100; i++)
{
PORTB=0b00000001;					    VDelay_ms(speed);
PORTB=0b00000100;					   VDelay_ms(speed);
PORTB=0b00000010;						 VDelay_ms(speed);
PORTB=0b00001000;					    VDelay_ms(speed);
}
for(i=0; i<100; i++)
{
PORTD=0b10000000;					    VDelay_ms(speed);
PORTD=0b00100000;					    VDelay_ms(speed);
PORTD=0b01000000;					    VDelay_ms(speed);
PORTD=0b00010000;					    VDelay_ms(speed);
}

Сначала один мотор движется потом другой. Была необходимость сделать одновременное движение двигателей.

И было написано как выше, VDelay_ms(speed/2) = 3 и получилось так что по 3мс на каждой обмотке, и получилось 3мс на одну обмотку, 3мс на другую обмотку (второго двигателя) и получалось что между обмотками одного мотора было 6.Чередуя обмотки разных моторов.

Пример ниже:

PORTB=0b00000001;					    VDelay_ms(speed/2);  //3мс 1обмотка 1двиг
PORTD=0b10000000;					    VDelay_ms(speed/2);  //3мс 1обмотка 2двиг
PORTB=0b00000100;					   VDelay_ms(speed/2);   //6мс между обмотками 1двиг.
PORTD=0b00100000;					    VDelay_ms(speed/2);
PORTB=0b00000010;						 VDelay_ms(speed/2);
PORTD=0b01000000;					    VDelay_ms(speed/2);
PORTB=0b00001000;					    VDelay_ms(speed/2);
PORTD=0b00010000;					    VDelay_ms(speed/2);

Прошу прощения за много букв и кода.

В итоге получилось что 2 двигателя движутся одновременно.

Был заменен один двигатель, и первому на переключение надо speed=6, а второму необходимо speed=4 (Для одинаковой скорости) , надо сделать так что бы они работали одновременно. Если я их буду чередовать как выше то получится каша.

PORTB=0b00000001;  VDelay_ms(speed);  //3мс
PORTD=0b10000000;  VDelay_ms(speed2);  //2мс
PORTB=0b00000100;   VDelay_ms(speed);   //3мс получится 5мс между одним место 6ти.
PORTD=0b01000000;  VDelay_ms(speed);  //2мс

И получится общее 5 мс. а надо одному 6 другому 4. Как тут быть?

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

Я бы делал примерно так. Этакая недо-ОС.

PROGMEM char mask1[4]={0b00000001,0b00000100,0b00000010,0b00001000}; //последовательность выводимых комбинаций для 1 двигателя
PROGMEM char mask2[4]={0b10000000,0b00100000,0b01000000,0b00010000}; //для 2-го
volatile unsigned char time; //глобальное время
unsigned char time1,time2; //временный границы переключения двигателей
unsigned char pos1=0,pos2=0; //текущий номер комбинации
unsigned char speed1=6,speed2=4;  //скорости переключения (в абстрактных единицах)

ISR(TIMER0_OVF_vect){ //прерывание от таймера. Может лучше использовать не переполнение, а сравнение, но для демонстрации концепции этого хватит
time++;
}
int main(){
...//настройки всего подряд
while(1){
 if((unsigned char)(time-time1)>0){ //вот тут не уверен что произойдет при переполнении. Суть в пересечении глобальным временем локальной границы для первого двигателя
  PORTB=pgm_read_byte(&mask1[pos1]); //тогда переключаем комбинацию сигналов на выходном порте
  if(++pos1>3)pos1=0; //и переходим к следующему
  time1=time+speed1; //после чего устанавливаем новую границу
 }
 if((unsigned char)(time-time2)>0){ //аналогично для любого количества двигателей и прочих подпрограмм.
  PORTD=pgm_read_byte(&mask2[pos1]);
  if(++pos2>3)pos2=0;
  time2=time+speed2;
 }
}
}

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

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

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

Как тут быть?
Очень просто - понять, что происходит.

Вы знаете что такое Delay_ms ? Это же обычное зацикливание программы, т.е. глупый пустой цикл while(). Вот теперь представьте, что у Вас программа постоянно находится в зацикливании, изредка делая что-то там с портами. Процентов 99 от всего процессорного времени она тратит впустую. А могла бы делать очень много полезного.

Делайте выводы... :)

В дополнение к вышеприведённому коду - я бы сделал не 1 прогарммный таймер, а 2. На каждую задачу - свой отдельный.

ЗЫ: Инженер!Туленков, почитайте про ОСРВ для МК, много интересного узнаете.

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

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

#include <avr/pgmspace.h>
...
PROGMEM unsigned int tabz[] = {64, 128, 256, 512, 1024, 2048, 4096};

Учтите, что, поскольку адресные пространства ОЗУ, flash и EEPROM разные, а Си об этом не знает, прямое присвоение unsigned int x=tabz[2] приведет к неверному результату (чтение будет не из флеша, а из оперативки по тому же адресу). Правильно будет unsigned int x=pgm_read_word(&tabz[2]);

Надо ли добавлять еще ключевое слово const?

#include <avr/pgmspace.h>
...
const PROGMEM unsigned int tabz[] = {64, 128, 256, 512, 1024, 2048, 4096};

Без него ошибка.появляется.

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

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

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

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

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

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

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

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

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

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

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

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