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

Уважаемое сообщество гуру.

Прошу помочь разобраться.

Собсно проблемка.

Взял ЛСД с кнопочками в виде шиелда к дуньке.

А у него пин RW запаян на землю, то бишь чтение из ЛСД запрещено.

Устройство у меня довольно простенькое, посему Тиньки вполне достаточно.

Програмлю в CVAVR.

Родная библиотека компилятора умеет работать с ЛСД только с использованием пина ДСД RW.

Отсюда вопрос можно ли както "объяснить" библиотечке чтоб не использовать пин RW? Или его отрезать от "земли" прийдется.

 

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

 

 

Поделиться сообщением


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

Прикрути свою библиотеку, благо этого добра в инете достаточно, да и заново написать недолго.

Поделиться сообщением


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

Отсюда вопрос можно ли както "объяснить" библиотечке чтоб не использовать пин RW?
Библиотека в исходниках?

Если да, то дело нехитрое.

 

Поделиться сообщением


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

Библиотека в исходниках?

Если да, то дело нехитрое.

Ну собсно вот библиотека.

Я правда в ней перевесил пин Enable на PB3, чтоб не запускать еще один таймер (мне в устройстве надо два канала ШИМ, вот я на один таймер их и повесил)

Зеленым я пометил то что поменял, красным то что мне мешает.

В Ассемблере вообще не силен, тем паче в МКшном.

Помогите ежели не сложно. Или ткните носом в подходящую библиотеку.

 

С уважением.

/* 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
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


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

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

 

По сути:

Ищите все вхождения интересующей вас ножки в тексте либы например __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)

Поделиться сообщением


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

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

 

По сути:

Ищите все вхождения интересующей вас ножки в тексте либы например __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:

Ну и подскажите тогда, чем лучше пользоваться из компилеров и либов. :wacko:

Поделиться сообщением


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

Ежели что ешшо задам глупых вопросов.

Ну в общем прибил все обращения к __lcd_rd ... Не помогло. :(

Теперь после инициализации экрана на пине энабле идет "моргание" 0,1,0,1.....

Т.е. этими средствами похоже проблемку не решить.

Не хочется рисовать кусок проги своей, то бишь свою либу... Думал обойтись на скорую руку готовыми решениями. И готовой библиотечкой.

Ну видимо ума хватит только на написание своего "говнокода" :) заместо стандартной либы. Прийдется изучать даташит на ЛСД :)

 

 

 

Поделиться сообщением


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

Кстати, а иде сей компилер можно взять? Или он платный?

 

Бесплатный.

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

Поделиться сообщением


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

Бесплатный.

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.

Ну да собсно проблема не велика. У мну проекты с МК возникают раз в полтора года. И оне все "домашние". Попробую неспешно разобраться.

Спасибо всем потратившим время на мои делитанские проблемы. Снимаю шляпу.

С уважением.

Поделиться сообщением


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

aeribus, ловите мою самодельную либу под CvAVR.

LCD_RW там задекларирован, но реально не используется. В схеме заведен в землю, как и у Вас.

Инициализировать ноги надо где-то извне, все на выход. Либа эти не занимается.

 

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

 

В качестве "плюсов" - после минимальной доработки работает и на дисплеях 20x4, если это актуально.

hd44780lib.zip

Поделиться сообщением


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

имхо 4-битный - говнорежим
Вы просто не умеете его готовить

Родная библиотека компилятора умеет работать с ЛСД только с использованием пина ДСД RW.

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

 

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

Поделиться сообщением


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

aeribus, ловите мою самодельную либу под CvAVR.

...

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

Спасибо!

Токо 8-битный забирает порты, мне тогда не хватает. :(

 

2 ILYAUL

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

 

Тут еще проблемка вылезла.

Кнопочки на шилде запаяны под разбор АЦП. А у Тиньки его нету.

Вот думаю компаратор присобачить под АЦП, только тогда прийдется растягивать управление ЖКИ на два порта, потому как нужны два канала ШИМ от таймера 0 и две ноги компаратора из порта В прийдется забрать под АЦП.

В общем буду колхозить свои процедуры инициализации и отображения. :(

 

Поделиться сообщением


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

Какой

пин 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 на Ваш дисплей

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

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