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

Помогите! Atmega16 И Lcd !


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

Здравствуйте! Хочу сделать бегущую стоку на МК Atmega16 http://www.myrobot.ru/downloads/datasheets/atmega16.pdf ( или М8) , но почему-то ничего не получается, мучаюсь уже месяц, но никаких результатов : ( . Жк у меня WH1602B-YGH-CTK (http://www.promelec.ru/pdf/wh1602b.pdf ) прошиваю МК на отладочной плате AVR-EASY , в СVAVR, уже перепробовал все варианты, перекопал массу информации но все безуспешно, фьюзы я не трогал, стоят заводские установки… хочу сделать просто без AVR-EASY.., т.е просто попробую проводками соединить ЖК и входы МК ( соответственно подведу питание и на ЖК я уже установил подстроечный резистор… 1,2,3 контакты по ДШ).

Интересует меня самое главное на какой именно порт выводить, и не надо ли при этом фьюзы выставлять, исходник есть даже 2, они в принципе простые, но работали у людей 100%.

КТО МОЖЕТ ОБЬЯСНИТЬ НА ПАЛЬЦАХ,ИЛИ НАРИСОВАТЬ КАКИЕ ВЫХОДЫ МК НУЖНО СОЕДИНИТЬ СО ВХОДАМИ В ЖК!.

По моим расчётам все выглядит вот так , ножки МК и ЖК нужно соединить такой последовательности (подкл к прту С)???

МК-ЖК

22-4

23-5

24-6

26-11

27-12

28-13

29-1

ну и питание, подсветку, контрастность ( резистор) то само собой... : )

Проверьте плз:)

Спасибо!

post-109440-1265910328,97_thumb.jpg

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

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

  • Ответов 100
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

все правильно только 29 нога идет к 14 а не к 1

если незаработает попробуй на 3-ую ногу жк подавать отрицательное напряжение,

некоторые жк без этого ничего не показывают :rolleyes:

чуть незабыл :o , обязательно надо отключить JTAG (есть фьюз отвечаюший за это, называеться JTAGEN) без этого половина порта С небудет работать,,

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

1 километр = 1024 метр

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

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

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

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

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

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

ну это смотря какой исходник. если пишешь в cvavr то там в визарде задаешь порт, к которому подключен жк. и там же, в визарде, при выборе порта - будет дана таблица соответстви ножек мк и жк дисплея.

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

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

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

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

...да да я там не дописал похоже четвёрочку ))))... 29-14 ! пишу в CVAVR ..., завтра папробую задать частоту 8Мгц и выставить ДЖТАГ в фьюзах! что получится отпишу сюда обязательно :) Спасибо за советы!

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

Здравствуйте! Сегодня всё сделал как все мне советовали.., передавал через М16 через порт С, в фьюзах выставил частоту 8Мгц и отключит Jtagen для работы с С портом…. : ) и ..О! Чудо! ВСЕ ПОЛУЧИЛОСЬ!!!! ))))) БОЛЬШОЕ СПАСИБО тем кто откликнулся на пою помощь и отписал в этой теме : ) , а так же хочу выразить огромную благодарность таким лицам как: Goodefine и wowa, также зарегистрированным на форуме : )!.

Фото моего ЧУДО-УСТРОЙСВА выложу попозже .., т.к. не могу скинуть фотки с цифровика, (нет драйвера) )))).

Скрин моих фьюзов прилагается! ( может Каму-то ещё поможет) … у меня стоит СVAVR 1.25…

Программа просто выводит на ЖК символы …(исходник от wowa!):

#include <mega16.h>

#asm

.equ __lcd_port=0x15 ;PORTC

#endasm

#include <lcd.h>

#include<stdio.h>

char lcd_buffer[33];

unsigned long int x = 10000000;

void main(void)

{

lcd_init(16);

sprintf(lcd_buffer,"%lu",x);

lcd_puts(lcd_buffer);

lcd_gotoxy(0, 1);

lcd_putchar('W');

lcd_putchar('O');

lcd_putchar('R');

lcd_putchar('K');

lcd_putchar(' ');

lcd_putchar('I');

lcd_putchar('T');

lcd_putchar(' ');

lcd_putchar(':');

lcd_putchar(')');

}

