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

Вопросы от начинающих по МК


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

4 часа назад, Дмитрий Вас сказал:

вот этому обьяснения я не находил, выходит логическое <= ВОЗВРАЩАЕТ значение? а  <   задает? 

Смотрите,  кратенько... 

"=" это оператор присваивания, он присваевает леву то что справа.

Термин "возвращает" - относится к некой внешней процедуре (функции),  и происходит от оператора RETURN, которым обычно заканчиваются  внешние функции (неважно какого языка). То есть некая функция берет аргументы, колдует с ними и возвращает результат своего действия ( RETURN Result)

Поэтому операция сравнения, это тоже можно сказать некоторая функция, которая вернула результат сравнения. (Его можно присвоить  оператором присваивания какой либо переменной для дальнейшего использования, а можно и не присваивать).

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

  • Ответов 8,9т
  • Создана
  • Последний ответ

Топ авторов темы

4 часа назад, Дмитрий Вас сказал:

я правильно понял?

Попробую зайти с другого конца. Пока забудьте о программировании и Си.

Пусть имеется следующее арифметическое выражение:  (A+B)/B, где A=6, B=2

Чему равно это выражение?  Очевидно, что 4. Так же очевидно, что ни А, ни В  не равны 4. Тогда кто равен 4? ... ВЫРАЖЕНИЕ. Был получен результат, который просто у нас в уме.

А вот если мы запишем Х=(A+B)/B, тогда мы то, что у нас в уме присвоим Х.

Таким образом, получение некоего результата выражения - это возврат значения этим выражением.

И это возвращенное значение мы присвоили конкретной переменной Х.

А теперь вернемся к Си. Одиночный знак = является оператором присвоения значения возвращенного правым от этого оператора выражением переменной расположенной слева от этого оператора.

Всё. Другого способа присвоения в Си нет. Только через одиночный знак =.

Обратное так же справедливо - если вы где то написали одиночное =, значит вы произвели присвоение. Все остальные арифметические и логические операции способны только возвращать значение.

Физически - возврат значения - это получение результата выражения в некоем временном регистре. Обычно регистре общего назначения (РОН). РОНы отличаются от остальной памяти тем, что доступ к ним не требует занятия шины данных/адреса ОЗУ. Потому что РОНы - это часть арифметико-логического устройства процессора. Так называемая СВЕРХОПЕРАТИВНАЯ память - СОЗУ. При обращении к РОНам адрес РОНа очень короткий (3...5  бит) и содержится прямо за кодом операции инструкции процессора.

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

戦う前に相手のベルトの色に注目

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

Только что, my504 сказал:

Попробую зайти с другого конца. Пока забудьте о программировании и Си.

:umnik2::shok::i-m_so_happy:

 

2 минуты назад, my504 сказал:

 теперь вернемся к Си.

Я не понимаю в СИ ...Но @my504 обяснил так что аж захотелось понимать )))

Покажи мне свое окружение 

Я тебе покажу твое будущее 

Все просто)

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

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

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

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

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

11 часов назад, ARV сказал:

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

Там по моему надо начинать с объяснения необходимости использования букв (вместо цифр) в математических выражениях, поэтому то что вы объясняете это далеко не азы для данного конкретного специалиста, мне кажется.

У меня кстати несколько лет назад сын, в 4-5 классе, возмущался очень переходом на буквы в математике :) , я поэтому знаю что такой переход может быть серьезной проблемой для понимания.

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

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

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

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

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

22 часа назад, ARV сказал:

// где-то в главном цикле вы проверяете кнопку и устанавливаете флаг: if((PIND & (1<<BD5)) == 0) flag = 1;

а как же дребезг?

