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

Помогите запустить LCD под CodeVision

Здравствуйте!

Начал изучать АВРовские микроконтроллеры, одолжил готовую отладочную плату на Атмеге16. Хозяин подкинул мне некоторые из его программ, написанных на Bascom. В том числе и работающую программу для ЛСД.

Начал программировать в CodeVision 1.23.6a. Воспользовался Визардом для подключения ЛСД, а также стандартными функциями вывода на экран из Хелпа, но ничего не получилось. Пришел к выводу, что программа перестает выполняться микроконтроллером начиная с места инициализации ЛСД. При этом у ЛСД (2*8) бывали следующие варианты:

1) верхняя строка полностью подсвечена, нижняя - выключена полностью

2) подсвечен первый символ верхней строки и мигает курсор.

Но информация, которая должна выводиться на экран по программе - не выводится!

Несколько дней пытаюсь решить, сейчас склонен думать, что проблема в CodeVision...

 

Кто сталкивался с подобной проблемой и знает как ее решить (обойти), просьба помочь.

Спасибо!

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


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

Ну и...

где, собственно?

что решать-то?

тип LCD, исходники - в студию.

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


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

Исходник и даташит на ЛСД прилагаю.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);

};

}

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


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

Осталось 4 неизвестных:

lcd_init();

lcd_clear();

lcd_gotoxy();

lcd_putsf();

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


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

Пардон, функции надо описать? Хоть бы компилятор выругался, а то ж никаких ошибок.

 

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);

 

Добавляю в код

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


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

Осталось 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).

А ниже этот же порт настраиваете на ВВОД... Не гуд..

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


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

Библиотека проверена - работает как часы.

Смотрите на подключение ЖКИ к контроллеру.

Выдержка из ХЕЛПа:

 

То есть программа должна работать?

 

Выдержки из хелпа смотрел. Есть отличия

 

1) RD (pin5) -- GND (работаем только с записью), думаю с этим проблем не может быть;

2) EN (pin6) -- Bit1 (по хелпу Bit2), тут может быть трабл.

 

Вроде как проблема зарыта в пункте 2. Резать дороги не могу, чтоб окончательно убедиться. Проделал следующее. Отключил ЛСД. Прошил под BasCom и посмотрел осциллографом все упомянутые в Хелпе сигналы. Прошил под CodeVision, сигналов на осциллографе не увидел. От сюда и начал грешить на то что проблема в CodeVision.

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


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

Если вы поменяли расположение сигналов относительно того как требудется для библиотечной функции, то чего вы ожидали? Если дорожки резать не можете, пишите тогда свою библиотеку для работы с ЖКИ в необходимой вам конфигурации выводов. Или используйте готовую стороннюю библиотеку которая позволяет переопределить синалы на выводах порта. Готовую библиотеку можно поискать тут http://electronix.ru/forum/index.php?showtopic=10934

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


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

++

Всегда отрицательно отношусь к применению чего-то, чего руками не потрогаешь и не поменяешь. Особенно к разным библиотекам, притянутым за уши к конкретным компиляторам. Будь то хоть delay() на циклах. А с некоторых пор являюсь поклонником GCC (и дело тут не столько в халяве, сколько в открытости исходников, в том числе и всех библиотек.)

Но к теме это, конечно, не относится. Тут всё понятно. Раз неправильно подключен индикатор - ясное дело, работать он не обязан.

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


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

GDI:

плата не моя, потому и не режу;

эту проблему попытаюсь решить своими силами - шлейф попробую обжать по-другому. Но на данный момент смущает другое: сигналов на осциллографе нет на порту С!

Повторюсь, прошивал Баскомом и наблюдал их!

 

GDI:

плата не моя, потому и не режу;

эту проблему попытаюсь решить своими силами - шлейф попробую обжать по-другому. Но на данный момент смущает другое: сигналов на осциллографе нет на порту С!

Повторюсь, прошивал Баскомом и наблюдал их!

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


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

++

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

 

+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

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


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

2 ALexx:

Благодарю! Попробую разобраться с вашим вариантом библиотеки под ЖКИ.

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


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

Исходник и даташит на ЛСД прилагаю.WH0802A_YGH.pdf

lcd_init(16);

 

Я так понимаю, 0802 - это 8x2? Тогда наверное надо писать lcd_init(8)? :)

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


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

Я так понимаю, 0802 - это 8x2? Тогда наверное надо писать lcd_init(8)? :)

 

Спасибо, исправил, не помогло, сейчас пытаюсь выяснить почему нет сигналов обмена с ЛСД.

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


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

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

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

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

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

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

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

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

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

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