SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проблема

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Vlad0o »

Спасибо за ссылку на книгу.
МитяРа дал мне ссылку на главу с примером на Си для силабс http://www.silabs.ru/pubs/G14.pdf
вот там идет инициализация порта Р2 присвоением PRT2CF=0xFF (push-pull). с силабовским IDE идет утилиты для конфигурации так сказать периферии (порты, таймеры и т.д.), так вот в этой утилите перевод в режим push-pull осуществляется вот такP1MDOUT = 0xFF, вот я немного в растерянности. это одно и тоже и все зависит от серии контроллера или что другое.

функцию задержки я долго искал как сделать. (частота осциллятора 24.5 МГц) ddd(245000) ~ 1 секуннда (плюс от 100наносекунд до 1 миллисекунды издержки компилятора). я так понимаю лучше передержать задержку, чем недодержать.

попробую еще Chip115 пригласить разобраться с этим делом.
Реклама
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Vlad0o »

PRT2CF = 0xFF; с этим разобрался. это особенность конфигурации серии контроллеров.
Реклама
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Ser60 »

Ясно. Задержку в 10 мс с параметром DDD(2450) я проверил в IAR Workbench. У силабовского IDE нет счетчика циклов процессора, что нужно для реализации программной задержки как у Вас, или я чего-то не знаю? МитяРа что думаете? Поэтому и интересовался как это сделали Вы. Проще всего задержки программировать с помошью таймеров МК.
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Vlad0o »

т.е. фактически он "задержку" мог пропустить? буду делать с таймером
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Ser60 »

Да нет, МК задержку не пропустил, конечно. Просто я не уверен, можно-ли в силабовском IDE посмотреть сколько циклов занимает программная задержка. По крайней мере я не знаю как (МитяРа?) В IDE от IAR можно. Посмотрите диассемблированный вариант своей C- программы, место где делается задержка. Там черт ногу сломит. А с таймером проще получить гарантированную задержку.
Реклама
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Vlad0o »

я опять ковырялся с примером силабовским http://www.silabs.ru/pubs/G14.pdf
и там была вот такое:

void Time (unsigned Delay) // Подпрограмма временной задержки
{
while (Delay--)
WDT();
}

где WDT(); - это:


void WDT (void) // Перезапуск охранного таймера
{
WDTCN = 0xA5;
}
Реклама
Аватара пользователя
МитяРа
Модератор
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение МитяРа »

Vlad0o писал(а):функцию задержки я долго искал как сделать. (частота осциллятора 24.5 МГц)
Вот тут, только на АСМе: http://www.silabs.ru/pubs/Delay%2024000000.rar
Ser60 писал(а): По крайней мере я не знаю как В IDE от IAR можно.
Сам не знаю, т.к. пользуюсь ещё Cygnal-овским IDE-шником..

Миллисекундные задержки думаю, что лучше в программе делать, без использования таймеров..
Когда идёт вывод на индикатор МК всё равно больше ничего не делает, а вынужден тупо ждать тормозной индикатор..
Большая точность формирования задержек для индикатора совсем не нужна, главное что-бы было "не менее чем"...
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Vlad0o »

сегодня опять возился с ЛСД.... безрезультатно

Посмотрите, пожалуйста, инициализации может я именно в ней косячу:

(

void lcd_init(void)
{
LCD_RS = 0; // ставим РС в ноль

Delay(2450);// задержка после включения, не менее 40 мс (я поставил 50мс)
Delay(2450);//
Delay(2450);//
Delay(2450);//
Delay(2450);//

LCD_D4 = 1;//
LCD_D5 = 1; // эти две строчки задают команду 0х03

LCD_STROBE; // #define LCD_STROBE ((LCD_EN = 1),(LCD_EN=0)) начать и прекратить запись (первая отправка команды 0х03)
Delay(2450); задержка 10мс

//LCD_STROBE; // init! // #define LCD_STROBE ((LCD_EN = 1),(LCD_EN=0)) начать и прекратить запись (ВТОРАЯ ОТПРАВКА команды 0х03)
//Delay(2450);

LCD_STROBE; // init! // #define LCD_STROBE ((LCD_EN = 1),(LCD_EN=0)) начать и прекратить запись (ТРЕТЬЯ ОТПРАВКА команды 0х03)
Delay(2450);

LCD_D4 = 0; // выход Д4 = 0 (т.е. команда 0х02)
LCD_STROBE; // #define LCD_STROBE ((LCD_EN = 1),(LCD_EN=0)) начать и прекратить запись (отправка команды 0х02)
Delay(2450); задержка 10 мс (а надо всего 2 мс)

lcd_write(0x28);// 4 bit режим, 2х16, размер символа 5x8
lcd_write(0x0C);// включить ЛСД
lcd_write(0x06);// режим ввода
lcd_write(0x01);// очистка экрана и сброс курсора
}



lcdport = (lcdport & 0xF0) | (c >> 4); //lcdport это (d4 - d7)
LCD_EN = 1;
Delay(245);
LCD_EN = 0;
//LCD_STROBE;
lcdport = (lcdport & 0xF0) | (c & 0x0F);
//LCD_STROBE;
LCD_EN = 1;
Delay(245);
LCD_EN = 0;


Delay(2450);
Delay(2450);
Delay(2450);
Delay(2450);
}


На всякий случай (вдруг надо время) я менял LCD_STROBE ((LCD_EN = 1),(LCD_EN=0)) на нижеследующее:

Delay(245);
LCD_EN = 1;
Delay(245);
LCD_EN = 0;
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Vlad0o »

постоянно горит верхняя строка :cry:
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Ser60 »

У меня работал следующий алгоритм инициализации:

1. Задержка на 15 мсек после подацчи питания.
2. Послать 0х03
задержка 5 мсек
послать 0х03
задержка 5 мсек
послать 0х03
задержка 5 мсек
3. Послать 0х02 ; 4-bit mode
4. Послать команду 0x28 ; 2-line mode
5. Послать команду 0х01 ; clear display
задержка 5 мсек
6. Послать команду 0x06 ; cursor move after each char
7. Послать команду 0x0E ; turn on LCD and enable cursor

Посла каждой команды задержка в 200 мксек.

В Вашей программе мне видится косяк в следующей строчке при посылке младшего байта
lcdport = (lcdport & 0xF0) | (c >> 4); //lcdport это (d4 - d7)
Сначала надо засылать младшие 4 бита, а потом 4 старшие.
Если с это данные, кот. надо послать в ЛЦД, я-бы написал засылку байта так:

lcdport = (c & 0x0F) << 4; //send lower-order nibble
LCD_EN = 1;
Delay(5);
LCD_EN = 0; //LCD_STROBE;
lcdport = (c & 0xF0); // send higher-order nibble
LCD_EN = 1;
Delay(5);
LCD_EN = 0;
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Vlad0o »

Блин, че то не работает все равно. Взял ваш алгоритм. вроде правильно все сделал. и функцию отправки полубайт исправил.. (правда задержки большие)
Я еще решил проверить не выкидывает ли "задержки" компилятор.. в общем примерно так заделал:

void lcd_init(void)
{
PCA0MD &= ~0x40;
OSCILLATOR_Init ();
PORT_Init ();



LCD_RS = 0; // write control bytes


LED2 = 1;

Delay(2450);// power on delay
Delay(2450);// power on delay
Delay(2450);// power on delay
Delay(2450);// power on delay
Delay(2450);// power on delay
LED2 = 0;
lcd_write(0x30);
LED1 = 1;
Delay(245);
LED1 = 0;
lcd_write(0x30);
LED1 = 1;
Delay(245);
LED1 = 0;
lcd_write(0x30);
LED1 = 1;
Delay(245);
LED1 = 0;

lcd_write(0x02);
LED1 = 0;
Delay(245);
LED1 = 1;
lcd_write(0x01);
LED1 = 0;
Delay(245);
LED1 = 1;
lcd_write(0x06);
LED1 = 0;
Delay(245);
LED1 = 1;
lcd_write(0x0E);
LED1 = 0;
Delay(245);
LED1 = 1;

}

