На склад поступили жидко-кристаллические индикаторы и дисплеи от KSE

Модификация мигалки на микроконтроллере Atmega8

Страница 1 из 2
is an unknown quantity at this point
 
Регистрация: 05.06.2015
Сообщений: 6
Репутация: 0
 
15.06.2019 21:02 #1
Здравствуйте!
Делаю свой первый проект Светодиодная мигалка на микроконтроллере ATmega8. Проект компилировал в Atmel Studio.
Вроде все заработало как нужно, но хочу теперь добавить светодиоды - 4 штуки и повесить их к примеру на порт B.
Не совсем понимаю что нужно написать в код, как я понимаю сначала нудно настроить порт B на выход :
Код:
DDRB= 0xff; /* все выводы порта D сконфигурировать как выходы */

А вот как быть дальше не совсем понятно(( Подскажите пожалуйста.
Я могу просто скопировать часто кода где есть порт D и заменить на B. К примеру рядом с DDRD &= ~(1<<j); дописать DDRB &= ~(1<<j); и так далее?
Оценка
В многообразии литиевых батареек и аккумуляторов нет какого-то универсального или идеального варианта. Выбирая тот или иной вариант для питания устройства, разработчику приходится оперировать множеством параметров, используя наиболее оптимальное их сочетание для каждого приложения. Разберем параметры для различных приложений.
Гуру
 
Регистрация: 28.06.2012
Сообщений: 4,676
Репутация: 1102
1,248 94
480 1
 
15.06.2019 21:22 #2
Можете, почему нет ?

Только рискну дать маленький совет. Для начинающего гораздо лучше подойдет CodeVision.

И еще, там, на схеме, линии AGND и AVCC МК никуда не подключены, а надо бы подпаять к ним землю и питание ...
Оценка
is an unknown quantity at this point
 
Регистрация: 05.06.2015
Сообщений: 6
Репутация: 0
 
15.06.2019 22:08 #3
В этом случае если скопировать, наверное она будут мигать одновременно, а мне нужно чтобы последовательно, т.е. сначала промигали 4 светодиода порта D а потом начали также мигать по очереди мигать светодиоды порта B.
Оценка
Гуру
 
Регистрация: 28.06.2012
Сообщений: 4,676
Репутация: 1102
1,248 94
480 1
 
15.06.2019 22:19 #4
Тогда придется взять уже имеющийся блок для PORTD, скопировать его в отдельный файл, внести в него соотв. изменения, вставить после уже имеющегося в программе блока для PORTD, а затем ввести между блоками требуемую задержку.
Или я задачи не понял ?
Оценка
Эксперт
 
Аватар для DmitriyVDN
 
Регистрация: 08.11.2009
Сообщений: 2,310
Репутация: 639
619 131
34 9
 
15.06.2019 23:12 #5
Цитата:
Сообщение от Mega2560
А вот как быть дальше не совсем понятно(( Подскажите пожалуйста.
Я могу просто скопировать часто кода где есть порт D и заменить на B. К примеру рядом с DDRD &= ~(1<<j); дописать DDRB &= ~(1<<j); и так далее?
дам ответ с конца, да можете и на выводах портаБ получите эффект дублирующий эффект на портД , то же самое можно получить поставив по два светодиода на выходы портаД , результат будет такой же. понятно?
неговоря уже о том что конструкция вида (1<<j) не что иное как говнокод граничащий с идиотизмом как по размеру получаемого машинного кода так и производительности МК и обращение к регистру DDR не изменяет состояние порта ,а переключает порт на вход или выход , что для мигалки очередная тупость.
чел который это написал скорее всего сам не понимал че он делает.
что с этим делать :
1 создать переменную буфер в которой формируется текущий эффект
2 после необходимых действий с переменой ее значение передается на выходы портов
пример: для 16 светодиодов на по 8 на портах Д и Б

Код:
unsigned int buffer;
//......
//......
//**** эффект бегущий огонь вперед ***
// код вставляем в case
if(j==0) buffer=(1<<0); // устанавливаем начальное состояние
PORTB=buffer&0xff; // младшие 8бит буфера загружаем в портБ
PORTD=buffer>>8; // старшие 8бит буфера загружаем в портД
buffer<<=1; //сдвиг влево
for(i=0;i<d;i++)_delay_us(50);
 j++; 
j&=0x0F; 

//**** эффект бегущий огонь назад ***
// тоже самое отличие всего в двух командах (помечены !!!)
// код вставляем в case
if(j==0) buffer=(1<<15); // устанавливаем начальное состояние бит15=1 !!!
PORTB=buffer&0xff; // младшие 8бит буфера загружаем в портБ
PORTD=buffer>>8; // старшие 8бит буфера загружаем в портД
buffer>>=1;сдвиг вправо !!!
for(i=0;i<d;i++)_delay_us(50);
 j++; 
j&=0x0F;
Оценка
Новичок
 
Аватар для aalex_641
 
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
64 24
35 8
 
16.06.2019 21:51 #6
А можно создать переменную с каким то названием, у которой каждый бит будет соответствовать заранее назначенному порту МК ? И потом гонять сдвигами в любые стороны , обнулять, устанавливать , инвертировать , экспотировать .. ну вобщем делать всё что хочешь .. ?
Оценка
Гуру
 
Регистрация: 28.06.2012
Сообщений: 4,676
Репутация: 1102
1,248 94
480 1
 
16.06.2019 22:05 #7
Можно, конечно же. Например:

Код:
unsigned char var_portc;

var_portc = 0x55;

PORTC = var_portc;
Оценка
Новичок
 
Аватар для aalex_641
 
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
64 24
35 8
 
16.06.2019 22:09 #8
Цитата:
Сообщение от kovigor
Можно, конечно же. Например:

Код:
unsigned char var_portc;

var_portc = 0x55;

PORTC = var_portc;
Не .... Порты разные и биты разные ... К примеру B3,c1,d5,d2,c6,b0,b1,b2
Оценка
Новичок
 
Аватар для aalex_641
 
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
64 24
35 8
 
16.06.2019 22:23 #9
Когда делаешь печатную плату под какой то проект , то не всегда получается использовать один порт, приходится тусовать порты ... И вот в этом случае сдвиги одного порта не проканывают .
Оценка
Эксперт
 
Аватар для DmitriyVDN
 
Регистрация: 08.11.2009
Сообщений: 2,310
Репутация: 639
619 131
34 9
 
16.06.2019 23:21 #10
можно.
Оценка
Ответ
Страница 1 из 2
Метки
atmega8, мигалка на atmega8, мигалка на мк
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход
Электронные компоненты. Бесплатная доставка по России
Часовой пояс GMT +3, время: 22:00.
Обратная связь РадиоЛоцман Вверх