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

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


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

удивительно, но действительно по этому.

Осталось понять почему же wRpm всегда меньше 500

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

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

не может быть ))
А Вы видите иной вариант ? Я - нет.
явное приведение типов тоже пробовал
Интересно, а что Вы и к какому типу пробовали приводит ? У Вас тип всего один используется. :)
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

ну типа float to int )

все таки это глюк протеуса! ) Генератор не работает. выдает какую-то билиберду

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

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

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

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

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

автор прошивки не я, изначально там вобще зачемто использовалось WORD to unsigned char

потом unsigned char использовался как индекс массива.

как такое компилилось вобще...

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

Добрый день.

1. Где то мимолетом читал, что хай тек (или вообще с) при первоначальном пуске производит очистку не всех используемых регистров. У меня в функции применяется статическая переменная, важно чтобы она обнулялась, а точнее, чтобы она имела первоначальное значение заданное мной.

2. Кто как выходит с таких положений. Организация программы следующая: прерывание от таймера изменяет значение флага определенного мной; флаг сбрасывается основной программой и разрешает произвести выполнение ряда функций. При написании программы на асме, примерно можно высчитать время выполнения каждой функции, а вот с си это сложнее. И вот, если время выполнения данных функций, при каких - то сложившихся обстоятельствах, будет больше чем время между прерываниями от таймера, то будет накапливаться запоздание и в конечном итоге потеря одной обработки прерывания таймера.

Или, необходимо измерять действующее значение напряжения сети, для достижения необходимой точности выбираем количество дискретизации (количество измерения мгновенных значений), время реагирования заданно. Далее с полученными значениями производим математические манипуляции, возведение в квадрат, сложение, извлечение квадрата, деление. Так вот, как узнать максимальное время выполнения математических операций, ведь возведение в квадрат, предположим числа 5 и числа 231 займет разное время и в заданное время реагирования можно и не вложится.

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

1.

static unsigned int MyVar = 100; // 100 - первоначальное значение переменной.

2. Совсем не понятно что Вы хотите спросить. Я так понял, что у Вас не получается уложиться по времени определённым куском кода. Ваш вопрос звучит примерно так - "Есть код, но его выполнение не влезает в определённое время. Что мне делать ?"

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

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

2. Не совсем так. В асме для некоторых программ прилагается информация о максимальном количестве тактов выполнения, то есть, при любых исходных данных функция (подпрограмма) не превысит данное количиство тактов. Зная такие значения можно рассчитать примерное время выполнения кода. Существует ли такая характеристика для си функций. К примеру максимальное количество тактов при выполнении команды умножения типа char*char или int*int.

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

Существует ли такая характеристика для си функций.

Любая высокоуровневая функция компилируется в набор асмовских инструкций. Смотрите листинг и вычисляете. Это если делать нечего. Если время дорого то лучше отладчиком - я обычно смотрю в Протеусе по брэйк-поинтам. Это не всегда возможно, конечно, но обычно достаточно.

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

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

Здравствуйте, не подскажите почему CodeVAVR ругаетя на следующий код

Error: \main.c(8): '(' expected

Error: \main.c(16): undefined symbol 'displayUpdate'

Error: \main.c(19): undefined symbol 'displayUpdate'

Error: \main.c(23): undefined symbol 'displayUpdate'

Error: \main.c(29): undefined symbol 'PD0'

Error: \main.c(30): undefined symbol 'PD0'

Error: \main.c(36): undefined symbol 'T1_100MS_CNT'

#define int32 unsigned long int
#define T1_100MS_ONT 7813
#define DISPLAY_UPDATE_FREQ 2

#include <tiny2313.h>
#include <delay.h>

volatile bool displayUpdate=false;

interrupt [EXT_INT0] void INT0_tick(void){
}
interrupt [TIM0_OVF] void T0_OvF(void){
}
interrupt [TIM1_COMPA] void Display_Update(void){
  OCR0A+=T1_100MS_CNT;
  displayUpdate=true;
}

void refreshDisplay(void){
  if(!displayUpdate) return;
  PORTB.0=1;
  delay_us(200);
  PORTB.0=0;
  displayUpdate=false;
}

void main(void){
  #asm("cli");  
  DDRB=0xFF;
  PORTB=0x00;   
  DDRD=0x00|(1<<PD0)|(1<<PD1)|(1<<PD4)|(1<<PD5);	  
  PORTD=0x00|(1<<PD0)|(1<<PD1)|(1<<PD4)|(1<<PD5)|(1<<PD2);  

  TCNT1=0;
  TCCR1A=0x00;
  TCCR1B=0x00|(1<<CS10)|(0<<CS11)|(1<<CS12); 
  TIMSK=(1<<OCIE0A);
  OCR0A=T1_100MS_CNT;  

  TCNT0=0;
  TCCR0A=0x00;
  TCCR0B=0x00|(1<<CS10)|(0<<CS11)|(1<<CS12); 
  TIMSK=(1<<TOIE0);


  MCUCR=(1<<ISC00)|(1<<ISC01);
  GIMSK=(1<<INT0);
  #asm("sei");
  while(1){
  refreshDisplay();
  }
}

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

