Свежие обсуждения
Микроконтроллеры

Цифровой термометр на МК и LCD nokia 3310

1 9 17

Так-с, нашел про макросы в книге Программирование на языке СИ для AVR и PIC микроконтроллеров. Только я считаю там скупо написано. Поэтому если можно, то поподробней о макросах.
И еще, команды LCD взяты из даташита на контроллер PCD8544?

 

Еще просьба. АНТОХА, распиши пожалуйста алгоритм работы с ЖК, инициализацию. Просто словами. А я попробую реализовать и выложу на проверку . Так будет интересней и для меня понятней. Что за чем надо делать.
Команды LCD я действительно нашел в даташите. С этим пока определился, где и что искать. Макросы у тебя были приложены. Но я все равно еще не очень разобрался с ними.
А вот по даташиту уже запарился со словарем лазать, ибо в школе учил немецкий. Даже читать по англ не могу Поэтому и трудности с алгоритмом.
Заранее благодарен тем кто не ленится со мной возится

 

serg_svd: Действительно удобней и понятней.

Дело не только в этом. У меня эти макросы есть для всех микропроцессоров, с которыми я работаю. То есть, не приходится каждый раз вспоминать названия портов и механизмы их настройки.

serg_svd: если можно, то поподробней о макросах.

А чего там подробнее-то?
Перед компилятором текст программы обрабатывается препроцессором. Он ищет в тексте макроопределения, типа

#define DELAY_VALUE 10

и потом везде, где встретит слово DELAY_VALUE, вместо него вставляет 10. Вот и всё.
Ну вернее, есть там ещё всякая ботва, типа параметров и проч., но это для начала не нужно наверное.

serg_svd: команды LCD взяты из даташита на контроллер PCD8544

Да, конечно.

 

Так я же там специально всё построчно комментировал:

// инициализация ЖКИ

void nokia_init(void)
{
	// сначала инициализируем ножки
	on(NOKIA_SCK);
	on(NOKIA_RESET);
	direct(NOKIA_SCK, O);
	direct(NOKIA_RESET, O);
	direct(NOKIA_DOUT, O);
	direct(NOKIA_D_C, O);

	// Сброс ЖКИ
	off(NOKIA_RESET);
	asm volatile ("nop"); asm volatile ("nop");
	asm volatile ("nop"); asm volatile ("nop");
	on(NOKIA_RESET);

	// Включаем расширенный набор команд
	nokia_cmd(GLCD_FUNCTIONSETEXT);
	// Задаём температурный коэффициент
	nokia_cmd(GLCD_TEMPCOEF);
	// Задаём режим мультиплексирования 1:48
	nokia_cmd(GLCD_SET_BIAS | GLCD_BIAS_1_48);
	// Контраст (заодно отключает расширенный набор команд)
	nokia_set_contrast(120);
	// выключим инверсию.
	nokia_set_inverse(FALSE);
}

Что конкретно здесь неясно?

 

AHTOXA: Что конкретно здесь неясно?
Ну если разберусь, то станет понятней ;).
перед инициализацией ЖК надо запускать таймер и прерывания?

 

serg_svd: Ну если разберусь, то станет понятней ;).

Ну хорошо, давай по пунктам

1. Настроить ножки процессора, которые используются для обмена с ЖКИ:
on(NOKIA_SCK); // SCK должен быть единицей
direct(NOKIA_SCK, O); // переключаем на выход

с остальными ногами то же самое.

2. Сброс ЖКИ.
Переводим линию сброса (NOKIA_RESET) в 0,
ждём немного (для этого вставлены 4 nop-а):
asm volatile ("nop"); // так в Си можно вставлять ассемблер
Возвращаем линию сброса (NOKIA_RESET) в 1.

3. Теперь выдаём команды для контроллера ЖКИ.

3.1. nokia_cmd(GLCD_FUNCTIONSETEXT); // Включаем расширенный набор команд
Это надо для того, чтобы можно было отправить следующие команды. Без этого они не будут восприняты. Это как защита, чтобы случайно не отправить эти команды.

3.2. nokia_cmd(GLCD_TEMPCOEF); //Задаём температурный коэффициент
Это число, в зависимости от которого контроллер подстраивает контрастность при изменении температуры окружающей среды. Потому что на морозе нужна бОльшая контрастность.

3.3. nokia_cmd(GLCD_SET_BIAS | GLCD_BIAS_1_48); // Задаём режим мультиплексирования 1:48
Это мы просто сообщаем контроллеру, какая конфигурация ЖКИ к нему подключена.

3.4. nokia_set_contrast(120); // контраст
// задаём контрастность. Число надо подбирать под конкретный дисплей.
// в этой подпрограмме заодно выключается расширенный набор команд, он нам больше не нужен.

3.5. nokia_set_inverse(FALSE); // собственно включаем дисплей (без инверсии).

Вот и всё.

serg_svd: перед инициализацией ЖК надо запускать таймер и прерывания?

Нет, не надо. У меня задержка при сбросе была сначала сделана на таймерной задержке, потом заменил на nop-ы.

 

ОК. Спасибо.
А что означает мультиплексирование? И почему из всех значений выбрано именно 1/48?

И еще просьба, если уж начинаю учится по твоему примеру с макросами, то выложи пожалуйста имеющиеся у тебя.

AHTOXA: Нет, не надо. У меня задержка при сбросе была сначала сделана на таймерной задержке, потом заменил на nop-ы.
Т.е я так понял, что для работы прерывания не понвдобятся? И отсчет времени?

 

serg_svd: А что означает мультиплексирование?

Ну, упрощённо: Точки на дисплее организованы по строчкам и столбцам. Чтобы зажечь точку с координатами X, Y, надо подать 1 на вывод строки X и столбца Y. Но так получается слишком много ножек надо, поэтому группируют строчки/столбцы по несколько штук и зажигают по очереди. Вот это и называется мультиплексирование.

serg_svd: почему из всех значений выбрано именно 1/48?

Потому что у этого дисплея такое мультиплексирование Контроллер-то рассчитан на работу с разными дисплеями, вот и приходится указывать.

serg_svd: выложи пожалуйста имеющиеся у тебя.

Не понял, что выложить? Я же там приложил файл macros.h.

serg_svd: Т.е я так понял, что для работы прерывания не понвдобятся? И отсчет времени?

Да, таймер можно выкинуть.

 

AHTOXA: Не понял, что выложить? Я же там приложил файл macros.h.
ну это же только для МК tiny2313 или для всех МК ?

 

serg_svd: ну это же только для МК tiny2313 или для всех МК ?

Это для всех АВРок. Есть ещё для MSP-430, для Fujitsu MB90, для MSC51. Какие надо?