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

Помогите с инкрементом в операторе ветвления


Юстас

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

правда нужно понимать, что макрос это не вызов функции (call, ret), код находящийся в макросе будет вставляться в ваш код каждый раз

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

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

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

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

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

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

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

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

@Юстас  напомню вам, что если бы вы писали код на Си то написали бы быстрее. Или у вас много времени на этот проект?

в этом проекте самое сложное будет обработка клавиатуры (сканирование + изменение значения)

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

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

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

@dm37 Время есть до нового года)) Надеюсь))) У меня с сями не задалось что-то. Например:

Я хочу такую функцию:

vail()

{

if   PINC.0 = 0

then PORTD.0 = 1

end if

}

Я плохо знаю си, хоть он и проще)

@dm37 А знаете, я бы рискнул на сях написать)) Но только с вашими молитвами, сам утону в болоте))

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

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

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

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

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

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

Это у меня от BASCOMa, там похожие операторы ветвления) Я бы на бейсике написал, но от него моему протеусу плохо становится))) Повисает на глухо))

1 минуту назад, dm37 сказал:

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

Ща поищу код.

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

Нашёл, но там подключены какие-то библиотеки мне не знакомые... 

Скрытый текст

#include <ina90.h>
#include <iom168.h>
#include <stdint.h>

volatile unsigned char Vibor_Razrada;
volatile unsigned char LEDBuf[4];

const __flash unsigned char TableLEDRazrad[] = {0x01,0x02,0x04,0x08}; // лог.1 включает индикатор
const __flash unsigned char TableLEDDecode[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; // лог.0 зажигает сегмент (инверсия)

//==============================================================================
//
//==============================================================================
void main(void)
{
  TCCR0A = (1<<WGM01) | (0<<WGM00);           // режим CTC - сброс при совпадении
  TCNT0 = 0x00;                               // начальное значение счётчика
  OCR0A = 0x7C;                               // значение для сравнения
  TIMSK0 |= (1<<OCIE0A);                      // разрешаем прерывания от таймера 0 по сравнению
  TCCR0B = (0<<CS02) | (1<<CS01) | (1<<CS00); // делитель на 64

  DDRD = 0xFF;      // Порт D на вывод
  PORTD = 0xFF;     // начальное значение
  DDRB = 0x0F;      // Порт B на вывод
  PORTB = 0x00;     // начальное значение
 
// заполняем буфер для отображения
 
  LEDBuf[0] = TableLEDDecode[6];
  LEDBuf[1] = TableLEDDecode[7];
  LEDBuf[2] = TableLEDDecode[8];
  LEDBuf[3] = TableLEDDecode[9];

 
  _SEI();
 
  while(1)
  {
  }
}

//==============================================================================
// Прерывание каждую миллисекунду
//==============================================================================
#pragma vector = TIMER0_COMPA_vect
__interrupt void RefreshLcdKbd(void)    // опрос клавиатуры и регенерация дисплея
{
    Vibor_Razrada++;
    PORTB = 0;  // гасим все индикаторы
    PORTD = LEDBuf[Vibor_Razrada & 0x03];    // выводим наш символ
    PORTB = TableLEDRazrad[Vibor_Razrada & 0x03];  // включаем индикатор
}

 

 

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

Цитата

А какой флаг он выставит?

Неужели не смотрели описания ассемблерных команд, которыми пользуетесь? breq, brne проверяют бит Z регистра SREG. Его выставляют в том числе команды tst, inc, dec, cpi, add, да почти все арифметические и логические.

Раз уж решили начать с формирования импульса, давайте им и займемся. Итак у нас есть флаг запуска и желаемое время задержки. Поскольку ни клавиатура, ни дисплей еще не настроены, флаг и время задаются жестко в начале программы. В прерывании таймера мониторите флаг и если он поднялся, запускаете обратный отсчет и включаете нагрузку. Когда он завершится, сбрасываете флаг и выключаете нагрузку. Для определения, продолжать отсчет или нет, можно использовать сам вывод нагрузки.

Цитата

 

vail()

{

if   PINC.0 = 0

then PORTD.0 = 1

end if

}

 

Это какой-то противоестественный гибрид бейсика и Си (в cvavr тоже не скомпилируется). В Си записывается так
 

void vail(){
  if( !(PINC & (1<<0)) ){
    PORTD |= (1<<0);
  }
}

Дело в том, что в Си не предусмотрена работа с отдельными битами, так что используются сдвиги и логические операции. Но не волнуйтесь, компилятор умный, умнее большинства, он развернет битовую магию в sbi/cbi.

Но что начали с ассемблера это правильно. Когда есть понимание внутренностей контроллера, допускаешь меньше ошибок.

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

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

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

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

Но что начали с ассемблера это правильно. Когда есть понимание внутренностей контроллера, допускаешь меньше ошибок.

правильно конечно, но времени мало остаётся (скоро Новый Год)

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

6 минут назад, COKPOWEHEU сказал:


 


void vail(){
  if( !(PINC & (1<<0)) ){
    PORTD |= (1<<0);
  }
}

Вот оно)))) Вижу тут условие.... вижу результат условия.... и куча логических операций... вот это меня особенно порадовало)))

 if( !(PINC & (1<<0)) ){      что здесь произошло???

Исключающее или, и, сдвиг влево на 1 бит?

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

Ассемблер простой язык. А если у человека проблемы с составлением алгоритма, ЯВУ не поможет.
 

Цитата

 

Вот оно)))) Вижу тут условие.... вижу результат условия.... и куча логических операций... вот это меня особенно порадовало)))

 if( !(PINC & (1<<0)) ){      что здесь произошло???

 

Ы-ы-ы :)

