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

Примеры кода для AVR


Duhas

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

int a, b;			
a=(a&0xff)*256+b/256;

Что вы этим хотели изобразить?

Можно подробное рассуждение , особенно о преимуществе асма ...

1) int не на всех системах размером WORD .

2) Судя по вашим манипуляциям в a важен младший байт , в b старший , сделать swap и результат сохранить в a :

uint16_t a,b;

a=(((a & 0x00FF)<<8) | (b >>8));

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

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

А что тут рассуждать? Если вы прочитали код, то должны были прочитать и то, что написано чуть выше. Код рабочий, выполняется примерно за 370 тактов. Если написать на асме через rol, то это займет раза в 3 меньше времени.

В а нужно младший байт перенести на место старшего, а старший байт b на место младшего в а. В вашем коде старшие и младшие байты обеих переменных остаются на своих местах.

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

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

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

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

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

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

В вашем коде старшие и младшие байты обеих переменных остаются на своих местах.

Исправлено. Что скажете?

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

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

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

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

Для 8-разрядного контроллера int может быть только 16 бит.

Оператор swap в С отсутствует, а в асме меняет местами не байты, а нибблы в байте.

Фактически сдвиг влево на 8 и вправо на 8 эквивалентно умножению и делению на 256 соответственно.

Кстати, работает

a=((a&0xff)<<8)|(b&0xff);

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

Дауж... но не стоит же менять сдвиг на операции деления/умножения которые весьма ресурсоёмки. Да и сдвиг тут вообще ни к чему - поменять два байта местами это 3 элементарные операции с задействованием отдельного регистра.

И если компилятор не позволяет провернуть столь простую операцию, то у меня плохие новости - микроскопом-с гвозди забиваете.

Учение - изучение правил. Опыт - изучение исключений.

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

Да и сдвиг тут вообще ни к чему - поменять два байта местами это 3 элементарные операции с задействованием отдельного регистра.

Об этом и хотел продолжить, да отвлекли. Вменяемый компилятор и

заменил бы сдвиг на 8 бит и битовое

сложение на манипуляции с байтами.

Причем 3й регистр здесь и на не нужен.Копируем младший а в старший а , копируем старший b в младший а.

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

Насчет swap -речь шла о операторе псевдо языка и только...

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

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

Не могу понять как вывести сигнал из меги, в зависимости от комбинации на входе.

Например нужно иметь на выходе:

PORTB = 0x19 если на входе PINC = 0x05

PORTB = 0x29 если на входе PINC = 0x04

PORTB = 0x25 если на входе PINC = 0x06

PORTB = 0x26 если на входе PINC = 0x02

PORTB = 0x16 если на входе PINC = 0x03

PORTB = 0x1A если на входе PINC = 0x01

и назад по кругу.

Через оператор for - else не получается. Программа встаёт колом на первом значении.

Я только начинаю учить С, потому сразу не пинайте.

Нужно запустить синхронный моторчик с датчиками холла. Упрощённая схема примерно такая:

71ba8-clip-32kb.png?nocache=1

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

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

Здравствуйте, может кто подскажет как сделать чтобы при зажатой более 4 сек. кнопкой сразу же отключался светодиод, но при кратковременном нажатии на кнопку задержка выключения была около 3 сек. У кода ниже задержка работает и при кратковременном нажатии, и при долговременном (более 4 сек.).

#define F_CPU 1000000
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB=0x02;
PORTB=0x00;
PORTB=0x04;
   while(1)
   {
 if (PINB&(1<<PORTB2))
 { 
  PORTB=0x02;
  _delay_ms(3000);
 }
 else
 PORTB=0x00;
}

}

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

при таких хотелках нужно использовать таймер и внешнее прерывание которое будет генерится при изменении уровня на входе

алгоритм ПРИМЕРНО следующий

при изменении уровня на входе внешнего прерывания начать отсчет 4 секунд по таймеру, если уровень на входе изменился а таймер не досчитал до четырех секунд то выполнить в позе стоя, а если таймер досчитал до 4 секунд и уровень на входе внешнего прирывания не изменился то выполнить в позе лежа

как то так

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

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

при зажатой более 4 сек. кнопкой сразу же отключался светодиод, но при кратковременном нажатии на кнопку задержка выключения была около 3 сек
Никакой разницы между этими двумя действиями не вижу. Делайте общую задержку после нажатия кнопки и светодиод выключится в любом случае после неё. Хоть кратковременно Вы нажмёте, хоть долго будете её держать.

