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

 
 
> 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
 
Start new topic
Ответов
demiurg_spb
сообщение Jan 18 2013, 11:15
Сообщение #2


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

Группа: Свой
Сообщений: 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
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #4


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

Группа: Свой
Сообщений: 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
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #6


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

Группа: Свой
Сообщений: 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, 18:32
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #8


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

Группа: Участник
Сообщений: 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
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 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

Сообщений в этой теме
- aerobus   ATTINY2313 и ЖКИ 16х2   Jan 18 2013, 10:58
- - Mareng   Прикрути свою библиотеку, благо этого добра в инет...   Jan 18 2013, 11:09
|- - aerobus   Цитата(aerobus @ Jan 18 2013, 17:38) Ежел...   Jan 18 2013, 14:28
- - hd44780   aeribus, ловите мою самодельную либу под CvAVR. LC...   Jan 20 2013, 14:19
|- - aerobus   Цитата(hd44780 @ Jan 20 2013, 18:19) aeri...   Jan 20 2013, 17:28
- - ILYAUL   Цитатаимхо 4-битный - говнорежим Вы просто не умее...   Jan 20 2013, 15:07
|- - hd44780   Цитата(ILYAUL @ Jan 20 2013, 17:07) Вы пр...   Jan 21 2013, 07:26
|- - aerobus   Цитата(hd44780 @ Jan 21 2013, 11:26) aero...   Jan 21 2013, 09:43
- - ILYAUL   Какой Цитатапин RW ставлю в землю? Где? Всё что с...   Jan 20 2013, 19:17
|- - aerobus   Цитата(ILYAUL @ Jan 20 2013, 23:17) Какой...   Jan 20 2013, 20:45
- - ILYAUL   ЦитатаТакую картину наблюдал и на CvAVR-овской либ...   Jan 21 2013, 09:55
- - aerobus   Цитата(ILYAUL @ Jan 21 2013, 13:55) Пораб...   Jan 21 2013, 11:59


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

 


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


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