реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> ATTINY2313 и ЖКИ 16х2, Есть ли возможность отключить пин RW в библиотеке CVAVR
aerobus
сообщение Jan 18 2013, 10:58
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 19-05-06
Пользователь №: 17 256



Уважаемое сообщество гуру.
Прошу помочь разобраться.
Собсно проблемка.
Взял ЛСД с кнопочками в виде шиелда к дуньке.
А у него пин RW запаян на землю, то бишь чтение из ЛСД запрещено.
Устройство у меня довольно простенькое, посему Тиньки вполне достаточно.
Програмлю в CVAVR.
Родная библиотека компилятора умеет работать с ЛСД только с использованием пина ДСД RW.
Отсюда вопрос можно ли както "объяснить" библиотечке чтоб не использовать пин RW? Или его отрезать от "земли" прийдется.

Токо не кидайте сразу помидорами. В данном вопросе не больно силен.

Go to the top of the page
 
+Quote Post
Mareng
сообщение Jan 18 2013, 11:09
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487



Прикрути свою библиотеку, благо этого добра в инете достаточно, да и заново написать недолго.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 18 2013, 11:15
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(aerobus @ Jan 18 2013, 14:58) *
Отсюда вопрос можно ли както "объяснить" библиотечке чтоб не использовать пин RW?
Библиотека в исходниках?
Если да, то дело нехитрое.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
aerobus
сообщение Jan 18 2013, 12:18
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 19-05-06
Пользователь №: 17 256



Цитата(demiurg_spb @ Jan 18 2013, 15:15) *
Библиотека в исходниках?
Если да, то дело нехитрое.

Ну собсно вот библиотека.
Я правда в ней перевесил пин Enable на PB3, чтоб не запускать еще один таймер (мне в устройстве надо два канала ШИМ, вот я на один таймер их и повесил)
Зеленым я пометил то что поменял, красным то что мне мешает.
В Ассемблере вообще не силен, тем паче в МКшном.
Помогите ежели не сложно. Или ткните носом в подходящую библиотеку.

С уважением.
CODE
/* LCD driver routines

CodeVisionAVR C Compiler
© 1998-2008 Pavel Haiduc, HP InfoTech S.R.L.
*/

#asm
.equ __lcd_direction=__lcd_port-1
.equ __lcd_pin=__lcd_port-2
.equ __lcd_rs=0
.equ __lcd_rd=1
.equ __lcd_enable=3
.equ __lcd_busy_flag=7
#endasm

#pragma used+
static unsigned char _base_y[4]={0x80,0xc0};
unsigned char _lcd_x,_lcd_y,_lcd_maxx;
#pragma used-

static void _lcd_delay(void)
{
#asm
ldi r31,15
__lcd_delay0:
dec r31
brne __lcd_delay0
#endasm
}

void _lcd_ready(void)
{
#asm
in r26,__lcd_direction
andi r26,0xf ;set as input
out __lcd_direction,r26
sbi __lcd_port,__lcd_rd ;RD=1
cbi __lcd_port,__lcd_rs ;RS=0
__lcd_busy:
#endasm
_lcd_delay();
#asm
sbi __lcd_port,__lcd_enable;EN=1
#endasm
_lcd_delay();
#asm
in r26,__lcd_pin
cbi __lcd_port,__lcd_enable;EN=0
#endasm
_lcd_delay();
#asm
sbi __lcd_port,__lcd_enable;EN=1
#endasm
_lcd_delay();
#asm
cbi __lcd_port,__lcd_enable;EN=0
sbrc r26,__lcd_busy_flag
rjmp __lcd_busy
#endasm
}

static void _lcd_write_nibble(void)
{
#asm
andi r26,0xf0
or r26,r27
out __lcd_port,r26 ;write
sbi __lcd_port,__lcd_enable;EN=1
#endasm
_lcd_delay();
#asm
cbi __lcd_port,__lcd_enable;EN=0
#endasm
_lcd_delay();
}

void _lcd_write_data(unsigned char data)
{
#asm
cbi __lcd_port,__lcd_rd ;RD=0
in r26,__lcd_direction
ori r26,0xf0 | (1<<__lcd_rs) | (1<<__lcd_rd) | (1<<__lcd_enable);set as output
out __lcd_direction,r26
in r27,__lcd_port
andi r27,0xf
ld r26,y
#endasm
_lcd_write_nibble(); //RD=0, write MSN
#asm
ld r26,y
swap r26
#endasm
_lcd_write_nibble(); //write LSN
#asm
sbi __lcd_port,__lcd_rd ;RD=1
#endasm
}

/* write a byte to the LCD character generator or display RAM */
void lcd_write_byte(unsigned char addr, unsigned char data)
{
_lcd_ready();
_lcd_write_data(addr);
_lcd_ready();
#asm
sbi __lcd_port,__lcd_rs ;RS=1
#endasm
_lcd_write_data(data);
}

static void _lcd_read_nibble(void)
{
#asm
sbi __lcd_port,__lcd_enable;EN=1
#endasm
_lcd_delay();
#asm
in r30,__lcd_pin ;read
cbi __lcd_port,__lcd_enable;EN=0
#endasm
_lcd_delay();
#asm
andi r30,0xf0
#endasm
}

static unsigned char lcd_read_byte0(void)
{
_lcd_delay();
_lcd_read_nibble(); // read MSN
#asm
mov r26,r30
#endasm
_lcd_read_nibble(); // read LSN
#asm
cbi __lcd_port,__lcd_rd ;RD=0
swap r30
or r30,r26
#endasm
}

/* read a byte from the LCD character generator or display RAM */
unsigned char lcd_read_byte(unsigned char addr)
{
_lcd_ready();
_lcd_write_data(addr);
_lcd_ready();
#asm
in r26,__lcd_direction
andi r26,0xf ;set as input
out __lcd_direction,r26
sbi __lcd_port,__lcd_rs ;RS=1
#endasm
return lcd_read_byte0();
}

/* set the LCD display position x=0..39 y=0..3 */
void lcd_gotoxy(unsigned char x, unsigned char y)
{
_lcd_ready(); // RS=0
_lcd_write_data(_base_y[y]+x);
_lcd_x=x;
_lcd_y=y;
}

// clear the LCD
void lcd_clear(void)
{
_lcd_ready(); // RS=0
_lcd_write_data(2); // cursor home
_lcd_ready();
_lcd_write_data(0xc); // cursor off
_lcd_ready();
_lcd_write_data(1); // clear
_lcd_x=_lcd_y=0;
}

void lcd_putchar(char c)
{
#asm
push r30
push r31
ld r26,y
set
cpi r26,10
breq __lcd_putchar1
clt
#endasm
if (_lcd_x>=_lcd_maxx)
{
#asm("__lcd_putchar1:")
++_lcd_y;
lcd_gotoxy(0,_lcd_y);
#asm("brts __lcd_putchar0")
};
++_lcd_x;
#asm
rcall __lcd_ready
sbi __lcd_port,__lcd_rs;RS=1
ld r26,y
st -y,r26
rcall __lcd_write_data
__lcd_putchar0:
pop r31
pop r30
#endasm
}

// write the string str located in SRAM to the LCD
void lcd_puts(char *str)
{
char k;
while (k=*str++) lcd_putchar(k);
}

// write the string str located in FLASH to the LCD
void lcd_putsf(char flash *str)
{
char k;
while (k=*str++) lcd_putchar(k);
}

static void _long_delay(void)
{
#asm
clr r26
clr r27
__long_delay0:
sbiw r26,1 ;2 cycles
brne __long_delay0;2 cycles
#endasm
}

static void _lcd_init_write(unsigned char data)
{
#asm
cbi __lcd_port,__lcd_rd ;RD=0
in r26,__lcd_direction
ori r26,0xf7 ;set as output
out __lcd_direction,r26
in r27,__lcd_port
andi r27,0xf
ld r26,y
#endasm
_lcd_write_nibble(); //RD=0, write MSN
#asm
sbi __lcd_port,__lcd_rd ;RD=1
#endasm
}