Ну а если уж прямо не в моготу хочется разные циферки по времени, то и делайте для этих действий разные задержки :

if(нажата кнопка){
 _delay_ms(3000);
 if(нажата кнопка){  // если она до сих пор нажата
   _delay_ms(1000); // задерживаем выключение ещё на 1 секунду
 }
 выключить_светодиод();
}

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

  • 2 месяца спустя...

Подскажите пожалуйста, возможно ли в атмеге 8 задействовать одновременно PWM на ножке (PB02 OC1B), и SPI интерфейс? на той же ножке находится провод SS интерфейса SPI.

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

1. Что мешает использовать для PWM PB01 OC1A?

2. Как PWM так и SPI можно организовать программно, используя для этого любые подходящие вывода портов.

3. Если МК всегда работает в режиме Master, то вы можете использовать SS на выход не вмешиваясь в работу SPI

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

OC1A уже занят другим ШИМом.

Две амеги общаются по средством СПИ когда я на (мастере) запускаю ШИМ на OC1B, связь пропадает, вот у меня и закрались сомнения по поводу одновременной их работы.

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

Master Mode

When the SPI is configured as a Master (MSTR in SPCR is set), the user can determine the direction of the SS pin.

If SS is configured as an output, the pin is a general output pin which does not affect the SPI system. Typically, the pin will be driving the SS pin of the SPI Slave.

РВ2 нужно сконфигурировать, как выход в регистре DDRB

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

Текст из официального даташита на мегу8. Красным по белому прямо сказано, что если SPI мастер, SS сконфигурирован, как выход, то вывод является выводом общего применения и не влияет на работу системы SPI. Если в программе есть проблемы, то ищите не здесь.

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

Sergey-Ufa,

уточните для San047, что Мастер может использовать для функции SS любой другой (свободный порт МК), т.к. управление этой линией интерфейса (в режиме Мастер) программное (ручное). Можно перекроить схему подключения Мастера. Для Ведомого этот вывод важен, т.к. переводит SPI в активное состояние.

San047,

ШИМ формирует МК, работающий в режиме Мастер?

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

Всем здрасьте. Только начинаю, можно сказать даже не в начале пути. И сподвигло меня следующее. Я рыбак и мне в руки попала интересная штучка, светлячек для ловли. При разборе обнаружились детали: два светодиода, вибродатчик и микросхема, оч похожая на МК, корпус so8. Алгоритм работы этой штуки следующий:

В состоянии покоя-светит зеленый, вибрация со спиннинга передается через резинку тактильным образом, при появлении вибрации срабатывает датчик-зеленый перестает светить-начинает мигать красный, сек 5, потом опять светит зеленый. Может и не МК, но алгоритм по-моему следующий. Если на входе 0, светит или мигает зеленый (я видел две модификации, там где светит и где мигает, причем частота мигания зеленого вдвое меньше, чем частота мигания красного), если 1, то зеленый не светит (не мигает), а мигает красный секунд 5. Питание 3 вольта. Если это МК-схема для повторения не сложная, а вот программа. Может хоть в общих чертах кто объяснит. Зажечь светодиод, при земле или при + на ресете (например) потушить его и заставить мигать другой, потом уйти в состояние первоначальное. Я не много прошу? Если много, не пинайте сильно, я ведь только учусь)))

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

  • 4 месяца спустя...

Главное, чтобы рост ресурсов МК не приводил к сокращению "серого вещества" программиста. Эстетика кода всегда нужна и всегда важна.

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

Код с умножением (оптимизация -Os)

unsigned char aa;
unsinged int bb;
bb = 0x101 * aa;

дизассемблируется в

 36: 90 e0 ldi r25, 0x00 ; 0
38: 61 e0 ldi r22, 0x01 ; 1
3a: 71 e0 ldi r23, 0x01 ; 1
3c: 03 d0 rcall .+6 ; 0x44 <__mulhi3>

плюс процедура умножения. Это для ATtiny2313 у которой аппаратного умножения нет. Если есть, используется оно:

ldi	 r18, 0x01	   ; 1
 3c:   31 e0		   ldi	 r19, 0x01	   ; 1
 3e:   42 9f		   mul	 r20, r18
 40:   c0 01		   movw    r24, r0
 42:   43 9f		   mul	 r20, r19

