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

 
 
 
Reply to this topicStart new topic
> Моделирование работы Mega32 c Lcd 16*2 в Proteus, в железе работает, а в протеусе нет
sergeus
сообщение Sep 13 2008, 10:56
Сообщение #1


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

Группа: Участник
Сообщений: 157
Регистрация: 11-12-07
Из: Москва
Пользователь №: 33 174



Здравствуйте, уважаемые форумчане!
Столкнулся с такой проблеммой:
написал программу, запустил на железе - заработала.
Сделал модель в Proteus - не работает вывод на дисплей, хотя остальная часть программы работает - есть адекватная реакция на нажатие кнопок (загорается светодиод).
Привожу выжимки работающей части моей программы(все лишнее, не связанное с выводом на дисплей удалил и скомпилил в WinAVR). Залил в МК - все заработало, но как-то не очень стабильно - то курсор моргает, хотя не должен, то вторая строка не выводится(редко, но бывает).
У меня есть подозрения, что дело в задержках - хотя все делал по даташитам. Может кто наступал на подобные грабли. Несколько веток читал на подобные темы - не помогло. Самое главное: почему не эмулируется в протеусе, хотя программу, написанную мной на асме, отлично эмулирует.

В прикрепленном файле программа на Си и модель для протеуса.
Прикрепленный файл  lcd_16x2.rar ( 47.84 килобайт ) Кол-во скачиваний: 389


Жду конструктивной критики. Спасибо

Моя урезанная программа вывода на дисплей:

Код
#include <avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define cbi(reg, bit) (reg&=~(1<<bit))
#define sbi(reg, bit) (reg|= (1<<bit))

#define LCDPORT PORTC
#define LCDDDR DDRC
#define RS 0
#define E 1

#define Rising    1
#define Falling 0



#define RS_0 cbi(LCDPORT,RS)
#define RS_1 sbi(LCDPORT,RS)
#define E_0 cbi(LCDPORT,E)
#define E_1 sbi(LCDPORT,E)

void ClearLcd(void);
void lcddata(unsigned char temp);
void lcdcmd(unsigned char temp);
void ShowStr(unsigned char *s);

unsigned int T1=0, T2=0, PreviousTime;
unsigned char z=0, Edge, Button=0, n=0;
double axel;
char buffer[15];

char hi[]="*************";
char hi2[]="++++++++++++++";


void lcdcmd(unsigned char temp){
    
    LCDPORT = (temp & 0xF0);
    RS_0;        // command
    E_1;
    _delay_us(2);
    E_0;
    
    
    LCDPORT = ((temp & 0x0F) << 4);
    RS_0;        // command
    E_1;
    _delay_us(2);
    E_0;
    
    _delay_us(50);
}

void lcddata(unsigned char temp){
    
    LCDPORT = (temp & 0xF0);
    RS_1;        // data
    E_1;
    _delay_us(2);
    E_0;
    
    LCDPORT = ((temp & 0x0F) << 4);
    RS_1;        // data
    E_1;
    _delay_us(2);
    E_0;
    
    _delay_us(50);
}

void lcdinit(void){

    
    PORTC = 0x00;
    DDRC = 0b11110011;     // output
    _delay_ms(50);
    
    E_0;
    RS_0;
    

    lcdcmd(0x30);
    _delay_ms(6);        

    lcdcmd(0x30);
    _delay_ms(1);        // !!! возможно эти задержки лишниие

    lcdcmd(0x30);
    _delay_ms(1);


    lcdcmd(0x28);         // 4 bit, 2 lines, 5*7 font
    _delay_ms(1);

// !!! иногда курсор все-таки отображается, хотя не должен

    lcdcmd(0x0C);        // cursor OFF, display ON
    _delay_ms(5);

    lcdcmd(0x02);        // Home
    _delay_ms(2);

    lcdcmd(0x06);        // -> inc
    _delay_ms(1);
    
    ClearLcd();

}

void ClearLcd(void){

    lcdcmd(0x01);     // clear LCD
    _delay_ms(3);    // max 1.53mS

}



void ShowStr(unsigned char *s){
  while(*s != 0) lcddata(*s++);
}

int main (void) {

    lcdinit();

    ClearLcd();
    ShowStr(hi);
    lcdcmd(0xC0);
    _delay_ms(1);
    ShowStr(hi2);
    
    while(1);
}
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 13 2008, 16:41
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Если в "железе" работает, а в моделировщике нет, то это означает неадекватность модели реальности. Либо модель, либо саму программу нужно фтопку smile.gif
Если бы вы почитали форум, то могли бы заметить, что довольно много сообщений c жалобами на плохое моделирование работы модулей LCD в вашем Протеусе.
Go to the top of the page
 
+Quote Post
sergeus
сообщение Sep 13 2008, 16:46
Сообщение #3


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

Группа: Участник
Сообщений: 157
Регистрация: 11-12-07
Из: Москва
Пользователь №: 33 174



Спасибо за ответ. Вроде бы разобрался в чем дело. Не совсем корректно инициализировал дисплей.
Может кому пригодиться, инициализировать надо было так:
Код
void lcdinit(void){

    
    PORTC = 0x00;
    DDRC = 0b11110011;     // output
    _delay_ms(60);
    
    E_0;
    RS_0;


    lcdcmd(0x30);        
    _delay_ms(5);
    
    lcdcmd(0x30);        
    _delay_us(200);

    lcdcmd(0x30);        
    _delay_us(200);
    
    lcdcmd(0x02);        // 4bit mode

    lcdcmd(0x02);        // 4bit mode

    lcdcmd(0x28);         // 4 bit, 2 lines, 5*7 font
    
    lcdcmd(0x0C);        // cursor OFF, display ON

    lcdcmd(0x06);        // -> inc
    
    ClearLcd();


}


В подпрограмме записи команды надо поставить задержку на 300uS. Кстати "железный дисплей", на мой взгяд, стал стабильнее запускаться.
P.S. модель в Proteus заработала! smile.gif
Go to the top of the page
 
+Quote Post
domowoj
сообщение Sep 14 2008, 02:42
Сообщение #4


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

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Была анн. ситуация, правда уже давно, оказалось не в кривости рученок коннкретного разработчика,
а СЫРОСТИ Лабцентровской софтины.
Да, все что касается элементарщины - на уровне мигания светодиодами - все работает, но стоит капуть глубже (хотябы задеть какое-нить прерывание или счетчик в рехиме ШИМ - кранты).

На
http://kazus.ru/modules.php?name=Forums&am...p;p=93132#93132
есть ветка, если кто желает помочь себе и людям - милость прошу.
500руб. в нане время не такие уж велиеие дньги, а задумка - хорошая, ИМХО.
Несочтитете за рекламу.


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
Roger
сообщение Dec 9 2010, 08:35
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383



спасибо, помогли ваши рекомендации
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 16:02
Рейтинг@Mail.ru


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