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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Помогите запустить LCD под CodeVision, под Bascom работает, под CodeVision - нет
Ветал
сообщение Jul 22 2008, 11:41
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 22-03-08
Из: Харьков
Пользователь №: 36 149



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

Кто сталкивался с подобной проблемой и знает как ее решить (обойти), просьба помочь.
Спасибо!
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jul 22 2008, 11:52
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Ну и...
где, собственно?
что решать-то?
тип LCD, исходники - в студию.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Ветал
сообщение Jul 22 2008, 12:16
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 22-03-08
Из: Харьков
Пользователь №: 36 149



Исходник и даташит на ЛСД прилагаю.Прикрепленный файл  WH0802A_YGH.pdf ( 447.6 килобайт ) Кол-во скачиваний: 337


Исходник:
#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);
};
}
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jul 22 2008, 12:25
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Осталось 4 неизвестных:
lcd_init();
lcd_clear();
lcd_gotoxy();
lcd_putsf();


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Ветал
сообщение Jul 22 2008, 12:37
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 22-03-08
Из: Харьков
Пользователь №: 36 149



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

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

Добавляю в код
Go to the top of the page
 
+Quote Post
ALexx
сообщение Jul 22 2008, 12:42
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 22-09-04
Из: Burbach, Germany
Пользователь №: 704



Цитата(MrYuran @ Jul 22 2008, 15:25) *
Осталось 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).
А ниже этот же порт настраиваете на ВВОД... Не гуд..
Go to the top of the page
 
+Quote Post
Ветал
сообщение Jul 22 2008, 13:01
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 22-03-08
Из: Харьков
Пользователь №: 36 149



Библиотека проверена - работает как часы.
Смотрите на подключение ЖКИ к контроллеру.
Выдержка из ХЕЛПа:

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

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

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

Вроде как проблема зарыта в пункте 2. Резать дороги не могу, чтоб окончательно убедиться. Проделал следующее. Отключил ЛСД. Прошил под BasCom и посмотрел осциллографом все упомянутые в Хелпе сигналы. Прошил под CodeVision, сигналов на осциллографе не увидел. От сюда и начал грешить на то что проблема в CodeVision.
Go to the top of the page
 
+Quote Post
GDI
сообщение Jul 22 2008, 13:15
Сообщение #8


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

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



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


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jul 22 2008, 13:23
Сообщение #9


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(GDI @ Jul 22 2008, 17:15) *

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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Ветал
сообщение Jul 22 2008, 13:38
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 22-03-08
Из: Харьков
Пользователь №: 36 149



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

GDI:
плата не моя, потому и не режу;
эту проблему попытаюсь решить своими силами - шлейф попробую обжать по-другому. Но на данный момент смущает другое: сигналов на осциллографе нет на порту С!
Повторюсь, прошивал Баскомом и наблюдал их!
Go to the top of the page
 
+Quote Post
ALexx
сообщение Jul 22 2008, 13:58
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 22-09-04
Из: Burbach, Germany
Пользователь №: 704



Цитата(MrYuran @ Jul 22 2008, 16:23) *
++
Всегда отрицательно отношусь к применению чего-то, чего руками не потрогаешь и не поменяешь.


+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.8 килобайт ) Кол-во скачиваний: 60
 
Go to the top of the page
 
+Quote Post
Ветал
сообщение Jul 22 2008, 15:37
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 22-03-08
Из: Харьков
Пользователь №: 36 149



2 ALexx:
Благодарю! Попробую разобраться с вашим вариантом библиотеки под ЖКИ.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 22 2008, 19:35
Сообщение #13


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Ветал @ Jul 22 2008, 18:16) *
Исходник и даташит на ЛСД прилагаю.Прикрепленный файл  WH0802A_YGH.pdf ( 447.6 килобайт ) Кол-во скачиваний: 337

Код
lcd_init(16);


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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
DiMomite
сообщение Jul 22 2008, 20:28
Сообщение #14


Участник
*

Группа: Свой
Сообщений: 47
Регистрация: 8-04-06
Из: Одесса
Пользователь №: 15 959