.

Код (тоже -Os разумеется)

b=((a&0xff)<<8)|(a&0xff);

дизассемблируется в такое

mov r25, r18 ;a=r19:r18
3a: 88 27 eor r24, r24 ;b=r25:r24
3c: 82 2b or r24, r18
3e: 93 2b or r25, r19

О соотношении объемов кода и скоростей можно догадаться.

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • Какова площадь поверхности данного радиатора?
    • @Богдан Назаренко , 4558 и 5532 на слух не отличить. Да и параметры у них практически одиннаковые. Мне показалось TL072 звучит хуже.
    • @maxim1881  Какой курс  студент ?  Прочитать схему  то умеешь ? И где - то к этой схеме есть описание  ...  Так вот по описанию и можно сделать то что  требуется ...  Я лично  два года учился , пока пришло просветение чтения схем  И так подтолкну  один блок тебе :  DD1.5 , DD1.6 , R9 C5 - генератор ... И так  далее ... Кароче  шукай  описание  в журналах на данную схему и все получится     Датчик пересечения ИК-луча Другая сфера применения аналоговых усилителей на основе микросхемы 4069 - инфракрасный датчик или фотоприемник инфракрасного сигнала. На рисунке 7 показана схема успешно эксплуатируемого уже несколько лет датчика, реагирующего на пересечение либо отражение инфракрасного луча. Интересно то, что в схеме нет широко используемых в таких случаях готовых интегральных фотоприемников. Сигнал принимается обычным ИК-фотодиодом, а усиление производится усилительными каскадами, выполненными на основе инверторов микросхемы 4069. Наличие шести инверторов в одном корпусе микросхемы 4069 позволяет весь датчик, как его приемную, так и передающую части выполнить на одной микросхеме 4069. И так, схема показана на рис. 7. Как обычно, ИК-датчик работающий на отражение или пересечение луча состоит из передатчика ИК-луча и его приемника. Передатчик ИК-луча состоит из ИК-светодиода HL1 (здесь светодиод, такой как в пультах ДУ аппаратуры), токового ключа на транзисторах VТ1 и VТ2 и генератора импульсов частотой около 8-10 kHz. Импульсы с выхода мультивибратора на элементах D1.5 и D1.6 поступают через токовый ключ на VT1 и VT2 на ИК-светодиод HL1. Резистор R11 ограничивает ток через светодиод. HL1 излучает ИК вспышки, следующие с частотой 8-10 kHz. Если существует видимость между HL1 и FH1, излученные вспышки воздействуют на фотодиод FH1 ив нем возникают импульсы тока. Благодаря резистору R1 они преобразуются в импульсы напряжения. Переменное напряжение через конденсатор С1 поступает на первый усилитель на элементе D1.1. Его в усилительный режим переводит резистор R2. Далее, через С2 усиленное переменное напряжение поступает на усилитель на D1.2. В цепи ООС D1.2 есть резистор R3, который смещает его вход в сторону напряжения логической единицы. В результате его выход смещен в сторону логического нуля. Поэтому, в отсутствие входного сигнала напряжение на С3 соответствует логическому нулю. Но при наличии входного сигнала за счет работы детектора на VD1 напряжение на С3 увеличивается до логической единицы. Выходные импульсы формирует триггер Шмитта на элементах D1.3 и D1.4. Фотодиод РН302 можно заменить любым ИК-фотодиодом. Налаживание датчика сводится к подбору сопротивления R3, чтобы при отсутствии сигнала на выходе D1.4 был ноль, а при наличии сигнала - единица. Везде вместо микросхемы 4069 можно попробовать микросхему К561ЛН2. Тюльгин Ю.М. РК-2016-03.  
    • Ух... добавили вы мне оптимизма... Никогда б не подумал что  на такой мелочёвки жулики так заморочились.. Ну как сказать... В своё время я зарабатывал на ремонте 3УСЦТ и старше (само собой и смежной технике). Потом несколько лет ремонт связной спецтехники (основная задача - настройка-обслуживание, а ремонты - то по необходимости). Но последние лет 20 паяльник используется редко и то в основном для пайки проводов-разъёмов и разной мелочёвки.
    • 4558 неплохая микросхема, особо не отличается от 5532, и наушники потянет, если у вас нет завышенных требований.
  • Похожий контент

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