(x<<y) - побитовый сдвиг числа x на y бит влево. В данном случае число 1 сдвигается на 0 бит и получается 0b00000001. Если бы сдвигали на 5 бит, получили бы 0b00100000, то есть единицу в 5-м разряде.

& - побитовое И. Как мы помним из булевой алгебры, побитовое И дает единицу только если оба его аргумента единицы. Если хоть один из них ноль, результатом будет ноль.

В регистре PINC находится не только интересующий нас бит PINC0, но и мешающие PINC1-PINC7. Что будет если применим к ним побитовое И с прошлой маской (1<<0)
 

0bxxxxxxxx
0b00000001
----------
0b0000000x

x - значение конкретного бита. Таким образом, мы получили байт, у которого от PINC остался только один нужный нам бит. Теперь надо его подставить в условие if. Особенность Си в том, что TRUE для него - все что не ноль, а FALSE - ноль. То есть 0b00000001 - TRUE, 0b00100000 - TRUE, а 0b00000000 - FALSE. Поскольку нам интересно условие равенства бита нулю, используем логическую (не побитовую!) инверсию (обозначается восклицательным знаком).

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

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

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

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

Не-не-не, пусть на ассемблере кодит :-)

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

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

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

Я всегда хотел подтянуться на си)) Просто мне не понятно с какой стороны код читать?

void vail()

{

if( !(PINC & (1<<0)) )

       {

        PORTD |= (1<<0);

       }

}

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

Так задача простая вроде. Ну разве что с динамической индикацией шаблон сломать придется.

Цитата

Я всегда хотел подтянуться на си)) Просто мне не понятно с какой стороны код читать?

От начала к концу, очевидно :-)

void vail() - объявление функции vail, не принимающей аргументов и возвращающей void (так в Си называется "ничего"). Фигурные скобки - ограничители блоков кода - тела функции, тела if, while и т.д.

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

А вообще, на тему Си почитайте Кернигана и Ричи, у них лучше написано чем тут, на форуме.

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

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

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

пока примите как есть:
PORTD |= (1<<0); - установить бит 0 в порту (переменной)
PORTD &= ~(1<<0); - сбросить бит 0 в порту (переменной)
PORTD ^= (1<<0); - инвертировать бит 0 в порту (переменной)
if(PINC & (1<<0)) - если бит 0 установлен, то
if(!(PINC & (1<<0))) - если бит 0 неустановлен, то

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

5 минут назад, Юстас сказал:

Просто мне не понятно с какой стороны код читать?

с учебника по Си

http://forum.cxem.net/applications/core/interface/file/attachment.php?id=370245

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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