А JTAG на порте С отключен?
Go to the top of the page
 
+Quote Post
Ветал
сообщение Jul 23 2008, 06:52
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 22-03-08
Из: Харьков
Пользователь №: 36 149



Цитата(AHTOXA @ Jul 22 2008, 22:35) *
Я так понимаю, 0802 - это 8x2? Тогда наверное надо писать lcd_init(8)? smile.gif


Спасибо, исправил, не помогло, сейчас пытаюсь выяснить почему нет сигналов обмена с ЛСД.
Go to the top of the page
 
+Quote Post
Serj78
сообщение Jul 23 2008, 06:59
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



Цитата(MrYuran @ Jul 22 2008, 17:23) *
Всегда отрицательно отношусь к применению чего-то, чего руками не потрогаешь и не поменяешь. Особенно к разным библиотекам, притянутым за уши к конкретным компиляторам. Будь то хоть delay() на циклах. А с некоторых пор являюсь поклонником GCC (и дело тут не столько в халяве, сколько в открытости исходников, в том числе и всех библиотек.)


Дык в CV большинство библиотек открыто- бери и правь. просто человек этого не умеет или не знает и "хавает что дают"

Кстати там есть замечательная такая подфункция lcd_ready(); которая вызывается каждый раз функциями верхнего уровня,(вывод, установка знакоместа, стирание, пр.) она тупо ждет ответа от индикатора и вешает программу при сбое обмена. рекомендую подписать в ней таймаут.
Go to the top of the page
 
+Quote Post
Ветал
сообщение Jul 23 2008, 07:00
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 22-03-08
Из: Харьков
Пользователь №: 36 149



Цитата(DiMomite @ Jul 22 2008, 23:28) *
А JTAG на порте С отключен?

Дело в том, что плата позволяет подключить ЛСД к любому из портов микроконтроллера, что несколько раз уже пытался сделать. Так что думаю дело не в JTAG. С JTAG правда еще не разбирался и не работал.
Спасибо за совет.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jul 23 2008, 07:07
Сообщение #18


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Serj78 @ Jul 23 2008, 10:59) *
Кстати там есть замечательная такая подфункция lcd_ready(); которая вызывается каждый раз функциями верхнего уровня,(вывод, установка знакоместа, стирание, пр.) она тупо ждет ответа от индикатора и вешает программу при сбое обмена. рекомендую подписать в ней таймаут.

Так вот она где порылась, собака!
тогда понятно, почему виснет. Чтение-то вообще обрублено.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Stas_R
сообщение Jul 23 2008, 07:09
Сообщение #19





Группа: Участник
Сообщений: 12
Регистрация: 18-10-05
Из: г.Донецк
Пользователь №: 9 806



CodeVision при работе с LCD читает бит состояния и если RD не используется программа циклится на опросе готовности. Можете проверить в отладчике.
Go to the top of the page
 
+Quote Post
Ветал
сообщение Jul 23 2008, 07:21
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 22-03-08
Из: Харьков
Пользователь №: 36 149



Цитата(Serj78 @ Jul 23 2008, 09:59) *
Дык в CV большинство библиотек открыто- бери и правь. просто человек этого не умеет или не знает и "хавает что дают"

Кстати там есть замечательная такая подфункция lcd_ready(); которая вызывается каждый раз функциями верхнего уровня,(вывод, установка знакоместа, стирание, пр.) она тупо ждет ответа от индикатора и вешает программу при сбое обмена. рекомендую подписать в ней таймаут.


Совершенно точно, с контроллерами только начал знакомиться. Пока приходится "хаватю что дают", для этого и обратился за помощью. Подфункцию lcd_ready() не применял. Но эффект получается подобным: программа перестает выполняться на этапе выполнения инициализации ЛСД. Может функция lcd_init() тоже тупо ждет ответа от индикатора?


2 Stas_R & MrYuran & Serj78:

Похоже на то. Странно что Баском хавает без ответа от ЛСД, на нем ведь все работает.
Буду пытаться как-то решить эту проблему.
В любом случае всем огромное спасибо за советы!
Go to the top of the page
 
