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

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


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

Вам, конечно, нужно немного разбираться в том, что накачали из Интернета.

Вот, к примеру, почему в LCDCommand() у Вас три раза запускается strob_lcd?

А сколько раз правильно?

И что ваще этот строб делает?

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

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

Е порт "дергает". Так я понял как раз из документации, переписал так:

//Послать комманду в LCD

void LCDCommand(unsigned char data, unsigned char mode)
{
if(mode){PORTD |=(1<<7);}else{PORTD &=~(1<<7);}//1 - data 0 - command;

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();
}

вроде начало принимать команды, но все же после выставления порта RS надо ли дергать порт E или нет?

команды на которые хватило знаний....

LCDCommand(0b00000011,0);

LCDCommand(0b00001111,0);

первая перемещает курсор в позицию 1строка 1символ

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

отрабатывают.

с передачей данных или символа пока не разобрался

и так и не понял для чего эта строка?

PORTD &=~(1<<6); PORTD &=~(1<<5);PORTB &=~(1<<7);PORTB &=~(1<<6);

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

Yurkin2015, я пишу с нуля, некоторые функции смотрю как реализованы конечно из скачанного, пишу с нуля для того чтобы разобраться с работой портов и самим дисплеем ибо в программировании для МК я практически 0

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

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

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

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

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

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

вот это выводит, ну это так наугад...

    LCDCommand(0b00000010,0); //Перевод в первую позицию
   LCDCommand(0b00001111,0); //Мигающий курсор
   LCDCommand(0b00110100,1); //Вывод символа 4
   LCDCommand(0b00110101,1); //Вывод символа 5
   LCDCommand(0b00110110,1); //Вывод символа 6
   LCDCommand(0b00110111,1); //Вывод символа 7
   LCDCommand(0b00111101,1); //Вывод символа =

может кто подскажет как вывести строку или переменную?

что то в скачанных разобраться тяжело, функция в функции и т.д. и + дефайны...

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

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

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

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

Вот теперь правильно. Выставили на ногах D4-D7, RS и R/W нужные значения - дёрнули порт Е вверх-вниз для записи старшего полубайта. Потом выставили новые D4-D7, дёрнули второй раз - записали младшую половину байта. И всё, больше ничего с портами делать не надо. До следующей записи.

Это я про LCDCommand().

Для вывода букв-цифр поставьте букву в кавычки

LCDCommand('H',1);
LCDCommand('e',1);
LCDCommand('l',1);
LCDCommand('l',1);
LCDCommand('o',1);
LCDCommand('!',1);

получите "Hello!" на экране

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

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

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

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

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

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

void print_str(char *str)
{
 uint8_t data;
 while (*str)
  {
   data =  *str++;
   LCDCommand(data,1);
  }
}

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

voltage = ((unsigned long)voltage * 3101)/1023;

Обясните зачем (unsigned long) перед voltage. Что он делает?

Потому что, результат умножения в большинстве случаев выйдет за пределы "unsigned int". Результат операций имеет тот же тип, что и операнд с "наибольшим" типом . Для этого одному из операндов нужно присвоить другой тип. Т.е. переменной voltage перед умножением присваивается тип "unsigned long"

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

Есть ли какой разделитель что ли переменных в С++ (не могу найти) есть константы:

//КНОПКИ
#define P_B1 PORTC
#define D_P_B1 DDRC
#define B1 4
#define PIN_B1 PINC

Как правильно правильно написать чтобы получилось:

if (!(PINC & (1<<PINC4)))

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

типо:

if(!PIN_B1&(1<<PIN_B1+B1))
{
 LCD_FLAG=1;
}

но так не работает

IMXO, нет вы не много не поняли, как написать константами PINC4, так не правильно: PIN_B1+B1, а как правильно найти не могу

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

вообще пишется

(1< < PC4)

а не

(1< < PINC4)

может поэтому и не работает? хотя слышал что сейчас можно и в PIN записывать

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

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

типо:

if(!PIN_B1&(1<<PIN_B1+B1))
{
LCD_FLAG=1;
}

но так не работает

IMXO, нет вы не много не поняли, как написать константами PINC4, так не правильно: PIN_B1+B1, а как правильно найти не могу

if(!(PIN_B1&(1<<B1)))
{
LCD_FLAG=1;
}

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

Наверное, кто-то не заглядывал в соответствующие заголовки и не знает, что PINC4 = PC4 = PORTC4 = DDRC4 = PORTA4 = PINF4 = 4.

Так что запись (PINC & (1<<PINC4)) и (PINC & (1<<4)) абсолютно одинаковы (мне, кстати, второй способ больше нравится).

Ну и добавлю небольшой фокус с препроцессором. Просто так, мозг кому-нибудь поломать.

#define MY_PORT B
#define MY_PIN 4

#define _PORT(x) PORT##x
#define _DDR(x)  DDR##x
#define _PIN(x) PIN##x
#define PORT(x) _PORT(x)
#define DDR(x) _DDR(x)
#define PIN(x) PIN##x
...
DDR(MY_PORT) &=~ (1<<MY_PIN);	 // DDRB4 = 0
PORT(MY_PORT) |= (1<<MY_PIN);	 // PORTB4 = 1
if( PIN(MY_PORT) & (1<<MY_PIN) ){   // if( PINB4 == 1)
 //code
}

То есть можно объявить не сам порт, а только его букву. Это удобно, если надо перевесить что-то с одного порта на другой, поменять надо будет всего 2 макроса, а не 4, и уж тем более не лазить по всему коду.

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

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

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

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

как узнать что переменная есть и мы ее получили из памяти?

H_SET = eeprom_read_byte(&H_SET_EEMEM)

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

пустоты в переменной не может быть по определению ее диапазон 0х00-0xFF

по дефолту в ячейки памяти записано 0xFF

а проверить правильность записи вы множите проверив регистор состояния записи + прочитав переменную сравнив с записываемой

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

да это один раз при включении происходит, как эффективнее я увы не знаю, не с проста же пишу на форуме....

да и так не работает говорит не декларированная переменная FF

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

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

да и так не работает говорит не декларированная переменная FF

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • Нарушена технология изготовления сердечника. Потише сделать можно только продав его другому радиодиобителю. Когда трансформатор окажется у него, вам его уже не будет слышно. 
    • https://benzpro.ru/forum/threads/tv-lg-lw575s-с-платами-eax64405501-0-eax64294002-1-шасси-ld12c-самопроизвольная-перезагрузка-если-телевизор-подключен-в-интернет.6266/
    • Совсем не по этой причине.  На то они и китайцы  Я говорил лишь за габаритный размер, а про это я вообще молчу.  Хотя если честные китайцы, то последнее время качество продукции довольно хорошее, и не только в радиоэлектронике.  
    • Занимаюсь машинами, мотоциклами, компьютерами. Машины и разбираю и собираю и дорабатываю, компы сейчас собираю на продажу, так же с доработками, раз вот пришла с алишки материнка с перебитыми дорожками от проца к оперативке, успешно ее починил, впаял жилки проводов, удалил лишний припой, залил место ремонта краской, высушил, протестировал, все гуд. Биосы редактировал, настраивал частоты, скорости кулеров на видеокартах для оптимальной работы. Усилитель Aiyima разобрал, там были ошметки припоя примерно по 0.5 - 1 мм, все протер спиртом, почистил, чипы 3116 были дико залиты термопастой, также почистил, нанес хорошую термуху, поставил радиатор обратно. А так кусочек припоя мог попасть куда нибудь и закоротить. Блок питания от него также разобрал, внутри был писец какой ржавый винт, заменил его, также транзиторы были без термопасты, открутил радиаторы и нанес ее. В общем не зря полез, устранил много косяков. https://iimg.su/s/01/yiKzMUcLJSNRkv3wqZui3olXTPwYMm5JrWU4gnwp.jpg https://iimg.su/s/01/cJZE90gNFw5CcLWHQKHSJrMwBWoFgsaahhisxQQD.jpg https://iimg.su/s/01/PAEBzQONtbnrGelcv0ZhovZw6pkTaDiepfytmRrD.jpg https://iimg.su/i/lfYHZ Сильное шипение в колонки, не зависит от уровня громкости, с двумя блоками питания одинаковое.  В Brzhifi кроме шипения есть еще какое то посвистывание. До этих усилков пользовался акустикой AVE - C160, там тоже присутствует шипение, но оно еле заметно, и на слух не давит. А тут если сидишь за компом, то по ушам бьет это ш-ш-ш-ш-ш. Если удастся его хоть чуть понизить, уже будет хорошо.
    • Где вы купили радиаторы, которые в коробочке сверху..?
    • Почему ? Ну дороговат, да.  Китайцы клепают как хотят. Покрытие может попасться такое, что еле паяется даже кислотой.
    • Можно его питать пониженным напряжением. Взять ещё один небольшой трансформатор 230 В со вторичкой вольт на 15-30. Первичку в сеть, а вторичку подключить к сети так, чтобы напряжение вычиталось. Это напряжение подать на имеющийся тороид.  Этот дополнительный трансформатор достаточно взять ватт на 20.
  • Похожий контент

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