Witam.
Mój kod wzięty z tej strony:
http://radzio.dxp.pl/hd44780/hd44780_avr_4-bit_norw_c.htm
Połączenie jest identyczne jak na tamtym schemacie.
Skonfigurowałem sobię atmegę tak:
Odpowiedni procesor ustawiłem dlatego powinno się dobrze zadeklarować DDRD.
mam podpięte od PD0 - PD3 szyna danych oraz PD5 do Enable i PD6 do RS. RW jest do masy.
Po włączeniu zapala się prawa część wyświetlacza na czarno czyli kontrast ustawiony dobrze.
Moj program testowy wygląda tak:
Ale zamiast całego tekstu wyświetla się tylko 8 pierwszych liter.
Używam zasilania od zasilacza komputerowego, przy procesorze mam 2 kondensatory 100nF dokładniej pomiedzy VCC a masą oraz pomiędzy AREF i masą.
Co robię nie tak? Może mój program jest zły? Opóźnienia za małe?
Atmega jest nowa, raz zaprogramowana więc nie sądzę żeby była walnięta.
EDIT:
Tutaj jeszcze funkcja init:
Mój kod wzięty z tej strony:
http://radzio.dxp.pl/hd44780/hd44780_avr_4-bit_norw_c.htm
Połączenie jest identyczne jak na tamtym schemacie.
Skonfigurowałem sobię atmegę tak:
#define LCD_RS_DIR DDRD
#define LCD_RS_PORT PORTD
#define LCD_RS (1 << PD6)
#define LCD_E_DIR DDRD
#define LCD_E_PORT PORTD
#define LCD_E (1 << PD5)
#define LCD_DB4_DIR DDRD
#define LCD_DB4_PORT PORTD
#define LCD_DB4 (1 << PD3)
#define LCD_DB5_DIR DDRD
#define LCD_DB5_PORT PORTD
#define LCD_DB5 (1 << PD2)
#define LCD_DB6_DIR DDRD
#define LCD_DB6_PORT PORTD
#define LCD_DB6 (1 << PD1)
#define LCD_DB7_DIR DDRD
#define LCD_DB7_PORT PORTD
#define LCD_DB7 (1 << PD0)Odpowiedni procesor ustawiłem dlatego powinno się dobrze zadeklarować DDRD.
mam podpięte od PD0 - PD3 szyna danych oraz PD5 do Enable i PD6 do RS. RW jest do masy.
Po włączeniu zapala się prawa część wyświetlacza na czarno czyli kontrast ustawiony dobrze.
Moj program testowy wygląda tak:
#include <avr/io.h>
//#include "def.h"
//#include "D:\Archiwum\AVR\hd44780_4bit_norw\HD44780.h"
#include "D:\Archiwum\AVR\hd44780_4bit_norw\HD44780.c"
int main(void)
{
LCD_Initalize();
LCD_WriteText("Test");
for(;;)
{
}
return(0);
}
Ale zamiast całego tekstu wyświetla się tylko 8 pierwszych liter.
Używam zasilania od zasilacza komputerowego, przy procesorze mam 2 kondensatory 100nF dokładniej pomiedzy VCC a masą oraz pomiędzy AREF i masą.
Co robię nie tak? Może mój program jest zły? Opóźnienia za małe?
Atmega jest nowa, raz zaprogramowana więc nie sądzę żeby była walnięta.
EDIT:
Tutaj jeszcze funkcja init:
void LCD_Initalize(void)
{
unsigned char i;
LCD_DB4_DIR |= LCD_DB4; // Konfiguracja kierunku pracy wyprowadzeń
LCD_DB5_DIR |= LCD_DB5; //
LCD_DB6_DIR |= LCD_DB6; //
LCD_DB7_DIR |= LCD_DB7; //
LCD_E_DIR |= LCD_E; //
LCD_RS_DIR |= LCD_RS; //
_delay_ms(15); // oczekiwanie na ustalibizowanie się napiecia zasilajacego
LCD_RS_PORT &= ~LCD_RS; // wyzerowanie linii RS
LCD_E_PORT &= ~LCD_E; // wyzerowanie linii E
for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
{
LCD_E_PORT |= LCD_E; // E = 1
_LCD_OutNibble(0x03); // tryb 8-bitowy
LCD_E_PORT &= ~LCD_E; // E = 0
_delay_ms(5); // czekaj 5ms
}
LCD_E_PORT |= LCD_E; // E = 1
_LCD_OutNibble(0x02); // tryb 4-bitowy
LCD_E_PORT &= ~LCD_E; // E = 0
_delay_ms(1); // czekaj 1ms
LCD_WriteCommand(HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_ONE_LINE | HD44780_4_BIT); // interfejs 4-bity, 2-linie, znak 5x7
LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF); // wyłączenie wyswietlacza
LCD_WriteCommand(HD44780_CLEAR); // czyszczenie zawartosći pamieci DDRAM
_delay_ms(2);
LCD_WriteCommand(HD44780_ENTRY_MODE | HD44780_EM_SHIFT_CURSOR | HD44780_EM_INCREMENT);// inkrementaja adresu i przesuwanie kursora
LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF | HD44780_CURSOR_NOBLINK); // włącz LCD, bez kursora i mrugania
}