но так как решил сделать «БЕГУЩУЮ СТРОКУ», то прошу опять же откликнуться тех кто может мне помочь ИСХОДНИКАМИ,… интересуют различные виды бегущих сток., скорость, разные символы,задержки и т.д.….. : )

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

рациональнее всего работать с памятью lcd, тоесть стандарнтыми коммандами(lcd_putchar, lcd_putsf) посылаешь строчку на дисплей. а сдвиг производить по коммандам lcd_read_byte , lcd_write_byte.

алгоритм прост: читаем первый символ, читаем второй символ. на место второго символа пишем первый, читаем третий символ, на место третьего пишем второй. и т.д. на место последнего пишем предпоследний, на место первого последний. от этого цикла надпись сдвигается на 1 позицию вправо. делаешь паузу и повторяешь сначала нужное число раз. ну как то так. получается, что мы можем двигать любую строчку - и на это нам необходимо всего 2 переменных. алгоритм я дал. код я думаю сам

напишешь.

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

При количестве 16х2 букв - проще написать однотипную функцию для вывода ЦЕЛОГО буфера в дисплей - так как дисплей это самое медленное устройство (причём без возможности чтения - подключен по схеме в CVAVR) и уже потом производить операции с буфером и выводить его одним махом или в прерывании.

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

Руссификация на эти дисплеях - условная. Нужно использовать частично латину, частчно - др. символы.

Я составлял табличку из кодов символов и того что пишется на дисплее.

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

Согласен, есть несколько методов подхода. я лишь написал самый рациональный. на звание самого простого он конечно же не претендует. но например как сделать динамически меняюшуюся бегущую строку? ну к примеру обычные часы чч:мм:сс? хотелось бы увидешь ваши километры кода без использования работы напрямую с памятью жк. а с этими коммандами все просто: в основном цикле сдвига заводите дополнительную переменную, которая показывает на сколько надпись смещенна относительно первого знакоместа. зная что время формата "чч:мм:сс" мы знаем все места где необходима замена: тоесть если изменились минуты, то 4+переменная сдвига=записать новое значение. и т.д. для всех сегментов. вообщем если не понятно могу подробнее обьяснить. но думаю нет смысла.

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

Вот выкладываю фото моего устройства как и гаварил выше, исходник программы смотрите также выше в теме!!! :)

post-109440-1266163319,52_thumb.jpg

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

Привет всем... не судите меня плз строго )) я просто неснимательно тему читал и промустил ваш 11 пост.., попробывал как вы советуете и все получилось! :)

#include <mega16.h>

#include <delay.h>

#include <stdio.h>

#asm

.equ __lcd_port=0x15;PORTC

#endasm

#include <lcd.h>

#include <string.h>

char buffer [128];

unsigned char n_sim=0,m_end=69;

void vivod(void){

#pragma rl+

sprintf(buffer, "Компьютерно-интегрированные технологические процессы и производства! ");

#pragma rl+

}

beg_stroka(){

unsigned char i;

if(beg_str){

for(i=0;i<16;i++)lcd_write_byte(0xC0+i,lcd_read_byte(0xC1+i));

beg_str=0;

lcd_gotoxy(15,1);

#pragma rl+

lcd_putchar(buffer[n_sim]);

if(++n_sim>m_end)n_sim=0;

#pragma rl-

}

}

void main(void)

{

lcd_init(16);

while (1)

{

beg_stroka();

vivod();

delay_ms(300);

beg_str=1;

};

}

программа работает отлично выводит бегущую стоку на нижней строчке...., во только при первом включении выводится строка с непонятным символом в начале #|Компьютерно........... - примерно так, после первого цикла строчки тот символ пропадает и все становится на свои места!

и ещё вапросик... скажите плз а пожно выводить сразуже 2 бег стоки ??? т..е на 1 и 2 сточке ? и как это реализовать?

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

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

во только при первом включении выводится строка с непонятным символом в начале #|Компьютерно........... - примерно так

После инициализации,или перед выводом попробуйте,

lcd_clear()

можно,хоть на четыре строки выводить,если LCD четырехстрочный.