+Quote Post
WHALE
сообщение Jul 23 2008, 07:33
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Цитата(Ветал @ Jul 23 2008, 11:21) *
Похоже на то. Странно что Баском хавает без ответа от ЛСД, на нем ведь все работает.
Буду пытаться как-то решить эту проблему.
В любом случае всем огромное спасибо за советы!

Хреновая в CV библиотечная функция для работы с LCD.Лучше возьмите в шапке форуме че-нить и подточите под компилятор.хотя,вроде,там и для и для CV что-то есть.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
GDI
сообщение Jul 23 2008, 07:55
Сообщение #22


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

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата
Хреновая в CV библиотечная функция для работы с LCD

Она не хреновая, а просто делает все(или почти все) что в даташите на ЖКИ прописано, что тут такого? А есть еще библиотеки которые с этими ЖКИ через сдвиговый регистр работают по 3м проводам, так что теперь считать хреновыми все остальные либы, которые по 7 проводам работают?

Цитата
Странно что Баском хавает без ответа от ЛСД, на нем ведь все работает

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


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
delamoure
сообщение Jul 23 2008, 08:19
Сообщение #23


Частый гость
**

Группа: Свой
Сообщений: 176
Регистрация: 2-04-08
Из: Днепропетровск
Пользователь №: 36 406



Я давненько юзаю CodeVision, но библиотеки для символьного LCD там неудобны лишь одним. Они жестко задают использование линий микроконтроллера, что бывает неудобным при разводке платы.
Недавно написал для себя драйвер символьного LCD на базе HD44780. Проверял только с 4-х строчным дисплеем. То, что реализовано - работает без проблем.
Только подключите библиотеки для вашего MCU, и delay.h
Прикрепленные файлы
Прикрепленный файл  HD44780.zip ( 2.29 килобайт ) Кол-во скачиваний: 68
 


--------------------
Ребята, как же это вы без гравицапы пепелац выкатываете из гаража? Это непорядок. ©
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение Jul 23 2008, 08:20
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Цитата
Подфункцию lcd_ready() не применял

Применяли, только неявно. Serj78 ведь писал: "вызывается каждый раз функциями верхнего уровня,(вывод, установка знакоместа, стирание, пр.)". То есть она вызывается функциями lcd_init(), lcd_clear(), lcd_gotoxy(),lcd_putsf("ххх") и др., в том числе и функцией lcd_init().

LCD - относительно медленное устройство и каждая команда (вывод одного символа, очистка экрана, смена положения курсора, ...) выполняется им довольно долго (37мкс...1,5мс, в зависимости от команды) по меркам контроллера. Поэтому контроллеру приходится ждать LCD. И сделать это можно 2-мя путями:
1. перед каждой следущей командой к LCD проверять/ждать очищения BusyFlag'а lcd-индикатора
2. контроллер между командами к LCD сам выдерживает время, необходимое для выполнения предыдущей команды индикатором.

Недостаток 1-го варианта - обязательное наличие линии R/W между LCD и контроллером (для чтения BusyFlag). Недостаток 2-го - время, которое выдерживает контроллер между командами, должно быть с некоторым запасом, так как время выполнения команд ЖКИ-индикатором может отличаться от индикатора к индикатору и зависит от температуры.

Видимо, в BascomAVR реализован 2й метод, поэтому он и работает.
Go to the top of the page
 
+Quote Post
Ветал
сообщение Jul 23 2008, 08:42
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 22-03-08
Из: Харьков
Пользователь №: 36 149



Цитата(delamoure @ Jul 23 2008, 11:19) *
Я давненько юзаю CodeVision, но библиотеки для символьного LCD там неудобны лишь одним. Они жестко задают использование линий микроконтроллера, что бывает неудобным при разводке платы...


Это существенный недостаток, тот же Баском позволяет выбирать линии...
Как обстоят дела с этим в ИмиджКрафте и других компиляторах?



Цитата(Александр Куличок @ Jul 23 2008, 11:20) *
Применяли, только неявно. Serj78 ведь писал: "вызывается каждый раз функциями верхнего уровня,(вывод, установка знакоместа, стирание, пр.)". То есть она вызывается функциями lcd_init(), lcd_clear(), lcd_gotoxy(),lcd_putsf("ххх") и др., в том числе и функцией lcd_init().

