is an unknown quantity at this point
Регистрация: 05.06.2015
Сообщений: 6
Репутация: 0
|
Здравствуйте!
Делаю свой первый проект Светодиодная мигалка на микроконтроллере ATmega8. Проект компилировал в Atmel Studio. Вроде все заработало как нужно, но хочу теперь добавить светодиоды - 4 штуки и повесить их к примеру на порт B. Не совсем понимаю что нужно написать в код, как я понимаю сначала нудно настроить порт B на выход : Код: DDRB= 0xff; /* все выводы порта D сконфигурировать как выходы */ А вот как быть дальше не совсем понятно(( Подскажите пожалуйста. Я могу просто скопировать часто кода где есть порт D и заменить на B. К примеру рядом с DDRD &= ~(1<<j); дописать DDRB &= ~(1<<j); и так далее? |
||
Оценка
|
Гуру
Регистрация: 28.06.2012
Сообщений: 4,830
Репутация: 1158
|
Можете, почему нет ?
Только рискну дать маленький совет. Для начинающего гораздо лучше подойдет CodeVision. И еще, там, на схеме, линии AGND и AVCC МК никуда не подключены, а надо бы подпаять к ним землю и питание ... |
||
Оценка
|
is an unknown quantity at this point
Регистрация: 05.06.2015
Сообщений: 6
Репутация: 0
|
В этом случае если скопировать, наверное она будут мигать одновременно, а мне нужно чтобы последовательно, т.е. сначала промигали 4 светодиода порта D а потом начали также мигать по очереди мигать светодиоды порта B.
|
||
Оценка
|
Гуру
Регистрация: 28.06.2012
Сообщений: 4,830
Репутация: 1158
|
Тогда придется взять уже имеющийся блок для PORTD, скопировать его в отдельный файл, внести в него соотв. изменения, вставить после уже имеющегося в программе блока для PORTD, а затем ввести между блоками требуемую задержку.
Или я задачи не понял ? |
||
Оценка
|
Эксперт
Регистрация: 08.11.2009
Сообщений: 2,310
Репутация: 639
|
Цитата:
неговоря уже о том что конструкция вида (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; |
||
Оценка
|
Новичок
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
|
А можно создать переменную с каким то названием, у которой каждый бит будет соответствовать заранее назначенному порту МК ? И потом гонять сдвигами в любые стороны , обнулять, устанавливать , инвертировать , экспотировать .. ну вобщем делать всё что хочешь .. ?
|
||
Оценка
|
Новичок
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
|
|
||
Оценка
|
Новичок
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
|
Когда делаешь печатную плату под какой то проект , то не всегда получается использовать один порт, приходится тусовать порты ... И вот в этом случае сдвиги одного порта не проканывают .
|
||
Оценка
|
Ответ |
Страница 1 из 2
|
Метки |
atmega8, мигалка на atmega8, мигалка на мк |
|
|
Обратная связь РадиоЛоцман Вверх |