// initialize the LCD controller
unsigned char lcd_init(unsigned char lcd_columns)
{
#asm
cbi __lcd_port,__lcd_enable;EN=0
cbi __lcd_port,__lcd_rs ;RS=0
#endasm
_lcd_maxx=lcd_columns;
_base_y[2]=lcd_columns+0x80;
_base_y[3]=lcd_columns+0xc0;
_long_delay();
_lcd_init_write(0x30);
_long_delay();
_lcd_init_write(0x30);
_long_delay();
_lcd_init_write(0x30);
_long_delay();
_lcd_init_write(0x20);
_long_delay();
_lcd_write_data(0x28);
_long_delay();
_lcd_write_data(4);
_long_delay();
_lcd_write_data(0x85);
_long_delay();
#asm
in r26,__lcd_direction
andi r26,0xf ;set as input
out __lcd_direction,r26
sbi __lcd_port,__lcd_rd ;RD=1
#endasm
if (lcd_read_byte0()!=5) return 0;
_lcd_ready();
_lcd_write_data(6);
lcd_clear();
return 1;
}

void lcd_control (unsigned char control)
{
_lcd_ready();
_lcd_write_data(control);
}


Сообщение отредактировал IgorKossak - Jan 18 2013, 13:17
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 18 2013, 12:37
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



"Отличная" говнолиба с привязкой к такому-же говнокомпилятору...

По сути:
Ищите все вхождения интересующей вас ножки в тексте либы например __lcd_rd.
Такие строки удаляйте полностью (или заменяйте их на nop, чтобы не порушить времянку):
Код
        sbi __lcd_port,__lcd_rd
        cbi __lcd_port,__lcd_rd

а такие (могут и отличаться)
Код
        ori r26,0xf0 | (1<<__lcd_rs) | (1<<__lcd_rd) | (1<<__lcd_enable)

правьте примерно до такого состояния:
Код
        ori r26,0xf0 | (1<<__lcd_rs)  | (1<<__lcd_enable)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
aerobus
сообщение Jan 18 2013, 13:38
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 19-05-06
Пользователь №: 17 256



Цитата(demiurg_spb @ Jan 18 2013, 16:37) *
"Отличная" говнолиба с привязкой к такому-же говнокомпилятору...

По сути:
Ищите все вхождения интересующей вас ножки в тексте либы например __lcd_rd.
Такие строки удаляйте полностью (или заменяйте их на nop, чтобы не порушить времянку):
Код
        sbi __lcd_port,__lcd_rd
        cbi __lcd_port,__lcd_rd

а такие (могут и отличаться)
Код
        ori r26,0xf0 | (1<<__lcd_rs) | (1<<__lcd_rd) | (1<<__lcd_enable)

правьте примерно до такого состояния:
Код
        ori r26,0xf0 | (1<<__lcd_rs)  | (1<<__lcd_enable)

Спасибо. Буду пробовать. Ежели что ешшо задам глупых вопросов. Уж не обессудьте. 05.gif
Ну и подскажите тогда, чем лучше пользоваться из компилеров и либов. wacko.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 18 2013, 13:59
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



winavr или avr-studio + avr-gcc.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
aerobus
сообщение Jan 18 2013, 14:28
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 19-05-06
Пользователь №: 17 256



Цитата(aerobus @ Jan 18 2013, 17:38) *
Ежели что ешшо задам глупых вопросов.

Ну в общем прибил все обращения к __lcd_rd ... Не помогло. sad.gif
Теперь после инициализации экрана на пине энабле идет "моргание" 0,1,0,1.....
Т.е. этими средствами похоже проблемку не решить.
Не хочется рисовать кусок проги своей, то бишь свою либу... Думал обойтись на скорую руку готовыми решениями. И готовой библиотечкой.
Ну видимо ума хватит только на написание своего "говнокода" sm.gif заместо стандартной либы. Прийдется изучать даташит на ЛСД sm.gif


Go to the top of the page
 
+Quote Post
aerobus
сообщение Jan 18 2013, 18:32
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 19-05-06
Пользователь №: 17 256



Цитата(demiurg_spb @ Jan 18 2013, 17:59) *
avr-gcc.

Кстати, а иде сей компилер можно взять? Или он платный?
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jan 18 2013, 19:21
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(aerobus @ Jan 18 2013, 22:32) *
Кстати, а иде сей компилер можно взять? Или он платный?