LCD - относительно медленное устройство и каждая команда (вывод одного символа, очистка экрана, смена положения курсора, ...) выполняется им довольно долго (37мкс...1,5мс, в зависимости от команды) по меркам контроллера. Поэтому контроллеру приходится ждать LCD. И сделать это можно 2-мя путями:
1. перед каждой следущей командой к LCD проверять/ждать очищения BusyFlag'а lcd-индикатора
2. контроллер между командами к LCD сам выдерживает время, необходимое для выполнения предыдущей команды индикатором.

Недостаток 1-го варианта - обязательное наличие линии R/W между LCD и контроллером (для чтения BusyFlag). Недостаток 2-го - время, которое выдерживает контроллер между командами, должно быть с некоторым запасом, так как время выполнения команд ЖКИ-индикатором может отличаться от индикатора к индикатору и зависит от температуры.

Видимо, в BascomAVR реализован 2й метод, поэтому он и работает.



Спасибо за ответ. Теперь все понятно smile.gif
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jul 23 2008, 08:49
Сообщение #26


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Да компилятору-то вобщем-то по барабану. Он всё позволяет, что не противоречит правилам Си. Вам же уже написали - подцепите любую другую библиотеку, благо их немеряно. Да в конце концов, и самому полезно поколупаться. А менять среду разработки из-за встроенных библиотек.. Ну как бы это сказать... Помягче...


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Ветал
сообщение Jul 23 2008, 09:21
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 22-03-08
Из: Харьков
Пользователь №: 36 149



Цитата(MrYuran @ Jul 23 2008, 11:49) *
Да компилятору-то вобщем-то по барабану. Он всё позволяет, что не противоречит правилам Си. Вам же уже написали - подцепите любую другую библиотеку, благо их немеряно. Да в конце концов, и самому полезно поколупаться. А менять среду разработки из-за встроенных библиотек.. Ну как бы это сказать... Помягче...

Согласен - покопаться всегда полезно, даже если не получится.
Кроме КодеВижн больше ни с чем не работал (ну и Баском), в любом случае попробовать испытать и другие компиляторы, может какой больше понравится и не только из-за встроенных библиотек.
Go to the top of the page
 
+Quote Post
Serj78
сообщение Jul 23 2008, 10:30
Сообщение #28


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



Цитата(Александр Куличок @ Jul 23 2008, 12:20) *
Применяли, только неявно. Serj78 ведь писал: "вызывается каждый раз функциями верхнего уровня,(вывод, установка знакоместа, стирание, пр.)". То есть она вызывается функциями lcd_init(), lcd_clear(), lcd_gotoxy(),lcd_putsf("ххх") и др., в том числе и функцией lcd_init().


осмелюсь поправить: функция lcd_init не вешает программу, там таймаут написан, если индикатор не подключен (нет ответа кажется, в течении 5мс) то она возвращает 0. проверьте это значение (например светодиодом на любой ноге) и будет ясно где косяк.
Go to the top of the page
 
+Quote Post
Ветал
сообщение Jul 23 2008, 11:26
Сообщение #29


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 22-03-08
Из: Харьков
Пользователь №: 36 149



Цитата(Serj78 @ Jul 23 2008, 13:30) *
осмелюсь поправить: функция lcd_init не вешает программу, там таймаут написан, если индикатор не подключен (нет ответа кажется, в течении 5мс) то она возвращает 0. проверьте это значение (например светодиодом на любой ноге) и будет ясно где косяк.


Контроллер выставляет сигнал RD, потом E после чего наступает зависание. Все остальные ножки в нуле. Можно сделать вывод, что ожидается чтение.
Нашел описание для упомянутого выше НВ44780 http://files.lv-soft.info/Integrated-circu...hd44780_rus.pdf В нем по временной диаграмме контроллер должен сбросить сигнал E в ноль и по спадающему фронту прочитать данные с шины. Но E находится в 1 постоянно (смотрел осциллографом), значит он не пытается считать. Или же другой вариант: после нескольких безуспешных попыток, которые я не успеваю заметить пока сбрасываю, контроллер перестает считывать по какой-то причине.
Как думаете, где косяк?
Go to the top of the page
 