ISR(TIMER1_COMPA_vect)
{
if(button==1) //если нажата кнопка 
    {
    if(f_button==0) //проверяем была ли она нажата ранее, это флаг кнопки
        {
        f_button=1;//если нажато не было то ставим флаг 
        PCTL2 = (1<<PRUN2);//запускаем шим
        while(OCR1A<200) //плавный запуск будет до 200 (частоту нужно подсчитать)
        {OCR1A=OCR1A+5;}
      if(f_button==1)//если кнопка была нажата ранее 
          {
          f_button=0;//снимаем флаг              
          while(OCR1A) //останавливаем пока OCR1A не упадет до нуля
          {OCR1A=OCR1A-5;}
          PCTL2 &=~ (1<<PRUN2);//останавливаем шим
          }
    }
  }

ну у мня почти тоже самое

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

Только что, Дмитрий Вас сказал:

ну у мня почти тоже самое

Даже и близко не то. У вас нет разделения на задачу, решаемую по прерываниям, т.е. частями периодически, и задачу, решаемую последовательно, т.е. "непрерывно". Вы зачем-то то включаете, то выключаете ШИМ... Вопрос: зачем? Я не исключаю, что могут быть причины... но хотелось бы знать. Я просто помню, как я пытался объяснить вам, как модулировать ШИМ синусом... И, не смотря на мои объяснения, вы все равно сделали по-своему, с большим количеством бессмысленных действий.

Только что, Дмитрий Вас сказал:

а как же дребезг?

Вопрос дребезга я не затраивал.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Только что, ARV сказал:

большим количеством бессмысленных действий.

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

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

5 минут назад, Дмитрий Вас сказал:

вы меня не полностью поняли

Я вас отлично понял, я видел ваш код, генерирующий синус - он рабочий, но избыточный примерно на 80%. Это говорит о том, что вы не понимаете, как он работает, и довольствуетесь тем, что "как-то работает". Так и в этом случае: я вам подробно описал, как должно работать "на словах", привел пример кода - и что я вижу? Снова код с циклами внутри обработчика прерываний! Это работать не будет!

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

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

23 часа назад, ARV сказал:

Снова код с циклами внутри обработчика прерываний!

хоть убейте но не нашел почему этого нельзя делать. ну да ладно а если сделать так?

ISR(TIMER1_COMPA_vect)
{
	if(!(PIND&(1<<5))) //если нажата кнопка
	{
		switch(f_button)//изначально f_button=0
		{
			case 0://выполняется это условие т.е. включение
			{
				f_button=1;//если нажато не было то ставим флаг
				PCTL2 = (1<<PRUN2);//запускаем шим
				while(OCR0A<200) //плавный запуск будет до 200 (частоту нужно подсчитать)
				{OCR0A=OCR0A+5;}
			}
			case 1://при повторном нажатии на кнопку f_button уже будет = 0
			{
				f_button=0;//снимаем флаг
				while(OCR0A) //останавливаем пока OCR0A не упадет до нуля
				{OCR0A=OCR0A-5;}
				PCTL2 &=~ (1<<PRUN2);//останавливаем шим
			}
		}
	
    }

 

break; не вставил

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

Только что, Дмитрий Вас сказал:

хоть убейте но не нашел почему этого нельзя делать

Еще раз: цикл while не завершится, пока не обнулит OCR1A. Изменение этого регистра он будет делать примерно со скоростью несколько дестков тысяч вычитаний в секунду. Таким образом, когда вам надо будет "плавно" изменить регистр, ваш код изменит его за сотую долю секунды, что ббудет вно "мгновенно", а не "плавно". 

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

Есть и другие проблемы в вашем коде. Например, while(OCR0A<200) {OCR0A=OCR0A+5;} будет вообще "корректно" работать только для исходнх значений OCR1A, кратных пяти. Стоит начать этот цикл при значении OCR1A, например, 254, и вы получите такую цветомузыку... ПОнимаете, почему?

Есть и другие проблемы в вашем коде. Например, while(OCR0A<200) {OCR0A=OCR0A+5;} будет вообще "корректно" работать только для исходнх значений OCR1A, кратных пяти. Стоит начать этот цикл при значении OCR1A, например, 254, и вы получите такую цветомузыку... ПОнимаете, почему?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

1 час назад, Дмитрий Вас сказал:

даже если он записан в обработчике?

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

戦う前に相手のベルトの色に注目

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

у меня таймер 0 генерирует синус, а 1й проверяет энкодер. что если я в первом буду проверять кнопку типа  if(!(PIND&(1<<5)) {f_button^=0;} меняем флаг на противоположный. а в таймере 0 уже if(f_button&&OCR0A) {OCR0A--;} else.... не придумал еще как наращивать при запуске

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

1 hour ago, Дмитрий Вас said:

1й проверяет энкодер

Я бы сделал вот так: добавил бы два флага go_up и go_down для указания процесса "плавно вверх" и "плавно вниз". В прерывании таймера 1 не спеша бы проверял флаги и нажатие кнопки.

ISR(TIMER1_COMPA_vect)
{
    if(go_up)
    {
        if(OCR0A < 200) //плавный запуск будет до 200 (частоту нужно подсчитать)
            OCR0A = OCR0A + 5;
        else
        {
            go_up = 0; //  останавливаем плавно вверх
            OCR0A = 200; // включено на полную катушку
        }
    }
    else
    if(go_down)    
    {
        if(OCR0A > 5) //останавливаем пока OCR0A не упадет до нуля
            OCR0A = OCR0A - 5;
        else
        {
            go_down = 0; // останавливаем плавно вниз
            OCR0A = 0;   // полностью выключено
        }
    }

    if(!(PIND&(1<<5))) //если нажата кнопка
    {
        if(OCR0A == 0) // было выключено, плавно включаем
            go_up = 1;

        if(OCR0A == 200) // было включено, начинаем плавно выключать 
            go_down = 1;
    }
}

 

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

#include <stdio.h>

if(!(pind5==1))
{
    f_button ^=0;//флаг станет единицей
}
if(f_button==0)//проверка для старта
    {
        OCR0A ++;
    }
   
else//проверка для стоп
    {
        if(OCR0A)//если OCR0A имеет любое значение больше нуля
        {
            OCR0A --;
        }
        if(OCR0A ==0)//если OCR0A достиг нуля
        {
            f_button =0;//сбрасываем флаг
        }
       
    }

int main() {
    return 0;
}

Вот набросал, должно работать. Но остались вопросы. Если я пишу f_button^=0; это придаст первоначальное значение  ноль которое потом поменяет на 1? Или нужно uchar f_button=0; 

 И второй вопрос как бы OCR0A ++; увеличивалось бы только до 200, а потом можно было её менять энкодером?

П.с. код будет в обработчика ISR дабы избежать дребезга

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

1 час назад, Дмитрий Мамедиев сказал:

Вот набросал, должно работать

Это вряд ли.

1 час назад, Дмитрий Мамедиев сказал:

Если я пишу f_button^=0; это придаст первоначальное значение  ноль которое потом поменяет на 1?

То, что вы написали, вообще никак не поменяет f_button. Вообще никогда никак.

1 час назад, Дмитрий Мамедиев сказал:

if(!(pind5==1))

Ну и тут какое-то внутреннее сомнение в правильности написанного... Прямо вот утверждать, что это не заработает, не видя, что такое pind5, не могу, но червячок сомнения гложет...

1 час назад, Дмитрий Мамедиев сказал:

int main() {
    return 0;
}

А и после этого надеяться, что будет работать хоть как-то, вообще бесполезно...

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

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

16 часов назад, ARV сказал:

А и после этого надеяться, что будет работать хоть как-то, вообще бесполезно...

А я предупреждал ! :)

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

45 минут назад, ruhi сказал:

предупреждал

Вы предупреждали в отношении совсем другого начинающего. Так что не факт, что ваше возмущение уместно.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

11 часов назад, ARV сказал:

Так что не факт, что ваше возмущение уместно.

Да где ж я возмущался то?

Вот согласитесь, посмотреть как работает операция:

 f_button^=0; это придаст первоначальное значение  ноль которое потом поменяет на 1

лучше всего в консольном С-приложении на компе, для начала, там же можно походить в дебаге - посмотреть значения переменных хочешь в десятичном виде- хочешь в хексе (прежде чем в контроллеры лезть)?

Ну это же глупо (по моему) на форумах выяснять?

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

Здравствуйте! Подскажите мне пожалуйста, как собрать микросхему АЦП в Proteus? Я тут написал код 

//Atmega8
//Укажем частоту
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
//Инициализируем библиотеку для работы с дисплеем
#include "n5110.h"
#include <stdlib.h>

//Предварительные настройки
void presets(){
//Инициализируем дисплей
    Lcd_init();
//Настройки АЦП
//ADCSRA
ADCSRA |= (1<<ADEN) //Задействовать АЦП
| (1<<ADPS2) | (1<<ADPS2) | (1<<ADPS2) ; //Делитель 128 = 64 кГц

//ADMUX	
ADMUX |= (1<<REFS1)|(1<<REFS0) //Опорное напряжение 2.56 В внутреннее
| (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0); //Выбор вывода
}

int readADC(){
    ADCSRA |= (1<<ADCSRA); //Запуск преобразования	
	while ((ADCSRA &(1<<ADSC))); //Ожидание окончания преобразования
	return ADC;
}


int main(void)
{
    presets();
    while (1) 
    {
		Lcd_clear();
		char buff[5];
		itoa(readADC(), buff, 10);
		Lcd_print(0,1, FONT_1X, (unsigned char*)buff);
		Lcd_update();
		_delay_ms(200);
		
		
		
    }
}

 набросал схему и почему-то у меня показывает 0

New Project.pdsprj GccApplication7.hex n5110.c n5110.h

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

12 часов назад, ruhi сказал:

лучше всего в консольном С-приложении на компе, для начала, там же можно походить в дебаге - посмотреть значения переменных хочешь в десятичном виде- хочешь в хексе (прежде чем в контроллеры лезть)?

где куда что это? 

12 часов назад, ruhi сказал:

f_button^=0; это придаст первоначальное значение  ноль которое потом поменяет на 1

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

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

2 часа назад, Андрей Протаскин сказал:

ADCSRA |= (1<<ADCSRA); //Запуск преобразования

Преобразование запускается битом ADSC, а ADCSRA - это регистр.

Между прочим, компилятор вам на это место выводил warning - читайте сообщения компилятора, и находить проблемы станет проще.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

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

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

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

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

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

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

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

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

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

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

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