Бесплатный.
Atmel AVR 8-bit and 32-bit Toolchain 3.4.0 - Windows
http://www.atmel.com/Images/avr-toolchain-...2.win32.x86.exe

Среда разработки - AVR Studio 4.19 (build 730) - тоже бесплатная:
http://www.atmel.com/Images/AvrStudio4Setup.exe

В Вашем случае этого будет достаточно.

Сообщение отредактировал Genadi Zawidowski - Jan 18 2013, 19:22
Go to the top of the page
 
+Quote Post
aerobus
сообщение Jan 18 2013, 19:47
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 19-05-06
Пользователь №: 17 256



Цитата(Genadi Zawidowski @ Jan 18 2013, 23:21) *
Бесплатный.
Atmel AVR 8-bit and 32-bit Toolchain 3.4.0 - Windows
http://www.atmel.com/Images/avr-toolchain-...2.win32.x86.exe

Среда разработки - AVR Studio 4.19 (build 730) - тоже бесплатная:
http://www.atmel.com/Images/AvrStudio4Setup.exe

В Вашем случае этого будет достаточно.

Пасиб. Я пользовал CVAVR и 5 Visual. Вроде усе работало. Скачал и поставил последнюю 6-ю студию она не узнается CVAVR.
Ну да собсно проблема не велика. У мну проекты с МК возникают раз в полтора года. И оне все "домашние". Попробую неспешно разобраться.
Спасибо всем потратившим время на мои делитанские проблемы. Снимаю шляпу.
С уважением.
Go to the top of the page
 
+Quote Post
hd44780
сообщение Jan 20 2013, 14:19
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



aeribus, ловите мою самодельную либу под CvAVR.
LCD_RW там задекларирован, но реально не используется. В схеме заведен в землю, как и у Вас.
Инициализировать ноги надо где-то извне, все на выход. Либа эти не занимается.

Режим дисплея - 8-битный, имхо 4-битный - говнорежим, также как для некоторых CvAVR - "говнокомпилятор".

В качестве "плюсов" - после минимальной доработки работает и на дисплеях 20x4, если это актуально.
Прикрепленные файлы
Прикрепленный файл  hd44780lib.zip ( 2.54 килобайт ) Кол-во скачиваний: 19
 


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 20 2013, 15:07
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата
имхо 4-битный - говнорежим
Вы просто не умеете его готовить
Цитата
Родная библиотека компилятора умеет работать с ЛСД только с использованием пина ДСД RW.

Вообще хрень какая-то , ну не умеет и ладно , не подключай пин к LCD и программе хорошо и дисплею по....

А на 2313 с дисплеем надо работать вооще на 2 проводах. Хоть порты сохраните для дела


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
aerobus
сообщение Jan 20 2013, 17:28
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 19-05-06
Пользователь №: 17 256



Цитата(hd44780 @ Jan 20 2013, 18:19) *
aeribus, ловите мою самодельную либу под CvAVR.
...
Режим дисплея - 8-битный, имхо 4-битный - говнорежим, также как для некоторых CvAVR - "говнокомпилятор".

Спасибо!
Токо 8-битный забирает порты, мне тогда не хватает. sad.gif

2 ILYAUL
Ежели пин RW ставлю в землю, то на пине Enable идут осциляции и ничо не запускается.

Тут еще проблемка вылезла.
Кнопочки на шилде запаяны под разбор АЦП. А у Тиньки его нету.
Вот думаю компаратор присобачить под АЦП, только тогда прийдется растягивать управление ЖКИ на два порта, потому как нужны два канала ШИМ от таймера 0 и две ноги компаратора из порта В прийдется забрать под АЦП.
В общем буду колхозить свои процедуры инициализации и отображения. sad.gif
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 20 2013, 19:17
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Какой
Цитата
пин RW ставлю в землю
? Где?
Всё что скрыто под этим убрать
Цитата
/* read a byte from the LCD character generator or display RAM */
unsigned char lcd_read_byte(unsigned char addr) и
static unsigned char lcd_read_byte0(void)

вот сюда
static void _lcd_delay(void) - только задержку согласно DS на Ваш дисплей


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 06:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.015 секунд с 7
ELECTRONIX ©2004-2016