SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проблема
Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб
Спасибо за ссылку на книгу.
МитяРа дал мне ссылку на главу с примером на Си для силабс 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 пригласить разобраться с этим делом.
МитяРа дал мне ссылку на главу с примером на Си для силабс 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 пригласить разобраться с этим делом.
- Реклама
Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб
PRT2CF = 0xFF; с этим разобрался. это особенность конфигурации серии контроллеров.
Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб
Ясно. Задержку в 10 мс с параметром DDD(2450) я проверил в IAR Workbench. У силабовского IDE нет счетчика циклов процессора, что нужно для реализации программной задержки как у Вас, или я чего-то не знаю? МитяРа что думаете? Поэтому и интересовался как это сделали Вы. Проще всего задержки программировать с помошью таймеров МК.
Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб
т.е. фактически он "задержку" мог пропустить? буду делать с таймером
Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб
Да нет, МК задержку не пропустил, конечно. Просто я не уверен, можно-ли в силабовском IDE посмотреть сколько циклов занимает программная задержка. По крайней мере я не знаю как (МитяРа?) В IDE от IAR можно. Посмотрите диассемблированный вариант своей C- программы, место где делается задержка. Там черт ногу сломит. А с таймером проще получить гарантированную задержку.
- Реклама
Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб
я опять ковырялся с примером силабовским http://www.silabs.ru/pubs/G14.pdf
и там была вот такое:
void Time (unsigned Delay) // Подпрограмма временной задержки
{
while (Delay--)
WDT();
}
где WDT(); - это:
void WDT (void) // Перезапуск охранного таймера
{
WDTCN = 0xA5;
}
и там была вот такое:
void Time (unsigned Delay) // Подпрограмма временной задержки
{
while (Delay--)
WDT();
}
где WDT(); - это:
void WDT (void) // Перезапуск охранного таймера
{
WDTCN = 0xA5;
}
Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб
Вот тут, только на АСМе: http://www.silabs.ru/pubs/Delay%2024000000.rarVlad0o писал(а):функцию задержки я долго искал как сделать. (частота осциллятора 24.5 МГц)
Сам не знаю, т.к. пользуюсь ещё Cygnal-овским IDE-шником..Ser60 писал(а): По крайней мере я не знаю как В IDE от IAR можно.
Миллисекундные задержки думаю, что лучше в программе делать, без использования таймеров..
Когда идёт вывод на индикатор МК всё равно больше ничего не делает, а вынужден тупо ждать тормозной индикатор..
Большая точность формирования задержек для индикатора совсем не нужна, главное что-бы было "не менее чем"...
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб
сегодня опять возился с ЛСД.... безрезультатно
Посмотрите, пожалуйста, инициализации может я именно в ней косячу:
(
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;
Посмотрите, пожалуйста, инициализации может я именно в ней косячу:
(
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;
Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб
постоянно горит верхняя строка 
Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб
У меня работал следующий алгоритм инициализации:
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;
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;
Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб
Блин, че то не работает все равно. Взял ваш алгоритм. вроде правильно все сделал. и функцию отправки полубайт исправил.. (правда задержки большие)
Я еще решил проверить не выкидывает ли "задержки" компилятор.. в общем примерно так заделал:
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 ниче не показывает....
Я думаю надо уточнить распиновку.
Я еще решил проверить не выкидывает ли "задержки" компилятор.. в общем примерно так заделал:
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 ниче не показывает....
Я думаю надо уточнить распиновку.
Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб
Первые 3 посылки в ЛЦД должны быть не 0х30, а 0х03.
Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб
... еще после посылок 0х03 нужна задержка в 5 мс. Если 2450 дает задержку в 10 мс (проверил на симуляторе в IAR IDE), то Вам надо 1250 вместо 245.
Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб
Спасибо. завтра я на проверю.
Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб
вот что получилось. но все равно не работает.
#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;
}
ЛЦД не показывает
#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;
}
ЛЦД не показывает
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]
Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб
хм. порты все таки проверить. до меня же ЛСД показывал время. странно. и сейчас у него верхняя строчка горит.
но я все равно проверю. спасибо.
но я все равно проверю. спасибо.
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 Не могу понять в чем проб
Эта задержка не будет работать с включенной оптимизацией в компиляторе и неправильно посчитано 1 сек. это не "задержка 245000=1 секунда", а 24500000.Vlad0o писал(а):Код: Выделить всё
..... void Delay (unsigned long); //задержка 245000=1 секунда ...... void Delay (unsigned long n) //задержка { while(n--); //delay }
Так точно задержка будет работать и удобней пользоваться
Код: Выделить всё
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мс
}
Кстати, функцию задержки можно элементарно проверить "на глаз" мигайте светодиодом каждый раз после вызова Delay (1000); должно быть примерно раз в сек.
Крылья... Крылья.... Хвост! 
Нестрашно не знать, страшно не стремиться знать.

Нестрашно не знать, страшно не стремиться знать.
Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб
Здравствуйте.
я тут еще на силабовском форуме описал свою проблему. Там тоже никому не понравилась фишка с задержкой. Мне тоже там посоветовали избавиться от "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: спасибо, я обязательно проверю это вариант задержки
ЗЫ Это дело я не забросил. результат непременно напишу
я тут еще на силабовском форуме описал свою проблему. Там тоже никому не понравилась фишка с задержкой. Мне тоже там посоветовали избавиться от "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: спасибо, я обязательно проверю это вариант задержки
ЗЫ Это дело я не забросил. результат непременно напишу