+Quote Post
Stas_R
сообщение Jul 23 2008, 11:30
Сообщение #30





Группа: Участник
Сообщений: 12
Регистрация: 18-10-05
Из: г.Донецк
Пользователь №: 9 806



В папке \cvavr\lib\ есть файл LCD.lib который является текстовым на С с ASM вставками. В нем описаны все процедуры работы с LCD.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 23 2008, 11:36
Сообщение #31


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Ветал @ Jul 23 2008, 17:26) *
Как думаете, где косяк?


А JTAG-то — отключили?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Ветал
сообщение Jul 23 2008, 11:46
Сообщение #32


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 22-03-08
Из: Харьков
Пользователь №: 36 149



Цитата(AHTOXA @ Jul 23 2008, 14:36) *
А JTAG-то — отключили?

Я уже перебрался на порт А =)
На счет JTAG я уже отвечал, с ним еще не работал

Цитата(Stas_R @ Jul 23 2008, 14:30) *
В папке \cvavr\lib\ есть файл LCD.lib который является текстовым на С с ASM вставками. В нем описаны все процедуры работы с LCD.

Можно подредактировать и сделать процедуру обмена как на Баскоме - без чтения с ЛСД?
Go to the top of the page
 
+Quote Post
Stas_R
сообщение Jul 23 2008, 12:06
Сообщение #33





Группа: Участник
Сообщений: 12
Регистрация: 18-10-05
Из: г.Донецк
Пользователь №: 9 806



Можно немного модернизировать LCD.lib. Там есть такое описание
#asm
.equ __lcd_direction=__lcd_port-1
.equ __lcd_pin=__lcd_port-2
.equ __lcd_rs=0
.equ __lcd_rd=1
.equ __lcd_enable=2
.equ __lcd_busy_flag=7
#endasm

__lcd_busy_flag используется только в _lcd_ready() замените
sbrc r26,__lcd_busy_flag
rjmp __lcd_busy
на задержку вставте несколько _lcd_delay(); если есть осцилограф посмотрите длительности по нему.
Удачи.

Сообщение отредактировал Stas_R - Jul 23 2008, 12:07
Go to the top of the page
 
+Quote Post
Ветал
сообщение Jul 23 2008, 12:53
Сообщение #34


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 22-03-08
Из: Харьков
Пользователь №: 36 149



Цитата(Stas_R @ Jul 23 2008, 15:06) *
Можно немного модернизировать LCD.lib. Там есть такое описание
#asm
.equ __lcd_direction=__lcd_port-1
.equ __lcd_pin=__lcd_port-2
.equ __lcd_rs=0
.equ __lcd_rd=1
.equ __lcd_enable=2
.equ __lcd_busy_flag=7
#endasm


Здесь задается к какому пину порта какой вывод ЛСД должен подключаться?


Цитата(Stas_R @ Jul 23 2008, 15:06) *
__lcd_busy_flag используется только в _lcd_ready() замените
sbrc r26,__lcd_busy_flag
rjmp __lcd_busy
на задержку вставте несколько _lcd_delay(); если есть осцилограф посмотрите длительности по нему.
Удачи.


Что на что менять, честно говоря, не понял =)
Go to the top of the page
 
+Quote Post
sKWO
сообщение Jul 23 2008, 18:45
Сообщение #35


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Цитата(Ветал @ Jul 23 2008, 15:53) *
Что на что менять, честно говоря, не понял =)

Вам предлагают забить на ожидание готовности от ЖКИ, и сделать задержки больше чем по даташиту на Ваш ЖКИ.

Цитата(Ветал @ Jul 23 2008, 15:53) *
Здесь задается к какому пину порта какой вывод ЛСД должен подключаться?

это определения линий, про порт здесь ничего не сказанно


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
Ветал
сообщение Jul 24 2008, 11:11
Сообщение #36


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 22-03-08
Из: Харьков
Пользователь №: 36 149



