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

Видеокурс по AVR-микроконтроллерам для начинающих


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

где защитный резистор на светодиоде?

Попробуйте так

#include <avr/io.h>
int main(){
DDRC=0x00;
PORTC=0xFF;
DDRB=0xFF;
while(1){
 PORTB=PINC;
}
}

И кнопку коммутировать не на питание а на землю, поскольку включена подтяжка.

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

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

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

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

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

где защитный резистор на светодиоде?

Попробуйте так

#include <avr/io.h>
int main(){
DDRC=0x00;
PORTC=0xFF;
DDRB=0xFF;
while(1){
PORTB=PINC;
}
}

И кнопку коммутировать не на питание а на землю, поскольку включена подтяжка.

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

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

Этот код тоже не работает. Может я не правильно поставил вопрос? Тут дело не в коде, Дело в том что порт не ставится на вход регистром DDRC=0x00; , а ставиться на вход регистром DDRC=0xFF;. Как это исправить? Месяц назад на таком же кристалле, с кодом:

[/color]
[color=#000000]//AtMega8A
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
void presets()
{[/color]
[color=#000000]DDRC=0x00;
PORTC=0xFF;
DDRB=0xFF;
PORTB=0x00;
}[/color]
[color=#000000]int main(void)
{
presets();[/color]
[color=#000000]while(1)
{
if (PINC&(1<<PC0))
{
PORTB=0xFF;[/color]

[color=#000000]}
else {
PORTB=0x00;
}
}
}[/color]
[color=#000000]

Все работало как положено!

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

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

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

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

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

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

Нашел решение

//AtMega8A
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
void presets()
{
DDRC=0x00; //порт настроен на вход
PORTC=0xFF;// подтягивающие сопротивленеи включено
DDRB=0xFF; //порт настроен на выход
PORTB=0x00; //низкий уровень порта
}
int main(void)
{
presets();
int stat_button=0; // переменная состояния кнопки
while(1)
{
 if (!(PINC&(1<<0))&(stat_button==0))
 {
  PORTB=0xFF;
  stat_button=1;
  _delay_ms(20);
 }
 else if (!(PINC&(1<<0))&(stat_button==1))
 {
  PORTB=0x00;
  stat_button=0;
  _delay_ms(20);
 }
}
}

Если поставить в условии знак логического отрицания if (!(PINC&(1<<0)), то работает как положено. Объясните пожалуйста почему так?

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

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

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

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

Дело не в защитном резисторе на светодиоде.

Разумеется, на работу программы он не влияет.
Может я не правильно поставил вопрос? Тут дело не в коде, Дело в том что порт не ставится на вход регистром DDRC=0x00; , а ставиться на вход регистром DDRC=0xFF;.
Если порт не настраивается на вход записью 0xFF это значит что контроллер бракованный, как и при любом другом отклонении от его документации.
Если поставить в условии знак логического отрицания if (!(PINC&(1<<0)), то работает как положено. Объясните пожалуйста почему так?
Если кнопка коммутируется на землю, все правильно. А если на питание - зачем включать подтягивающие резисторы?
Этот код тоже не работает.
Только что перепроверил - все работает. Диод на PB0 повторяет уровень на PC0. С остальными выводами должно быть аналогично.

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

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

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

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

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

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

Ну раз у него шины питания перепутаны то код работает правильно, стоит подтягивающий резистор на кнопке, значит на входе постоянно +, в условии он кнопку тоже на лог 1 проверял, поставив ! В условие, стал проверять на 0 и все заработало как надо

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

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

Подскажите поэалуйста

if ( (PINA | (1<<0)) & (PINA | (1<<1)))

Это условие того, что нажата хотя бы одна из кнопок.

А как написать условие, на нажатие только двух кнопок ?

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

if ( (PINA | (1<<0)) & (PINA | (1<<1)))

Это условие того, что нажата хотя бы одна из кнопок.

Это - какая-то херня, а не условие для проверки уровня хотябы на одном из выводов.

"ИЛИ" (на одном из выводов лог. "1") :

if ( (PINA&(1<<0)) || (PINA&(1<<1)))

"И" (на обоих выводах лог. "1") :

if ( (PINA&(1<<0)) && (PINA&(1<<1)))

if ( (PINA | (1<<0)| (1<<1))

вот так как то

Вы сами то попробовали эту конструкцию, прежде чем посоветовать ? :)
Ссылка на комментарий
Поделиться на другие сайты

нет, но логически подумать, если на одном из пинов будет 0 то условие не сработает.

все я понял свою ошибку, извеняюсь :rolleyes:

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

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

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

Alex. Эмммм а вы проверили?

Смотрите. Предположим что зажаты 2 кнопки (т.е PORTA0=1, PORTA1=1), т.е PINA= 0b00000011

1) (PINA&(1<<1)) - 0b00000010& 0b00000011 -> 0b00000010

2) (PINA&(1<<0)) - 0b00000001& 0b00000011 -> 0b00000001

3) ( (PINA&(1<<0)) && (PINA&(1<<1))) - 0b00000010 & 0b00000001 -> 0b00000000

Результат - ложь. Неа, не то условие

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

Чё Вы тут понаписали ? :)

3) ( (PINA&(1<<0)) && (PINA&(1<<1))) - 0b00000010 & 0b00000001 -> 0b00000000
Неправильно расписали. Надо так :

( (PINA&(1<<0)) && (PINA&(1<<1))) -> 0b00000010 && 0b00000001 = true

Не путайте & и && - это разные операции.

Да и чего тут выдумывать ?

(PINA&(1<<0)) - состояние одного вывода

(PINA&(1<<1)) - состояние другого вывода

Делайте теперь с ними (с состояниями) что хотите. Хоть в "ИЛИ" соединяйте ( || ), хоть в "И" ( && ).

Можете даже на "0" проверять :

!(PINA&(1<<0)) - true, если на ноге RA0 лог. "0"

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

Ааа точно) Это же булевый оператор) Спасибо)

Правда .. то ли протеус тупит, то ли не работает, но достаточно зажать кнопку на 0, и выполняется функция. А вот 2 необязательно 0_0

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

Хотел бы, слегка поиграться со шрифтом на ЖК 3310, не подскажете программу, которой можно было бы перерисовать существующие шрифты в библиотеке?

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

самый простой способ это представить символ в виде поля 5х8 пиксилей или точек

00010

00101

01001

01111

01001

01001

00000

00000

вот тебе и буква A , теперь через калькулятор программиста преврати каждую столбец в 16ричный вид(HEX) (должно быть 5 кодов т.к. 5 СТОЛБЦОВ и кидай их в библиотеку на место того символа который хочешь заменить (ну как то так )0Х00,0Х3С,0Х0A,0Х09,0Х3E,

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

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

По поводу урока 8. Я понимаю что точность в 1 градус этого вполне хватит измерять температуру от 100 и более градусов, а если представить мне нужно измерить температуру с шагом 0.1 Например для измерения температуры в комнате? Как настроить датчик с шагом 0.1 ?

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

Ну я так думаю, вы уж сами так пробовали, раз такие советы даете? Функция Lcd_printf() вообще не принимает значения больше 31999 интересно как люди калькуляторы пишут на МК, ну а при таких значениях когда ADC считает только при значении +-10 милливольт, единственным правильным решением только считать значения разрядностью в 1 градус не меньше, говорят что проще составить таблицу и сверять АДС по таблицы и выводить значения. Хотелось бы глянуть на реальный рабочий пример, а не бессмысленные предположения и домыслы. Ну скорей всего дело в датчике, наверное нужно купить датчик не для автоклавов, а по точнее стоит на 50 центов дороже всего, за то шаг 0.06 градуса.

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

У вас датчик с каким шагом?

Причем тут таблици и сравнивать м таблицами, что за бред?

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

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

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

Ну я так думаю, вы уж сами так пробовали, раз такие советы даете? Функция Lcd_printf() вообще не принимает значения больше 31999 интересно как люди калькуляторы пишут на МК,

Да уж не с помощью Lcd_printf ! Скорее всего, что-нибудь самописное для вывода на семисегментники. Вообще, ограничение 31999 довольно странное, логичнее было бы 32767. Мой китайский калькулятор работает обладает 10-разрядным дисплеем, то есть как минимум 9 шестнадцатеричных разрядов, что похоже на 8-байтное число с плавающей точкой (double), но что там на самом деле - одним китайцам ведомо.

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

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

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

Как настроить датчик с шагом 0.1 ?

А что там за датчик ? Я не смотрел уроки.
Функция Lcd_printf() вообще не принимает значения больше 31999
Ну для термометра больше и не нужно. Или Вы собираетесь мерить температуру на Солнце ? :)
Ссылка на комментарий
Поделиться на другие сайты

А зачем может понадобиться мерить температуру Солнца с точностью 0.1 градуса на атмеге?!

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

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

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

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

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

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

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

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

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

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

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

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

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

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