Добрый день!
Такой вот казус: в первы раз делаю устройство, где Mega16 сопряжен с ЖКИ РС1601А. Написал простую программу для проверки работоспособности, где после нажатия на кнопку активируется выход и на ЖКИ появляется символ. Пользуюсь CVAVR, включая мастер начального кода. В Proteus все работает, а в реальности получается так: при включении питания ЖКИ (подключен к контр. или не подключен) на дисплее после регулировки V0 (контраст) появляются 8 закрашенных старших разрядов. Контроллер на нажатие кнопки реагирует, но символ на ЖКИ не появляется. Непонятно, куда двигаться дальше. Если можете, подскажите:
1. Можно ли проверить исправность ЖКИ?
2. Можно ли проверить выход контроллера на ЖКИ?
3. Существет ли предпочтительный тип ЖКИ для использования функций, включаемых мастером начального кода CVAVR?
Спасибо.
Здравствуйте! Выложите, исходники. Насчет Proteus, не стоит сильно обольщаться, у меня было обратное, на виртуальной модели в протеусе не работало, а на "железе" всё было ОК.
Не нашел даташит на ЖКИ РС1601А, я обычно использую цифро-буквенные 16x2 с контроллером HD44780. Под эти дисплеи куча исходников, я выкладывал свою библиотечку для работы с ним под WinAVR: https://radioded.ru/index.php?option=com_wrapper&Itemid=58
Здравствуйте!
Спасибо Вам за ответ. Скажите, пожалуйста, какие форматы допустимы для вложений?
Представляю папку с проектом. Извините, но я, к сожалению, не знаю, что значит выложить с помощью тегов.
Вот исходник:
/**************************************************
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Chip type : ATmega16
Program type : Application
Clock frequency : 1,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
**************************************************/
#include <mega16.h>
#include <stdio.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
char lcd_buffer[15];
// 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=Out Func5=In Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=P State6=0 State5=P State4=0 State3=P State2=P State1=P State0=P
PORTD=0xAF;
DDRD=0x50;
// 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
delay_us(500);
lcd_init(16);
while (1)
{
if (PIND.0==0)
{PORTD.4=1;
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"1");
lcd_puts(lcd_buffer);
}
if (PIND.1==0)
{
PORTD.4=0;
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"01");
lcd_puts(lcd_buffer);
}
if (PIND.2==0)
{
PORTD.6=1;
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"2");
lcd_puts(lcd_buffer);
}
if (PIND.3==0)
{
PORTD.6=0;
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"02");
lcd_puts(lcd_buffer);
}
};
}
По коду понятно, что должен использоваться дисплей совместимый с контроллером HD44780. У Вас точно такой дисплей (не нашел никакой инфы про PC-1601A), проверьте правильность пайки, распиновку по даташиту, проверьте частоту тактирования микроконтроллера (дисплеи капризно себя ведут при изменении таймингов в меньшую сторону). Попробуйте написать тестовую программку для проверки работоспособности дисплея.
Большое спасибо за внимание. Ошибку устранил запретом JTAG.
char lcd_buffer[15];//для чего это объясните пожалуйсто.Это переменная lcd где может храниться до 15 бит?
char lcd_buffer[15];//для чего это объясните пожалуйста.
Это массив char`ов для хранения ASCII символов. Своеобразный буфер символов для вывода на дисплей.
Это переменная lcd где может храниться до 15 бит?
Нет, lcd_buffer[15] - это массив из 16 элементов (lcd_buffer[0], lcd_buffer[1], ... , lcd_buffer[15]) в котором хранятся символы ASCII т.е. каждый длиной по 8 бит.