aerobus 0 18 января, 2013 Опубликовано 18 января, 2013 · Жалоба Уважаемое сообщество гуру. Прошу помочь разобраться. Собсно проблемка. Взял ЛСД с кнопочками в виде шиелда к дуньке. А у него пин RW запаян на землю, то бишь чтение из ЛСД запрещено. Устройство у меня довольно простенькое, посему Тиньки вполне достаточно. Програмлю в CVAVR. Родная библиотека компилятора умеет работать с ЛСД только с использованием пина ДСД RW. Отсюда вопрос можно ли както "объяснить" библиотечке чтоб не использовать пин RW? Или его отрезать от "земли" прийдется. Токо не кидайте сразу помидорами. В данном вопросе не больно силен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mareng 0 18 января, 2013 Опубликовано 18 января, 2013 · Жалоба Прикрути свою библиотеку, благо этого добра в инете достаточно, да и заново написать недолго. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 18 января, 2013 Опубликовано 18 января, 2013 · Жалоба Отсюда вопрос можно ли както "объяснить" библиотечке чтоб не использовать пин RW?Библиотека в исходниках? Если да, то дело нехитрое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aerobus 0 18 января, 2013 Опубликовано 18 января, 2013 (изменено) · Жалоба Библиотека в исходниках? Если да, то дело нехитрое. Ну собсно вот библиотека. Я правда в ней перевесил пин 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); } Изменено 18 января, 2013 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 18 января, 2013 Опубликовано 18 января, 2013 · Жалоба "Отличная" говнолиба с привязкой к такому-же говнокомпилятору... По сути: Ищите все вхождения интересующей вас ножки в тексте либы например __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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aerobus 0 18 января, 2013 Опубликовано 18 января, 2013 · Жалоба "Отличная" говнолиба с привязкой к такому-же говнокомпилятору... По сути: Ищите все вхождения интересующей вас ножки в тексте либы например __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: Ну и подскажите тогда, чем лучше пользоваться из компилеров и либов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 18 января, 2013 Опубликовано 18 января, 2013 · Жалоба winavr или avr-studio + avr-gcc. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aerobus 0 18 января, 2013 Опубликовано 18 января, 2013 · Жалоба Ежели что ешшо задам глупых вопросов. Ну в общем прибил все обращения к __lcd_rd ... Не помогло. :( Теперь после инициализации экрана на пине энабле идет "моргание" 0,1,0,1..... Т.е. этими средствами похоже проблемку не решить. Не хочется рисовать кусок проги своей, то бишь свою либу... Думал обойтись на скорую руку готовыми решениями. И готовой библиотечкой. Ну видимо ума хватит только на написание своего "говнокода" :) заместо стандартной либы. Прийдется изучать даташит на ЛСД :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aerobus 0 18 января, 2013 Опубликовано 18 января, 2013 · Жалоба avr-gcc. Кстати, а иде сей компилер можно взять? Или он платный? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 18 января, 2013 Опубликовано 18 января, 2013 (изменено) · Жалоба Кстати, а иде сей компилер можно взять? Или он платный? Бесплатный. 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 В Вашем случае этого будет достаточно. Изменено 18 января, 2013 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aerobus 0 18 января, 2013 Опубликовано 18 января, 2013 · Жалоба Бесплатный. 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. Ну да собсно проблема не велика. У мну проекты с МК возникают раз в полтора года. И оне все "домашние". Попробую неспешно разобраться. Спасибо всем потратившим время на мои делитанские проблемы. Снимаю шляпу. С уважением. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 20 января, 2013 Опубликовано 20 января, 2013 · Жалоба aeribus, ловите мою самодельную либу под CvAVR. LCD_RW там задекларирован, но реально не используется. В схеме заведен в землю, как и у Вас. Инициализировать ноги надо где-то извне, все на выход. Либа эти не занимается. Режим дисплея - 8-битный, имхо 4-битный - говнорежим, также как для некоторых CvAVR - "говнокомпилятор". В качестве "плюсов" - после минимальной доработки работает и на дисплеях 20x4, если это актуально. hd44780lib.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 20 января, 2013 Опубликовано 20 января, 2013 · Жалоба имхо 4-битный - говнорежим Вы просто не умеете его готовить Родная библиотека компилятора умеет работать с ЛСД только с использованием пина ДСД RW. Вообще хрень какая-то , ну не умеет и ладно , не подключай пин к LCD и программе хорошо и дисплею по.... А на 2313 с дисплеем надо работать вооще на 2 проводах. Хоть порты сохраните для дела Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aerobus 0 20 января, 2013 Опубликовано 20 января, 2013 · Жалоба aeribus, ловите мою самодельную либу под CvAVR. ... Режим дисплея - 8-битный, имхо 4-битный - говнорежим, также как для некоторых CvAVR - "говнокомпилятор". Спасибо! Токо 8-битный забирает порты, мне тогда не хватает. :( 2 ILYAUL Ежели пин RW ставлю в землю, то на пине Enable идут осциляции и ничо не запускается. Тут еще проблемка вылезла. Кнопочки на шилде запаяны под разбор АЦП. А у Тиньки его нету. Вот думаю компаратор присобачить под АЦП, только тогда прийдется растягивать управление ЖКИ на два порта, потому как нужны два канала ШИМ от таймера 0 и две ноги компаратора из порта В прийдется забрать под АЦП. В общем буду колхозить свои процедуры инициализации и отображения. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 20 января, 2013 Опубликовано 20 января, 2013 · Жалоба Какой пин 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 на Ваш дисплей Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться