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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> 16S2D, LCD
PaulB
сообщение Sep 7 2007, 10:35
Сообщение #16


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

Группа: Участник
Сообщений: 147
Регистрация: 20-08-06
Пользователь №: 19 681



Переделал схему, сделал на меге16, но вот всё равно прошивка неработает что не так?

Код
#include <MEGA16.h>
#include <delay.h>

#define D7        PA1
#define D6        PA0
#define D5        PA3
#define D4        PA2
#define E         PC5
#define RW        PC6
#define RS        PC4


// определяем светодиод
#define LED_OFF (PORTD |= (1<<6))
#define LED_ON (PORTD &= ~(1<<6))


#define SET_D7        (PORTA |= (1<<3))
#define SET_D6        (PORTA |= (1<<2))
#define SET_D5        (PORTA |= (1<<1))
#define SET_D4        (PORTA |= (1<<0))

//#define SET_RW (PORTB |= (1<<5))
//#define CLR_RW (PORTB &= ~(1<<5))
#define SET_RS (PORTA |= (1<<6))
#define CLR_RS (PORTA &= ~(1<<6))
#define SET_E  (PORTA |= (1<<4))
#define CLR_E  (PORTA &= ~(1<<4))

// ЖКИ подключен младшему полубайту порта PB!
#define WRITE_HIGH_NIBBLE(x)  ( PORTA = (PORTA & 0xF0) | ((x) >> 4) )
#define WRITE_LOW_NIBBLE(x) ( PORTA = (PORTA & 0xF0) | ((x) & 0x0F) )

#define MKS_PBYT 2 /* время на передачу полубайта на дисплей */
#define MKS_BYTE 40 /* время после передачи байта на дисплей */

#define PAGE0 0x28 // Первая кодовая страница
#define PAGE1 0x2A // Вторая кодовая страница

//**************************************
//          P R O T O T Y P E
//**************************************

void BLINK_LED (void);
void WRITE_LCD(char);
void _E (void);
void _Epb (void);
void INIT_LCD(void);
void Delay_50ms(int t);
void CLR_LCD();
    
  int main(void)
{

  DDRA  = 0xff;  // назначаем все линии порта B на выход
  PORTA = 0x00;  // и устанавливаем на них низкий уровень
  DDRD  = 0xff;  // назначаем все линии порта D на вывход
  PORTD = 0x00;  // и устанавливаем на них низкий уровень
  LED_OFF;

    BLINK_LED (); //Вспышка светодиода на порту
    INIT_LCD(); //ИНИЦИАЛИЗАЦИЯ

while(1);
}

/**********************************************************
Имя функции:    void Delay_50ms(int t)
Описание:       Задержка, кратная 50 ms
Вход:           t -> Число повторов цикла
Выход:          нет
Примечание:     Arsen, редакция от 17.04.2006
**********************************************************/

void Delay_50ms(int t) {
  unsigned int i;
  for(i=0; i<t; i++) {
  delay_ms(50);
  }
}
/**********************************************************
Имя функции:    void BLINK_LED(void)
Описание:       Вспышка светодиода на порту PD6
Вход:           нет
Выход:          нет
Примечание:     Arsen, редакция от 17.04.2006
**********************************************************/

void BLINK_LED (void)
{
    Delay_50ms(50);
    LED_ON; // Зажигаем LED
    Delay_50ms(5);  // пауза 250 ms
    LED_OFF; // гасим LED
    Delay_50ms(15);  // Всего 500 ms
//    Delay_50ms(50);  // с этой строкой 1 сек.
}

/**********************************************************
Имя функции:    void CLR_LCD(void)
Описание:       Очистка экрана ЖКИ
Вход:           нет
Выход:          нет
Примечание:     Arsen, редакция от 17.05.2006
**********************************************************/

void CLR_LCD()
{
WRITE_LCD (0x01);
delay_ms(3);
}
          
/**********************************************************
Имя функции:    void _E(void)
Описание:       выдача сигнала "Е" на ЖКИ с полным временем
                ожидания (после выдачи всей команды)
Вход:           нет
Выход:          нет
Примечание:     Arsen, редакция от 17.04.2006
**********************************************************/

void _E (void)
{
    delay_us(MKS_PBYT);
    SET_E;
    delay_us(MKS_PBYT);
    CLR_E;
    delay_us(MKS_BYTE);        //пауза между командами
}    
  

/**********************************************************
Имя функции:    void _Epb(void)
Описание:       выдача сигнала "Е" на ЖКИ с укороченным временем
                ожидания (между вводом полубайтов)
Вход:           нет
Выход:          нет
Примечание:     Arsen, редакция от 17.04.2006
**********************************************************/

void _Epb (void)
{
     delay_us(MKS_PBYT);
    SET_E;
     delay_us(MKS_PBYT);
    CLR_E;
     delay_us(MKS_PBYT);        // пауза между полубайтами
}
    
/**********************************************************
Имя функции:    void WRITE_LCD(unsigned char ch)
Описание:       Запись байта команды в ЖКИ
Вход:           ch -> байт для записи
Выход:          нет
Примечание:     Arsen, редакция от 17.04.2006
**********************************************************/

void WRITE_LCD(char value) {
  delay_us(MKS_PBYT);
    WRITE_HIGH_NIBBLE(value);
    _Epb();
    WRITE_LOW_NIBBLE(value);
    _E();
  delay_us(MKS_BYTE);
}


/**********************************************************
Имя функции:    void INIT_LCD(void)
Описание:       Начальная инициализация ЖКИ
Вход:           нет
Выход:          нет
Примечание:     Arsen, редакция от 17.05.2006
**********************************************************/

void INIT_LCD(void)
{
PORTA = 0x00;
delay_ms(MKS_BYTE); // ждем более 30 мс

// Трижды устанавливаем 8-битный режим - начальная инициализация
    SET_D5;
    SET_D4;    // команда "8-битный режим"
    _E();
    _E();
    _E();

/***/

    PORTA = 0x00;
    SET_D5;           // Переводим в 4-битный режим
    _E();

/***************************************************/

WRITE_LCD(0x2A);
WRITE_LCD(0x0C);
CLR_LCD();
WRITE_LCD(0x06);


}


--------------------
Мой канал: CybernetSystems
Go to the top of the page
 
+Quote Post
Serg_greS
сообщение Sep 12 2007, 12:38
Сообщение #17


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

Группа: Новичок
Сообщений: 85
Регистрация: 13-01-05
Из: Москва
Пользователь №: 1 922



Попробуйте так:

WRITE_LCD(0x2e);
WRITE_LCD(0x0f);
WRITE_LCD(0x01);
WRITE_LCD(0x06);
WRITE_LCD(0x02);


вместо
WRITE_LCD(0x2A);
WRITE_LCD(0x0C);
CLR_LCD();
WRITE_LCD(0x06);

и кстати в мелтовском индикаторе кодовые будут не так:
#define PAGE0 0x28 // Первая кодовая страница
#define PAGE1 0x2A // Вторая кодовая страница

а вот так:
#define PAGE0 0x2C // Первая кодовая страница
#define PAGE1 0x2E // Вторая кодовая страница

возможно что проблема именно тут,

0x2E, это та, которая соответствует win1251

если надо, то вечером могу выложить проект для IAR на М88 точно работающий, модифицированный из этого же IronFelix`а

Сообщение отредактировал Serg_greS - Sep 12 2007, 12:26
Go to the top of the page
 
+Quote Post
PaulB
сообщение Oct 2 2007, 05:46
Сообщение #18


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

Группа: Участник
Сообщений: 147
Регистрация: 20-08-06
Пользователь №: 19 681



Всё мучаюсь!
Вот код программы, Проверял в протеусе - она работает.

----------------------------------------------------------

/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.3 Standard
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 02.10.2007
Author : F4CG
Company : F4CG
Comments:


Chip type : ATmega16
Program type : Application
Clock frequency : 4,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega16.h>
#include<delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=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
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=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
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
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);
#pragma rl+
lcd_gotoxy(0,0);
lcd_putsf("F");

PORTD.6=1;
delay_ms(50);
PORTD.6=0;
delay_ms(50);
while (1)
{
};
}
----------------------------------------------------------------------
Прошиваю- неработает. Проверял подключение МК к ЖК вроде тоже все нормально.
Я уже начинаю подазривать что ЖК нерабочий.
Что делать? sad.gif


--------------------
Мой канал: CybernetSystems
Go to the top of the page
 
+Quote Post
Serg_greS
сообщение Oct 2 2007, 05:57
Сообщение #19


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

Группа: Новичок
Сообщений: 85
Регистрация: 13-01-05
Из: Москва
Пользователь №: 1 922



Цитата
Я уже начинаю подазривать что ЖК нерабочий.Что делать?

работоспособность индикатора можно с помощью их софтинки от мелта h__p://melt.com.ru/work/display/330#check
если индикатор окажется рабочим, то тут только кривая инициализация

и вообще попробуйте в этом коде http://electronix.ru/forum/index.php?showt...id=301548&#
заменить WRITE_LCD(0x2A);
WRITE_LCD(0x0C);
CLR_LCD();
WRITE_LCD(0x06);

на
WRITE_LCD(0x2e);
WRITE_LCD(0x0f);
WRITE_LCD(0x01);
WRITE_LCD(0x06);
WRITE_LCD(0x02);

и
#define PAGE0 0x28 // Первая кодовая страница
#define PAGE1 0x2A // Вторая кодовая страница
на
#define PAGE0 0x2C // Первая кодовая страница
#define PAGE1 0x2E // Вторая кодовая страница

Сообщение отредактировал Serg_greS - Oct 2 2007, 06:00
Go to the top of the page
 
+Quote Post
D H
сообщение Oct 2 2007, 07:05
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 1-11-06
Пользователь №: 21 847



Прекрасно работает библиотека CodeVision с Мелтовским LCD. Используй ее.
Пример:

#asm
.equ __lcd_port=0x15 ;PORTC // LCD на PORTC
#endasm

#include <lcd.h>
lcd_init(16);
lcd_putsf("Initializing...");
lcd_gotoxy(0,0);
lcd_putsf("Ready ");

Библиотека для 4-х битного режима.
Разная маркировка наименований выводов у Melt и в документации CV. Подключается все по порядку выводов Melt.
Если перешел на мегу16, попробуй в 5-и вольтовом режиме. Не забудь контрастность повесить на землю, иначе ничего видно не будет.

Сообщение отредактировал D H - Oct 2 2007, 07:12
Go to the top of the page
 
+Quote Post
PaulB
сообщение Oct 2 2007, 09:45
Сообщение #21


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

Группа: Участник
Сообщений: 147
Регистрация: 20-08-06
Пользователь №: 19 681



Контрасность на землю завёл даже подсветку подключил (подсветка работает), а что за 5-и вольтовый режим?
В даташите на дисплей, А0-адресный сигнал, а обозначение RS идентично А0?

Кстате, а от чистота МК как то влияет на выводимый текст?


--------------------
Мой канал: CybernetSystems
Go to the top of the page
 
+Quote Post
PaulB
сообщение Oct 2 2007, 15:56
Сообщение #22


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

Группа: Участник
Сообщений: 147
Регистрация: 20-08-06
Пользователь №: 19 681



Вот обнаружил один момент: в то время когда происходит инициализация дисплея, его экран немного мерцает.
Ичтобы это означало?


--------------------
Мой канал: CybernetSystems
Go to the top of the page
 
+Quote Post
D H
сообщение Oct 3 2007, 12:18
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 1-11-06
Пользователь №: 21 847



Цитата(D H @ Oct 2 2007, 11:05) *
Прекрасно работает библиотека CodeVision с Мелтовским LCD. Используй ее.
Пример:

#asm
.equ __lcd_port=0x15 ;PORTC // LCD на PORTC
#endasm

#include <lcd.h>
lcd_init(16);
lcd_putsf("Initializing...");
lcd_gotoxy(0,0);
lcd_putsf("Ready ");

Библиотека для 4-х битного режима.
Разная маркировка наименований выводов у Melt и в документации CV. Подключается все по порядку выводов Melt.
Если перешел на мегу16, попробуй в 5-и вольтовом режиме. Не забудь контрастность повесить на землю, иначе ничего видно не будет.


В мануале CV, есть пример как подключать LCD.
A0=RS
R/W=RD
E=EN
Т.е. подключаем для моего примера так:
PortC.0=A0
PortC.1=R/W
PortC.2=E
PortC.4=DB4
PortC.5=DB5
PortC.6=DB6
PortC.7=DB7

1-й и 3-й LCD вывод GND
2-й LCD вывод +5в

Поставь для диагностики в программу зажигание светодиода, после выполнения операции. Увидишь, где косяк.
Все.
Go to the top of the page
 
+Quote Post
PaulB
сообщение Oct 3 2007, 14:08
Сообщение #24


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

Группа: Участник
Сообщений: 147
Регистрация: 20-08-06
Пользователь №: 19 681



Всё точно так же и у меня, даже светодиод стоит (гаснет когда заканчивается инициализация), вот только у меня LCD к порту А подключон.
>Вот обнаружил один момент: в то время когда происходит инициализация дисплея, его экран немного мерцает.
>Ичтобы это означало?

Код
#include <MEGA16.h>
#include<delay.h>
// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15;PORTA
#endasm
#include <lcd.h>

void main(void)
{

PORTD=0xFF;
DDRD=0xFF;

// LCD module initialization
lcd_init(16);
lcd_putsf("Initializing...");
lcd_putchar(0);

PORTD.6=1;
delay_ms(50);
PORTD.6=0;
delay_ms(50);
while (1);

}


--------------------
Мой канал: CybernetSystems
Go to the top of the page
 
+Quote Post
D H
сообщение Oct 3 2007, 18:28
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 1-11-06
Пользователь №: 21 847



Что значит "немного мерцает"? Зажигаются нижние строчки всех сегментов одновременно и сразу гаснут? Инициализация прошла.

Для порта А должно быть так:
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm

А у тебя в исходнике:
#asm
.equ __lcd_port=0x15;PORTA
#endasm
Согласно твоему исходнику, у тебя LCD подключен к порту C. Следовательно, инициализация у тебя _НЕ_ПРОХОДИТ_. Как у тебя светодиод гаснет по окончании инициализации ???

Сообщение отредактировал D H - Oct 3 2007, 18:29
Go to the top of the page
 
+Quote Post
PaulB
сообщение Oct 4 2007, 06:32
Сообщение #26


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

Группа: Участник
Сообщений: 147
Регистрация: 20-08-06
Пользователь №: 19 681



Мерцает сама подсветка одновременно с миганием светодиода, а сам экран попрежнему пуст sad.gif хоть точку какую нибудь вывел, я уже бы прыгал до потолка.

Код
#include <Mega16.h>
  #include <delay.h>

#asm
  .equ __lcd_port=0x1B;PORTA
#endasm
#include <lcd.h>

void main(void)
{

PORTD=0xFF;
DDRD=0xFF;

lcd_init(16);
lcd_putsf("Initializing...");

PORTD.6=1;
delay_ms(50);
PORTD.6=0;
delay_ms(50);

}

А в протеусе видно что после того как заканчивается инициализация и перед выводом надписи - светодиод гаснет.


--------------------
Мой канал: CybernetSystems
Go to the top of the page
 
+Quote Post
D H
сообщение Oct 4 2007, 08:27
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 1-11-06
Пользователь №: 21 847



Вот твой текст:
lcd_init(16);
Где здесь у тебя выключение светодиода???
lcd_putsf("Initializing...");
Не вижу.
Go to the top of the page
 
+Quote Post
PaulB
сообщение Oct 4 2007, 11:20
Сообщение #28


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

Группа: Участник
Сообщений: 147
Регистрация: 20-08-06
Пользователь №: 19 681



>Вот твой текст:
>lcd_init(16);
>Где здесь у тебя выключение светодиода???
>lcd_putsf("Initializing...");
>Не вижу.

Сам непонемаю, но так оно и есть.


--------------------
Мой канал: CybernetSystems
Go to the top of the page
 
+Quote Post
REGBIST11
сообщение Oct 4 2007, 16:37
Сообщение #29





Группа: Новичок
Сообщений: 2
Регистрация: 4-10-07
Пользователь №: 31 070



#include <Mega16.h>
#include <delay.h>
--------------------------------------------------------------------------------------------------------
#asm
.equ __lcd_port=0x1B;PORTA
#endasm ;
#include <lcd.h> ;

void main(void)
{
PORTD=0xFF;
DDRD=0xFF;
lcd_init(16);
while(1)
{
lcd_gotoxy(0,0);
lcd_putsf("Initializing...");
PORTD.6=1;
delay_ms(50);
PORTD.6=0;
delay_ms(50);
}
-------------------------------------------------------------------------------------------------------------------

Всем привет!
Я вот чуток изменил Ваш исходник. Попробуй его.. beer.gif
И ещё один совет : шину данных ( D4-D7) подтяни к +5 через рез ~5кОм yeah.gif
Да и ещё на счёт контрастности : 0 или +5 это две крайние точки,то есть при 0-контрастность 0 % а при 5В-контрастность 100% а нам необходимо что-то среднее... возьми переменный 10 кОм рез.и попробуй с ним. wassat.gif
}

Сообщение отредактировал REGBIST11 - Oct 4 2007, 16:54
Go to the top of the page
 
+Quote Post
PaulB
сообщение Oct 5 2007, 06:15
Сообщение #30


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

Группа: Участник
Сообщений: 147
Регистрация: 20-08-06
Пользователь №: 19 681



Получилось!!!!!!!!!!!!!!
Всем спасибо, Просто поставил пер резистор на 10кОм,.
Я просто счастлив.


--------------------
Мой канал: CybernetSystems
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 Текстовая версия Сейчас: 21st July 2025 - 04:31
Рейтинг@Mail.ru


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