Уважаемые друзья!
Сегодня проблема была решена. Библиотеки правда не редактировал. Деревенским методом навешал проводов, так, чтоб не резать дорог на плате, по схеме из Хелпа CodeVision. ЛСД выдал то, что от него просили. Проблема была аппаратная. Подвесил к порту С, JTAG не мешает.
Единственное, не хочет писать на второй строке . Поковыряю, может найду в чем тут дело. И функция lcd_gotoxy(unsigned char x, unsigned char y) не управляет координатыами курсора, а начинает писать с начала верхней строки.

Вопрос снят, lcd_gotoxy() работает. Забыл, что программисты начинает считать с нуля )))
Go to the top of the page
 
+Quote Post
Metallist64
сообщение Jul 24 2008, 18:06
Сообщение #37


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 29-01-08
Пользователь №: 34 558



Друзья!
Помогите пожалуйста в моем смежном вопросе.
Подключил свои LCD 16x2.
Но при выводе строк наблюдается следующая фигня.
0-я строка выводится замечательно.
1-я постоянно подмигивает.
я подгонял задержку после вывода 0-й строки но все равно видно моргание.
Как вообще корректно выводить 2-е строки на LCD подскажите пожалуйтса.
Вот функция отображения :

void render_menu_new(p_menu p_item_name,unsigned char* p_poz_menu)
{
unsigned char adc[16];
lcd_clear();
lcd_puts(p_item_name[*p_poz_menu]->menu_name); // здесь выводится первая строка только текст
lcd_gotoxy(0,1);
sprintf(adc,"спецификаторы", вычилсения)
lcd_puts(adc); // вторая строка всегда мигает (выводит преобразование АЦП и значение ШИМ*коэфф)
delay_ms(250);
}

Помогите чем сможете или в книжку ткните.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 24 2008, 18:16
Сообщение #38


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Metallist64 @ Jul 25 2008, 00:06) *
...


Попробуйте убрать
lcd_clear();
тогда будет менее заметно. (Не забудьте только дополнить все пункты меню пробелами справа, и после lcd_puts(adc); добавьте lcd_puts(" ")wink.gif

Ну и числа, меняющиеся через 250 мс - сложно воспринимаются, я бы увеличил интервал.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Metallist64
сообщение Jul 24 2008, 18:29
Сообщение #39


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 29-01-08
Пользователь №: 34 558



Забавно!
Но помогло!
Большое спасибо!
А без пробелов в конце 1-й строки вылазит начало следующего пункта :-)
Получается lcd_clear() можно неиспользовать???
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 24 2008, 18:35
Сообщение #40


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Metallist64 @ Jul 25 2008, 00:29) *
Забавно!
Но помогло!
Большое спасибо!
А без пробелов в конце 1-й строки вылазит начало следующего пункта :-)
Получается lcd_clear() можно неиспользовать???


Конечно, зачем его использовать, если вы всё равно весь экран перерисовываете заново? smile.gif
К тому же, не исключён вариант, что lcd_clear() тупо заполняет экран пробелами...


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Metallist64
сообщение Jul 24 2008, 19:13
Сообщение #41


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 29-01-08
Пользователь №: 34 558



все конечно хорошо, а вот 0-я строка перестала обновляться.
1-я в порядке.В чем бага???
Подскажите пожалуйста.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 24 2008, 19:36
Сообщение #42


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Metallist64 @ Jul 25 2008, 01:13) *
все конечно хорошо, а вот 0-я строка перестала обновляться.
1-я в порядке.В чем бага???
Подскажите пожалуйста.


Дык, добавьте перед выводом пункта меню
lcd_gotoxy(0,0);
Раньше это делала за вас ф-я lcd_clear().


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Metallist64
сообщение Jul 25 2008, 12:45
Сообщение #43


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 29-01-08
Пользователь №: 34 558



Согласен!
Спасибо!
Сегодня днем только дошло,что надо курсор переводить на другую позицию smile.gif
Утро вечера мудренее!!!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 14:01
Рейтинг@Mail.ru


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