рациональнее всего работать с памятью lcd, тоесть стандарнтыми коммандами(lcd_putchar, lcd_putsf) посылаешь строчку на дисплей. а сдвиг производить по коммандам lcd_read_byte , lcd_write_byte.

алгоритм прост: читаем первый символ, читаем второй символ. на место второго символа пишем первый, читаем третий символ, на место третьего пишем второй. и т.д. на место последнего пишем предпоследний, на место первого последний. от этого цикла надпись сдвигается на 1 позицию вправо. делаешь паузу и повторяешь сначала нужное число раз. ну как то так. получается, что мы можем двигать любую строчку - и на это нам необходимо всего 2 переменных. алгоритм я дал. код я думаю сам

напишешь.

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

to evgesha53 - да нет, вся проблема не в том, чтобы очистить экран.

to Lexey - повторяюсь: напиши на листочке бумаги алгоритм своей программы и вы поймете, что там ерунда полная. Посто вы все что вам советовали накидали в одну кучу, а разобраться с тем, что накидали - забыли.

ЗЫ: to Lexey: Что именно вы хотите получить за девайс? Или просто интересуетесь в целях изучения Си? Если второе, то тупо будет давать Вам рабочий код, будет намного интереснее для Вас и познавательнее, если это Вы сделаете сами. Ну а если тупо сделать 1 устройство и забить на мк - то могу, впринципе, помочь. Ибо эта программа пишется за 20 мин при желании...

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

)) ну работает же исходник :) выводит же строку бегущую...., просто вот я не пойму

char buffer [128];

unsigned char n_sim=0,m_end=69;

void vivod(void){

#pragma rl+

sprintf(buffer, "Компьютерно-интегрированные технологические процессы и производства! ");

ето вот например запись в буфер строку... ( типо СКОПИРОВАЛИ ).

beg_stroka(){

unsigned char i;

if(beg_str){

for(i=0;i<16;i++)lcd_write_byte(0xC0+i,lcd_read_byte(0xC1+i));

beg_str=0;

lcd_gotoxy(15,1);

вывод строки в крайнюю правую позицию и сдвиг на 1 символ влево.....

вот только я не пойму как сделать 2ю бегущюю стоку, если при копировании её в буфер стирается 1я....

p.s.... непанимаю... обьясните на пальцах... или в данном исходнике нельзя реализовать 2ю Б/С.. ? :)

.... готового исходника ненужно :) хочу сам разобраться поэксперементировать...

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

тогда даю подсказку: посмотрите синтаксис комманды lcd_readbyte и lcd_writebyte. Просто, чтобы обратиться ко второй строке нужно к адресу прибавить 0х40, если я не ошибаюсь.

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

верхняя строка 0x80 до 0x90,

нижняя строка +0x40 тоесть от 0xC0 до 0xD0

попробуй написать программу сам, не бери тех кусков которые были в статье(ссылку на которую удалили ;) видимо не сочли её полезной).

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

... ну я в программировании не очень ужжж и силён :)... буду пробывать программировать с вашей помощью по 1й строчки.. потихонечку...:)

#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#asm
.equ __lcd_port=0x15;PORTC
#endasm
#include <lcd.h>
#include <string.h>

начинаем с этого... ( неизменяем с прошлого исх)....

char buffer [128];

уже с этого начинаются проблемы..... я так понимаю это мы отводим сколько памяти будет выделено на массив в МКонтроллере.... (т.е. ....64,128,256 .....)

unsigned char n_sim=0,m_end=69;

воопще непонятно.... понял что "m_end=69"- количество символов в моей строчке... с пробелами и т.д...)

void vivod(void){
sprintf(buffer, "Компьютерно-интегрированные технологические процессы и производства! "); 
} 

я так понимаю буферизация массива..., т.е. вся мая строчка попадает в озу мк....

p.s. поход ничего што я написал- неправильно )))))))))..... помогите разобраться плз..., или угостите ссылкой где это все описано :)

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

Ну для начала давайте определимся какую строчку будем двигать. предлагаю двигать строчку не длиннее 16 символов.

так как строка у нас не длиннее 16 символов ==> она вся помещается на дисплей. Вот алгоритм программы:

1. Выводим данные на дисплей

2. Двигаем строку

Тут получается, что сначала данные нужно вывести. Тот кусок кода, который вы привели (sprintf) отвечает за то, чтобы забить всю строчку(Компьютерно...) массив buffer. Давайте сейчас оставим этот кусок кода, который требует значительно больше слов кода, на что-нибудь попроще:

Создаем функцию vivod;

void vivod(void) {
lcd_clear();
lcd_gotoxy(0,0);
#pragma lr+
lcd_putsf("Строка №1");
lcd_gotoxy(0,1);
lcd_putsf("Строка №2");
#pragma lr-
}

Эта функция элементарна: очищает дисплей и выводит на 2 строках информацию.

Как я писал выше её(ф-цию) необходимо вызвать всего лишь 1 раз. Другими словами вызываем её до цикла while(1) { };

Теперь нам необходимо работать непосредственно с памятью lcd

Адреса я указал выше ==> Набросам алгоритм:

k=0;

пока k<15 выполняем {

берем символ со знакоместа(k) и запоминаем в переменной 1;

берем символ со знакоместа(k+1) и запоминаем в переменной 2;

пишем на знакоместо (k+1) значение из переменной 1;

пишем на знакоместо (k) значение переменной 2;

инкрементируем k

}

Все. Теперь оформляем это дело в функцию:

void sdvig(void) 
{
char k,p1,p2;
k=0;
while (k<15) {
p1=lcd_read_byte(0x80+k);
p2=lcd_read_byte(0x81+k);
lcd_write_byte(0x81+k,p1);
lcd_write_byte(0x80+k,p2); 
k++;
};
};

Комментарии писать бессмысленно ;)

Теперь при вызове этой функции 1 раз - вся 1 строка уедет влево на 1 символ.

Не будем заниматься оптимизацией, а продубриуем это и для второй строки:

void sdvig2(void) 
{
char k,p1,p2;
k=0;
while (k<15) {
p1=lcd_read_byte(0xС0+k);
p2=lcd_read_byte(0xС1+k);
lcd_write_byte(0xС1+k,p1);
lcd_write_byte(0xС0+k,p2); 
k++;
};
};

Тоесть так же двигаем вторую строчку.

у нас есть уже всё, что необходимо:

ф-ции vivod,sdvig,sdvig2;

пишем программу:

vivod();
while (1)
     {
     // Place your code here
sdvig();
sdvig2();
delay_ms(200); //Пауза. Скорость сдвига.
     };

Думаю с алгоритмом сдвига вправо разберетесь сами. Мой пример двигает 2 строки влево.

Данный код двигает 2 строки по 16 символов. если текст длиннее, то необходимо двигать ваш массив buffer,а затем выводить первые 16 символов из него. Алгоритм остается тот же. только необходимо добавить вывод вассива. Разберитесь сначала с этим, а там если необходимо покажу как вывести длинную строку.

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

...ок! Спасибо большое за помощь и такую подробную инструкцию :)...

С функцией

void vivod(void) {
lcd_clear();
lcd_gotoxy(0,0);
#pragma lr+
lcd_putsf("Строка №1");
lcd_gotoxy(0,1);
lcd_putsf("Строка №2");
#pragma lr-
}

и циклом

vivod();
while (1)
     {
sdvig();
sdvig2();
delay_ms(200); //Пауза. Скорость сдвига.
     };

всё понятно!!!...

НО вот с функцией SDVIG чёт не очень... во первых интересует адреса 0x80,0x81 и 0x80+k,0x81+k непойму какой именно символ читается\записывается под этим адресом..

т.е. скажите- 0x80или 0x81 это адресс символа который записал в первой строчке, в первом символе.., или наоборот в 1й строчке, 15 символ.. т.е. (0,15) ..

вот мне именно с этим нужно разобраться., а так вроде алгоритм и код в целом понятен .

1) читается символ (0,15) записывается (0,14);

2) (0,14)->(0,13) (0,15)->(0,14);

3) (0,13)->(0,12) (0,14)->(0,13) (0,15)->(0,14);

4) (0,12)->(0,11) (0,13)->(0,12) (0,14)->(0,13) (0,15)->(0,14);

.........

.......

........

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

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

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

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

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

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

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

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

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

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

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

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