Релюхи трещат, светодиоды мигают.... LCD ниче не показывает....

Я думаю надо уточнить распиновку.
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Ser60 »

Первые 3 посылки в ЛЦД должны быть не 0х30, а 0х03.
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Ser60 »

... еще после посылок 0х03 нужна задержка в 5 мс. Если 2450 дает задержку в 10 мс (проверил на симуляторе в IAR IDE), то Вам надо 1250 вместо 245.
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Vlad0o »

Спасибо. завтра я на проверю.
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Vlad0o »

вот что получилось. но все равно не работает.

#include "C8051F310.h"

// Pin Declarations
//----------------------
#define lcdport P3 // data port (P3^1;P3^2;P3^3;P3^4)


sbit LCD_RS = P1^3;
sbit LCD_EN = P1^4;

//sbit LCD_D4 = P3^1;
//sbit LCD_D5 = P3^2;
//sbit LCD_D6 = P3^3;
/sbit LCD_D7 = P3^4;

sbit LED3 = P2^3;
sbit LED2 = P2^2;//LEDs for delay test
sbit LED1 = P2^1;

//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------
void lcd_init(void); //LCD init
void OSCILLATOR_Init (void);
void PORT_Init (void);

//lcd fuctions
void lcd_write(unsigned char);
void lcd_clear(void);
void lcd_puts(unsigned char * );
void lcd_putch(unsigned char );
void lcd_goto1(unsigned char );
void lcd_goto2(unsigned char );
void Delay (unsigned long); //задержка 245000=1 секунда





//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------

void main (void)
{

lcd_init(); //initialize lcd
lcd_goto1(1); // line1 + 1st place for character

lcd_putch('H');// display ONE character

}


//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// OSCILLATOR_Init
//-----------------------------------------------------------------------------
void OSCILLATOR_Init (void)
{
OSCICN |= 0x03; // Configure internal oscillator for
// its maximum frequency (24.5 Mhz)
}

//-----------------------------------------------------------------------------
// PORT_Init
void PORT_Init (void)
{


P1MDOUT = 0x18; //P1.4, P1.3
P2MDOUT = 0x0E;
P3MDOUT = 0x1E; // P3.1, P3.2, P3.3, P3.4
XBR1 = 0x40; // Enable crossbar and enable
// weak pull-ups
}


void Delay (unsigned long n) //задержка
{
while(n--); //delay
{
}
}

/////////////////////////////////////
////////////////LCD//////////////////
////////////////////////////////////

/* write a byte to the LCD in 4 bit mode */

void lcd_write(unsigned char c)
{

lcdport = (c & 0x0F) << 4; //send lower-order nibble
LCD_EN = 1;
LED3 = 0;
Delay(50);//200microseconds
LED3 = 1;
LCD_EN = 0; //LCD_STROBE;
lcdport = (c & 0xF0); // send higher-order nibble
LCD_EN = 1;
LED3 = 0;
Delay(50);//200microseconds
LED3 = 1;
LCD_EN = 0;//LCD_STROBE;

}




/* write one character to the LCD */

void lcd_putch(unsigned char c)
{
LCD_RS =1; // write characters

lcd_write(c);
}





/*
* Go to the specified position in line 1
*/

void lcd_goto1(unsigned char pos)
{
LCD_RS = 0;

lcd_write(0x80 + pos);
}


/*
* Go to the specified position in line 2
*/

void lcd_goto2(unsigned char pos)
{
LCD_RS = 0;

lcd_write(0xC0 + pos);
}



/* initialise the LCD - put into 4 bit mode */

