harm 0 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба Здравствуйте! Начал изучать АВРовские микроконтроллеры, одолжил готовую отладочную плату на Атмеге16. Хозяин подкинул мне некоторые из его программ, написанных на Bascom. В том числе и работающую программу для ЛСД. Начал программировать в CodeVision 1.23.6a. Воспользовался Визардом для подключения ЛСД, а также стандартными функциями вывода на экран из Хелпа, но ничего не получилось. Пришел к выводу, что программа перестает выполняться микроконтроллером начиная с места инициализации ЛСД. При этом у ЛСД (2*8) бывали следующие варианты: 1) верхняя строка полностью подсвечена, нижняя - выключена полностью 2) подсвечен первый символ верхней строки и мигает курсор. Но информация, которая должна выводиться на экран по программе - не выводится! Несколько дней пытаюсь решить, сейчас склонен думать, что проблема в CodeVision... Кто сталкивался с подобной проблемой и знает как ее решить (обойти), просьба помочь. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба Ну и... где, собственно? что решать-то? тип LCD, исходники - в студию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
harm 0 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба Исходник и даташит на ЛСД прилагаю.WH0802A_YGH.pdf Исходник: #include <mega16.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 #endasm #include <lcd.h> #include <delay.h> // Declare your global variables here void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTC=0x00; DDRC=0xff; // Port D initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTD=0x00; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off GICR=0x00; MCUCR=0x00; MCUCSR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off // Analog Comparator Output: Off ACSR=0x80; SFIOR=0x00; // LCD module initialization lcd_init(16); lcd_clear(); while (1) { // Place your code here lcd_gotoxy(1,5); lcd_putsf("First"); delay_ms(1000); }; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба Осталось 4 неизвестных: lcd_init(); lcd_clear(); lcd_gotoxy(); lcd_putsf(); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
harm 0 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба Пардон, функции надо описать? Хоть бы компилятор выругался, а то ж никаких ошибок. void lcd_init(unsigned char lcd_columns); void lcd_clear(void); void lcd_gotoxy(unsigned char x, unsigned char y); void lcd_putsf(char flash *str); Добавляю в код Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ALexx 0 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба Осталось 4 неизвестных: lcd_init(); lcd_clear(); lcd_gotoxy(); lcd_putsf(); Это функции библиотеки "LCD.h" CodeVision-а. Их прототипы уже описаны в упомянутом хидере. 2 Ветал Библиотека проверена - работает как часы. Смотрите на подключение ЖКИ к контроллеру. Выдержка из ХЕЛПа: The LCD module must be connected to the port bits as follows: [LCD] [AVR Port] RS (pin4) ------ bit 0 RD (pin 5) ------ bit 1 EN (pin 6) ------ bit 2 DB4 (pin 11) --- bit 4 DB5 (pin 12) --- bit 5 DB6 (pin 13) --- bit 6 DB7 (pin 14) --- bit 7 И еще... Вы цепляете ЖКИ к порту С (.equ __lcd_port=0x15). А ниже этот же порт настраиваете на ВВОД... Не гуд.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
harm 0 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба Библиотека проверена - работает как часы. Смотрите на подключение ЖКИ к контроллеру. Выдержка из ХЕЛПа: То есть программа должна работать? Выдержки из хелпа смотрел. Есть отличия 1) RD (pin5) -- GND (работаем только с записью), думаю с этим проблем не может быть; 2) EN (pin6) -- Bit1 (по хелпу Bit2), тут может быть трабл. Вроде как проблема зарыта в пункте 2. Резать дороги не могу, чтоб окончательно убедиться. Проделал следующее. Отключил ЛСД. Прошил под BasCom и посмотрел осциллографом все упомянутые в Хелпе сигналы. Прошил под CodeVision, сигналов на осциллографе не увидел. От сюда и начал грешить на то что проблема в CodeVision. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GDI 0 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба Если вы поменяли расположение сигналов относительно того как требудется для библиотечной функции, то чего вы ожидали? Если дорожки резать не можете, пишите тогда свою библиотеку для работы с ЖКИ в необходимой вам конфигурации выводов. Или используйте готовую стороннюю библиотеку которая позволяет переопределить синалы на выводах порта. Готовую библиотеку можно поискать тут http://electronix.ru/forum/index.php?showtopic=10934 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба ++ Всегда отрицательно отношусь к применению чего-то, чего руками не потрогаешь и не поменяешь. Особенно к разным библиотекам, притянутым за уши к конкретным компиляторам. Будь то хоть delay() на циклах. А с некоторых пор являюсь поклонником GCC (и дело тут не столько в халяве, сколько в открытости исходников, в том числе и всех библиотек.) Но к теме это, конечно, не относится. Тут всё понятно. Раз неправильно подключен индикатор - ясное дело, работать он не обязан. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
harm 0 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба GDI: плата не моя, потому и не режу; эту проблему попытаюсь решить своими силами - шлейф попробую обжать по-другому. Но на данный момент смущает другое: сигналов на осциллографе нет на порту С! Повторюсь, прошивал Баскомом и наблюдал их! GDI: плата не моя, потому и не режу; эту проблему попытаюсь решить своими силами - шлейф попробую обжать по-другому. Но на данный момент смущает другое: сигналов на осциллографе нет на порту С! Повторюсь, прошивал Баскомом и наблюдал их! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ALexx 0 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба ++ Всегда отрицательно отношусь к применению чего-то, чего руками не потрогаешь и не поменяешь. +1 2 Ветал На форуме есть тема с исходниками - посмотрите туда. В прикреплении - мой вариант библиотеки для ЖКИ (писалось под CodeVision). Вся настройка в хидере. Пример применения: #include "CharLCD.h" #include <delay.h> #include <string.h> #include <stdio.h> flash char *mesF="Строка из FLASH"; char mesR[20]; uchar i=0; void main(void){ LCD_setup(); LCD_fputs(LINE1,mesF); // Вывод строки из FLASH strcpyf(mesR,mesF); mesR[10]='S'; mesR[11]='R'; mesR[12]='A'; mesR[13]='M'; mesR[14]=0; LCD_puts(LINE2,mesR); // Вывод строки из SRAM //вывод бегущего текста for(i=0;i<=16;i++){ LCD_fputs(LINE3+(16-i),"Test"); delay_ms(100); LCD_clrline(LINE3+(16-i),4); } i=0; // использование функции sprintf для вывода значений while(1){ LCD_clrline(LINE3,CHARS_PER_LINE); sprintf(mesR,"Параметр=%d",i); LCD_puts(LINE3,mesR); LCD_clrline(LINE4,CHARS_PER_LINE); sprintf(mesR,"Value=%d points",i++); LCD_puts(LINE4,mesR); delay_ms(200); #asm("WDR") } } CharLCD.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
harm 0 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба 2 ALexx: Благодарю! Попробую разобраться с вашим вариантом библиотеки под ЖКИ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба Исходник и даташит на ЛСД прилагаю.WH0802A_YGH.pdf lcd_init(16); Я так понимаю, 0802 - это 8x2? Тогда наверное надо писать lcd_init(8)? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DiMomite 0 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба А JTAG на порте С отключен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
harm 0 23 июля, 2008 Опубликовано 23 июля, 2008 · Жалоба Я так понимаю, 0802 - это 8x2? Тогда наверное надо писать lcd_init(8)? :) Спасибо, исправил, не помогло, сейчас пытаюсь выяснить почему нет сигналов обмена с ЛСД. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться