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

Язык СИ для микроконтроллеров


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

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

а прочитал понял то есть после данного выражения должно стать 0b0000xxxx

вроде начинаю понимать, спасибо большое за помощь, а второе выражение я правильно понял?

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

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

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

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

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

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

Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

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

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

Это способы установки отдельных битов в 1 или 0, без затрагивания остальных битов в порте.

Для установки в 1 используется операция ИЛИ, для установки в 0 используется операция И.

Например, нужно установить 5-ый бит в 1.

Сдвигаем 1 на место пятого бита 1<<5 и делаем операцию ИЛИ:

PORTB |= 0b00100000

После этой операции 5-ой бит в PORTB гарантировано будет установлен в 1, а остальные биты как были, так и останутся.

Установка 5-ого бита в 0 немного хитрее. Для операции И надо 0 сдвинуть на место пятого бита и сделать операцию И. Но ноль не двигается просто так, как единичка! Поэтому cначала как обычно двигаем 1<<5, а потом результат инвертируем ~. Получаем сдвинутый ноль 0b11011111.

PORTB &= ~0b00100000

Тут только 5-ый бит встанет в 0, остальные биты в PORTB не затронуты.

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

дошел еще до одной не понятной команды:

LDP |=((cmd&0b11110000)>>(4-LCD_D4));

LDP - PORTD

LCD_D4 - 4

получается

PORTD | =((cmd&0b11110000)>>(4-4));

(4-4) - сдвиг вправо на 0

PORTD | =((cmd&0b11110000);

вот тут не понятно что означает cmd?

блин вопрос отменяется, это переменная с которой вызывается функция

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

все же не понятно вызывается функция таким образом:

LCDsendCommand(0b00101000);

сама функция:

void LCDsendCommand(uint8_t cmd) //Sends Command to LCD
{
LDP &= ~((0b11110000)>>(4-LCD_D4));
LDP |=((cmd&0b11110000)>>(4-LCD_D4));
LCP|=1<<LCD_E; 
_delay_ms(1);
LCP&=~(1<<LCD_E);
_delay_ms(1);
LDP &= ~((0b11110000)>>(4-LCD_D4));
LDP |=((cmd&0b00001111)<<(LCD_D4));
LCP|=1<<LCD_E; 
_delay_ms(1);
LCP&=~(1<<LCD_E);
_delay_ms(1);
}

что происходит во второй строке? почему работа идет с 5 битом?

LDP - PORTB

LCD_D4 - номер ножки порта в данном примере 4

данные команды:

//--------4 bit--dual line---------------
LCDsendCommand(0b00101000);
  //-----increment address, cursor shift------
LCDsendCommand(0b00001110);

вызываются в конце инициализации дисплея

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

прочитал, документацию на экран HD44780, и попробовал произвести инициализацию, но увы, чего то мне не хватило (верхняя строка светится растр то есть инициализация не прошла), помогите понять почему, что я делаю не так?

внутри подписал какие контакты дисплея подключаю к контроллеру, ну и сам код

//Инициализация
void Init(void)
{
 //Инициализация дисплея
 //Задержка
 _delay_ms(10);
 //D4,D5 устанавливаем в 0   
 PORTD & = ~(1<<6|1<<7);
 //D6,D7 устанавливаем в 0
 PORTB & = ~(1<<0|1<<1);
 //E устанавливаем в 0
 PORTD & = ~(1<<5);
 //RS, RW устанавливаем в 0
 PORTB & = ~(1<<6|1<<7);
 //Установка всех портов как выходы
 DDRD | = 1<<5|1<<6|1<<7;
 DDRB | = 1<<0|1<<1|1<<6|1<<7;
 //Первый этап
 PORTD | = (1<<6|1<<7);
 PORTD | = (1<<5);
 _delay_ms(10);
 PORTD & = ~(1<<5);
 _delay_ms(10);
 //Второй этап
 PORTD | = (1<<6|1<<7);
 PORTD | = (1<<5);
 _delay_ms(10);
 PORTD & = ~(1<<5);
 _delay_ms(10);
 //Третий этап
 PORTD | = 1<<6;
 PORTD & = ~(1<<7);
 PORTD | = (1<<5);
 _delay_ms(10);
 PORTD & = ~(1<<5);
 _delay_ms(10);

}

post-192304-0-48880300-1452098613_thumb.jpg

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

все же не понятно вызывается функция таким образом:

LCDsendCommand(0b00101000);

сама функция:

void LCDsendCommand(uint8_t cmd) //Sends Command to LCD
{
LDP &= ~((0b11110000)>>(4-LCD_D4));
LDP |=((cmd&0b11110000)>>(4-LCD_D4));
LCP|=1<<LCD_E;
_delay_ms(1);
LCP&=~(1<<LCD_E);
_delay_ms(1);
LDP &= ~((0b11110000)>>(4-LCD_D4));
LDP |=((cmd&0b00001111)<<(LCD_D4));
LCP|=1<<LCD_E;
_delay_ms(1);
LCP&=~(1<<LCD_E);
_delay_ms(1);
}

что происходит во второй строке? почему работа идет с 5 битом?

LDP - PORTB

LCD_D4 - номер ножки порта в данном примере 4

данные команды:

//--------4 bit--dual line---------------
LCDsendCommand(0b00101000);
//-----increment address, cursor shift------
LCDsendCommand(0b00001110);

вызываются в конце инициализации дисплея

0 будет в порту после операции, после и по маске сдвигается 0 в право...

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

Первый этап надо ещё раз повторить - всего 3 раза надо записать 0011.

А после третьего этапа надо ещё установить число строк, выбрать размер фонта, очистить дисплей, включить-выключить курсор и т.д. Всего ещё 10 полубайтов надо записать в HD44780. Вот тут расписана инициализация.

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

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

_delay_ms(1);
LDP &= ~(1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|1<<LCD_D4);
LCP &= ~(1<<LCD_E|1<<LCD_RW|1<<LCD_RS);
LDDR|=1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|1<<LCD_D4;
LCDR|=1<<LCD_E|1<<LCD_RW|1<<LCD_RS;
//---------one------
//4 bit mode
LDP |= (1<<LCD_D5|1<<LCD_D4);
LDP &= ~(1<<LCD_D7|1<<LCD_D6);
LCP|= (1<<LCD_E);
_delay_ms(1);
LCP &= ~(1<<LCD_E);
_delay_ms(1);
//-----------two-----------
LDP |= (1<<LCD_D5|1<<LCD_D4);
LDP &= ~(1<<LCD_D7|1<<LCD_D6);
LCP|= (1<<LCD_E);
_delay_ms(1);
LCP &= ~(1<<LCD_E);
_delay_ms(1);
//-------three-------------
LDP |= (1<<LCD_D5);
LDP &= ~(1<<LCD_D7|1<<LCD_D6|1<<LCD_D4);
LCP|= (1<<LCD_E);
_delay_ms(1);
LCP &= ~(1<<LCD_E);
_delay_ms(1);

вот заменил выражения:

_delay_ms(10);
PORTD &= ~(1<<7|1<<6|1<<5|1<<4);
PORTB &= ~(1<<2|1<<0|1<<1);
DDRD|=1<<7|1<<6|1<<5|1<<4;
DDRB|=1<<2|1<<0|1<<1;
//---------one------
//4 bit mode
PORTD |= (1<<5|1<<4);
PORTD &= ~(1<<7|1<<6);
PORTB|= (1<<2);
_delay_ms(10);
PORTB &= ~(1<<2);
_delay_ms(10);
//-----------two-----------
PORTD |= (1<<5|1<<4);
PORTD &= ~(1<<7|1<<6);
PORTB|= (1<<2);
_delay_ms(10);
PORTB &= ~(1<<2);
_delay_ms(10);
//-------three-------------
PORTD |= (1<<5);
PORTD &= ~(1<<7|1<<6|1<<4);
PORTB|= (1<<2);
_delay_ms(10);
PORTB &= ~(1<<2);
_delay_ms(10);

после выполнения данного кода появляется мигающий курсор, а вот пытаюсь повторить на своих портах, получаю только в верхней строке растр

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

наконец получилось инициализировать экран, теперь пытаюсь разобраться как кинуть команду на 4 пина, в библиотеке есть такая функция:

//Послать комманду в LCD
void LCDCommand(uint8_t cmd)
{
PORTD &= ~((0b11110000)>>(4-6));
PORTD |=((cmd&0b11110000)>>(4-6));
 //Строб
 strob_lcd();
PORTD &= ~((0b11110000)>>(4-6));
PORTD |=((cmd&0b00001111)<<(6));
 //Строб
 strob_lcd();
}

вот не пойму как такое реализовать если эти самые 4 пина у меня на разных портах - 2 на B и 2 на D

может показать кто-нибудь пример?

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

вот взял с вашей ссылки:

void lcd_write(unsigned char data, unsigned char mode){
if (mode)RS = 1;else RS = 0;   //выбор режима 1-data 0-comand
delay_us(lcd_delay);
// старший нибл
if (data & (1<<7)) LCD_PD7=1; else LCD_PD7=0;
if (data & (1<<6)) LCD_PD6=1; else LCD_PD6=0;
if (data & (1<<5)) LCD_PD5=1; else LCD_PD5=0;
if (data & (1<<4)) LCD_PD4=1; else LCD_PD4=0;
EN = 1;
delay_us(lcd_delay);
EN = 0;
delay_us(lcd_delay);
//младший нибл
if (data & (1<<3)) LCD_PD7=1; else LCD_PD7=0;
if (data & (1<<2)) LCD_PD6=1; else LCD_PD6=0;
if (data & (1<<1)) LCD_PD5=1; else LCD_PD5=0;
if (data & (1<<0)) LCD_PD4=1; else LCD_PD4=0;
EN = 1;
delay_us(lcd_delay);
EN = 0;
delay_us(lcd_delay);
LCD_PD7=1; LCD_PD6=1; LCD_PD5=1; LCD_PD4=1;
delay_ms(lcd_delay);
}

все вроде понятно кроме этой строки:

LCD_PD7=1; LCD_PD6=1; LCD_PD5=1; LCD_PD4=1;

зачем она?

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

написал:

//Послать комманду в LCD
void LCDCommand(unsigned char data, unsigned char mode)
{
if(mode){PORTD |=(1<<7);}else{PORTD &=~(1<<7);}//1 - data 0 - command;
 //Строб
 strob_lcd();
if (data & (1<<7)) PORTD |=(1<<6); else PORTD &=~(1<<6);
if (data & (1<<6)) PORTD |=(1<<5); else PORTD &=~(1<<5);
if (data & (1<<5)) PORTB |=(1<<7); else PORTB &=~(1<<7);
if (data & (1<<4)) PORTB |=(1<<6); else PORTB &=~(1<<6);
 //Строб
 strob_lcd();
if (data & (1<<3)) PORTD |=(1<<6); else PORTD &=~(1<<6);
if (data & (1<<2)) PORTD |=(1<<5); else PORTD &=~(1<<5);
if (data & (1<<1)) PORTB |=(1<<7); else PORTB &=~(1<<7);
if (data & (1<<0)) PORTB |=(1<<6); else PORTB &=~(1<<6);
 //Строб
 strob_lcd();
PORTD |=(1<<6); PORTD |=(1<<5);PORTB |=(1<<7);PORTB |=(1<<6);
}
int main( void )
{
// Инициализация LCD
Init();
//Послать команду в LCD
//Команда
LCDCommand(0x00,0);
LCDCommand(0x01,0);
while (1)
 {
 }
}

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

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

ну выразился неправильно. На данный момент понимаю что, сия функция то ли обрабатывает их не правильно (хотя проверял должно быть все верно), то есть если я посылаю 2 команды:

LCDCommand(0b00000000,0);

LCDCommand(0b00000001,0);

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

еще раз сама функция:

//Послать комманду в LCD
void LCDCommand(unsigned char data, unsigned char mode)
{
   if(mode){PORTD |=(1<<7);}else{PORTD &=~(1<<7);}//1 - data 0 - command;
       //Строб
       strob_lcd();
   if (data & (1<<7)) PORTD |=(1<<6); else PORTD &=~(1<<6);
   if (data & (1<<6)) PORTD |=(1<<5); else PORTD &=~(1<<5);
   if (data & (1<<5)) PORTB |=(1<<7); else PORTB &=~(1<<7);
   if (data & (1<<4)) PORTB |=(1<<6); else PORTB &=~(1<<6);
       //Строб
       strob_lcd();
   if (data & (1<<3)) PORTD |=(1<<6); else PORTD &=~(1<<6);
   if (data & (1<<2)) PORTD |=(1<<5); else PORTD &=~(1<<5);
   if (data & (1<<1)) PORTB |=(1<<7); else PORTB &=~(1<<7);
   if (data & (1<<0)) PORTB |=(1<<6); else PORTB &=~(1<<6);
       //Строб
       strob_lcd();
   PORTD |=(1<<6);    PORTD |=(1<<5);PORTB |=(1<<7);PORTB |=(1<<6);
}

подключение

D4 - PB6

D5 - PB7

D6 - PD5

D7 - PD6

RS - PD7

RW - PB0

E - PB1

и например инструкции в скрине

вывести что либо у меня вобще не получилось, помогите найти причину

post-192304-0-46977800-1452183287_thumb.jpg

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

еще раз сама функция:

if (data & (1<<7)) PORTD |=(1<<6); else PORTD &=~(1<<6);

вывести что либо у меня вобще не получилось, помогите найти причину

для начала поставьте во всех проверках фигурные скобки ....

if (data & (1<<7)) {PORTD |=(1<<6);} else { PORTD &=~(1<<6);}

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

проставил:

//Послать комманду в LCD
void LCDCommand(unsigned char data, unsigned char mode)
{
if(mode){PORTD |=(1<<7);}else{PORTD &=~(1<<7);}//1 - data 0 - command;
 //Строб
 strob_lcd();
if (data & (1<<7)) {PORTD |=(1<<6);} else {PORTD &=~(1<<6);}
if (data & (1<<6)) {PORTD |=(1<<5);} else {PORTD &=~(1<<5);}
if (data & (1<<5)) {PORTB |=(1<<7);} else {PORTB &=~(1<<7);}
if (data & (1<<4)) {PORTB |=(1<<6);} else {PORTB &=~(1<<6);}
 //Строб
 strob_lcd();
if (data & (1<<3)) {PORTD |=(1<<6);} else {PORTD &=~(1<<6);}
if (data & (1<<2)) {PORTD |=(1<<5);} else {PORTD &=~(1<<5);}
if (data & (1<<1)) {PORTB |=(1<<7);} else {PORTB &=~(1<<7);}
if (data & (1<<0)) {PORTB |=(1<<6);} else {PORTB &=~(1<<6);}
 //Строб
 strob_lcd();
PORTD &=~(1<<6); PORTD &=~(1<<5);PORTB &=~(1<<7);PORTB &=~(1<<6);
}

посылаю команду:

LCDCommand(0b00001110,0);

результата 0

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

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

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

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

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

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

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

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

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

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

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

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