опечастку исправил.

но самая непонятная ошибка

Error: \main.c(8): '(' expected

в строке

volatile bool displayUpdate=false;

Попутно вопрос, есть ли разница между 2313 и 2313a ?

Спасибо

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

С ошибками разобрался

теперь понять не могу, почему не работает прерывание по совпадению TIM1_COMPA

#define int32 unsigned long int
#define false 0
#define true 1
#define T1_100MS_CNT 7813
#define DISPLAY_UPDATE_FREQ 2
#include <tiny2313a.h>
#include <delay.h>
volatile _Bool displayUpdate=false;
interrupt [EXT_INT0] void INT0_tick(void){
}
interrupt [TIM0_OVF] void T0_OvF(void){
}
interrupt [TIM1_COMPA] void Display_Update_Value(void){
  OCR1A+=T1_100MS_CNT;
  displayUpdate=true;
}
void refreshDisplay(void){
  if(displayUpdate){
  PORTB.0=1;
  delay_us(200);
  PORTB.0=0;
  displayUpdate=false;
  }
}
void main(void){
#asm("cli");	
  DDRB=0xFF;
  PORTB=0x00;   
  DDRD=(1<<PORTD0)|(1<<PORTD1)|(1<<PORTD4)|(1<<PORTD5);	  
  PORTD=(1<<PORTD0)|(1<<PORTD1)|(1<<PORTD4)|(1<<PORTD5)|(1<<PORTD2);  

  TCNT1=0;
  TCCR1A=0x00;
  TCCR1B=(1<<CS10)|(0<<CS11)|(1<<CS12); 
  TIMSK=(1<<OCIE1A);	   
  OCR1A=T1_100MS_CNT;	 

  TCNT0=0;
  TCCR0A=0x00;
  TCCR0B=(1<<CS10)|(0<<CS11)|(1<<CS12); 
  TIMSK=(1<<TOIE0);

  MCUCR=(1<<ISC00)|(1<<ISC01);
  GIMSK=(1<<INT0);
#asm("sei");
  while(1){
  refreshDisplay();
  }
}

Спасибо!

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

Опять столкнулся с проблемой.

В math.h той что идет с CodeVisionAVR нет функции round()

в гугле что-то не нашел способа решения проблемы.

может я перетрудился но как так?

вот это

LED_DELAY=100

PORTB=LED_Characters[displayNums[0]];
PORTD.0=0;
delay_us(LED_DELAY);
PORTD.0=1;

выдает задержку в протеусе 10мс

а это

PORTD.0=0;
delay_us(LED_DELAY);
PORTD.0=1

положенные ~0.1мс

тоесть от наличия PORTB=LED_Characters[displayNums[0]];

меняется задержка между переключениями порта D

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

Да я кажется уже понял.

вот это

PORTB=LED_Characters[displayNums[0]];

PORTD.0=0;

примерно эквивалентно delay_ms(9);

Хотя, вроде как tiny2313 за один тик выполняет чтение/запись.

А этот код в таймере который работает с делителем 1024...

тогда разница должны быть

9 тиков, что при частоте 20МГц 45мк.с

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

Добрый вечер. Подскажите, как можно увидеть куда хай тек использует озу. Я понимаю, что для своих нужд, он выделяет некоторою оперативную память МК, однако если я трачу (объявляю) на переменные в общей сложности 8 байт, а, он пишет что затрачено 29 байт, то становиться интересно. Вот и хочется взглянуть куда он их тратит.

Задействует целых 19 байт для своих целей на выражение

unsigned long mgnov_max;
.......
mgnov_max=(mgnov_max*25)>>9;
........

такие затраты это в порядке вещей?

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

Может кто нибудь написать код на си, программный ШИМ Нужно чтобы светодиод плавно загорался и гас.

Ну и если не затруднит комментариев по больше=)

Ах да, контроллер mega8A.

http://www.atmel.com...ges/doc2486.pdf

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

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

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

Ещё вопросик, мне нужно зажигать светодиод от кнопки

Я думаю так: условие выполняется если некая переменная равна 1

а в условие к этой переменной присвоить пин порта.

можно так реализовать?

if (i = 1)

дальше на знаю=)

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

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

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

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

