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

 
 
> Моделирование работы 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



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

 


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


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