void lcd_init(void)
{

PCA0MD &= ~0x40; //watchdog
OSCILLATOR_Init ();
PORT_Init ();



LCD_RS = 0; // write control bytes


LED2 = 1;

Delay(3675);// power on delay 15ms

LED2 = 0;
lcd_write(0x03);
LED1 = 1;
Delay(1250);//5ms
LED1 = 0;
lcd_write(0x03);
LED1 = 1;
Delay(1250);//5ms
LED1 = 0;
lcd_write(0x03);
LED1 = 1;
Delay(1250);//5ms
LED1 = 0;

lcd_write(0x02);
LED1 = 0;
Delay(50);//200microseconds
LED1 = 1;
lcd_write(0x01);
LED1 = 0;
Delay(1250);//5ms
LED1 = 1;
lcd_write(0x06);
LED1 = 0;
Delay(50);//200microseconds
LED1 = 1;
lcd_write(0x0E);
LED1 = 0;
Delay(50); //200microseconds
LED1 = 1;
}

ЛЦД не показывает
Аватара пользователя
МитяРа
Модератор
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение МитяРа »

Vlad0o, напиши простою "прогу тестилку" которая выдаёт импульсы на линии порта к которым у тя индикатор подключён..
И посмотри, там вообще импульсы-то выдаются или нет.. Может у тя порт всё-таки не настроен, а ты с программой мучаешься..
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Vlad0o »

хм. порты все таки проверить. до меня же ЛСД показывал время. странно. и сейчас у него верхняя строчка горит.
но я все равно проверю. спасибо.
Аватара пользователя
МитяРа
Модератор
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение МитяРа »

Как там, Vlad0o, есть подвижки ?
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Аватара пользователя
Left Radio
Прорезались зубы
Сообщения: 235
Зарегистрирован: Пт авг 22, 2008 03:58:30
Откуда: Union Soviet Socialist Republics
Контактная информация:

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Left Radio »

Vlad0o писал(а):

Код: Выделить всё

.....
void Delay (unsigned long); //задержка 245000=1 секунда
......

void Delay (unsigned long n) //задержка
{
         while(n--); //delay
}
Эта задержка не будет работать с включенной оптимизацией в компиляторе и неправильно посчитано 1 сек. это не "задержка 245000=1 секунда", а 24500000.

Так точно задержка будет работать и удобней пользоваться :) :

Код: Выделить всё


volatile unsigned long tmpCnt;

void Delay (unsigned int ms); //задержка в миллисекундах
......

void Delay (unsigned int ms)
{
     for (tmpCnt = 0; tmpCnt<(mS * [b]25000[/b]); tmpCnt++);
}

/*пример использования*/
void main (void) 
{
     Delay (50);  //задержка в 50мс
}
P.S. 25000(выделил жирным в коде) это количество циклов в одну миллисекунду (1мс/40нс = 25000) но нужно учитывать что МК инкрементирует long не за одну команду так что можно смело ставить раз в 10 меньше - 2500, это и будет примерная задержка в 1мс.
Кстати, функцию задержки можно элементарно проверить "на глаз" мигайте светодиодом каждый раз после вызова Delay (1000); должно быть примерно раз в сек. :)
Крылья... Крылья.... Хвост! Изображение
Нестрашно не знать, страшно не стремиться знать.
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Vlad0o »

Здравствуйте.
я тут еще на силабовском форуме описал свою проблему. Там тоже никому не понравилась фишка с задержкой. Мне тоже там посоветовали избавиться от "delay loop". и переходить на таймеры. но с таймерами сложнее) сейчас разбираюсь с таймерами.
Немного порыскав там, я перешел сюда http://8052.com/ . там таких как я, у которых ниче с ЛСД не получается много)
Попытался проверить вот эту часть на свободном порту P2 там где у меня реле стоят. в итоге пришел к выводу что все таки в этой части получается так что Delay() напрочь убивают. задержку я чуть ли не на пару секунд ставил, а светодиоды релюшек на доли секунды вспыхивали и гасли, причем все одновременно.


lcdport = (c & 0x0F) << 4; //send lower-order nibble
LCD_EN = 1;
Delay(50);//200microseconds
LCD_EN = 0; //LCD_STROBE;
lcdport = (c & 0xF0); // send higher-order nibble
LCD_EN = 1;
Delay(50);//200microseconds
LCD_EN = 0;//LCD_STROBE;

2 Left Radio: спасибо, я обязательно проверю это вариант задержки :)


ЗЫ Это дело я не забросил. результат непременно напишу :)
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»