Добрый вечер.

Подскажите пожалуйста, как ковертировать типы данных char-int-char в среде разработки truestudio для МК STM32 ? Нужно все конвертации описывать как подпрограммы или есть стандартные от IDE?

И так же, если ктото знает, как писать в консоль отладки с МК? И возможно ли это?

Буду благодарен за помощь.

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

Вот, попробовал так:

int f = 5;
char q='1';
int main(void)
{
f=(int)q;
}

После выполнения у меня в переменной f храниться значение 49. ASCII код 1, как я понял.

Вообщем подключил библиотеку stdlib.c и вроде работает подпрограмма atoi. Странно, почему это не работало вчера...

осталось разобраться, как в текст переводить :)

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

Ещё вопросик, мне нужно зажигать светодиод от кнопки

Я думаю так: условие выполняется если некая переменная равна 1

а в условие к этой переменной присвоить пин порта.

Если переменная это бит, то можно проще.

#define LED 5
#define LED_ON PORTC|=(1<<LED)
#define LED_OFF PORTC&=~(1<<LED)
if(i)LED_ON;
else LED_OFF;

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • Смотрю, многие в усилителях избегают катодного повторителя. Либо сразу берут токовые лампы с хорошим усилением, либо два каскада последовательно на токовых лампах с низким усилением. Вроде бы на звук не влияет...
    • Имел дело с зарядкой батареек еще с советских времен. Тогда еще в магазине (!) купил специальную зарядку для ртутно-цинковых батареек, очень миниатюрная, зарядка шла от встроенного солнечного элемента (и это еще в советские времена!). Использовал для зарядки батареек для наручных часов, после первой зарядки батарейки хватало примерно на полгода, потом на 3-4 месяца. Потом (когда батарейка служила меньше двух месяцев) батарейка отправлялась на упокой. Спасала студента тогда очень эта вещица. Жалею что тогда не срисовал ее внутренности. А вот с зарядкой щелочных батареек пришлось заниматься уже значительно позже. Мне кто-то подарил такой набор (зарядка с комплектом перезаряжаемых батареек) - вот его обзор https://aphnetworks.com/reviews/pure_energy_xl  Все было нормально, но у всех этих батареек ресурс очень ограничен, примерно 25 циклов максимум. После чего емкость уменьшается и нет смысла их дальше использовать. После каждой зарядки емкость уменьшается, но не сильно. Реально раз десять заряжать можно точно без проблем. После того как выработался ресурс последней батарейки стал вопрос - а можно ли заряжать обычные батарейки тоже? Зарядка-то осталась... И как раз в то время приобрел обычные (т.е. "незаряжаемые") батарейки той же фирмы (PureEnergy). Оказалось что они заряжаются точно также, как и "заряжаемые"! Возможно что у них та же химия... Пробовал батарейки разных фирм, степени разряда. Короче говоря, фирменные всякие Дюраселлы и Энержайзеры не заряжаются вообще, и даже могут потечь во время зарядки. А вот самые дикие и дешевые нонейм чаще всего заряжаются без проблем. Насчет емкости - конечно емкость полностью не восстанавливается, но для работы в беспроводной клаве,, мышке или пульте вполне хватает и достаточно надолго.  Но занимаюсь этим нечасто, просто когда лень ехать в магазин за очередной партией батареек.  А если есть возможность, то предпочитаю переделывать питание под литий. Очень сильно достает саморазряд всяких Ni-Cd, Ni-MH - разряжаются даже те, которые якобы должны долго держать заряд. Схему зарядки еще не срисовывал (лень было разбирать), но схема сложнее чем все что я видел в Интернете. Напряжение заряда примерно 1,7в. xlaa_tds.pdf
    • Я делаю ставку на контакты NC реле запуска и NO реле торможения. Тем более они такие хлипенькие.
    • Раз смогли срисовать схему "силы", то и решить проблему для вас вряд ли сложно будет... Проверьте емкость и ЭПС C-20мкФ и сопротивление контактов этих двух реле в on/off
    • Как? Вы ж никакой информации для работы мозга не дали. Ну, что-то собрали, как-то подключили, подаёте 220 на схему с незапаянным трансформатором, лампочка моргает, защита не срабатывает... Единственный вариант - вас отодвинуть и посмотреть, что там происходит. Но вы даже где обитаете не указали... Единственное, что можно вытянуть из вашего текста: Как может работать микросхема, если у неё замкнуто питание? Перед подачей 220 вы эту перемычку сняли?  
    • Если тут нет необходимой инфы, на это можно забить. Вот если он отвечает на АТ несколькими строками, то стоит разбирать на лету (во время приема) из кольцевого буфера.
  • Похожий контент

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