het gaat overigens over dit display
https://www.reichelt.de/lcd-dot-matrix-module-2x16-karakters-blauw-lcd…
Golden Member
het gaat overigens over dit display
https://www.reichelt.de/lcd-dot-matrix-module-2x16-karakters-blauw-lcd…
Special Member
Als dat ook tienduizenden dezelfde displays zijn...
Nee, tientallen verschillende merken...
Golden Member
ik ben nu aan het proberen om het display the initialiseren in de 4-bits mode, maar dat wil nog niet erg vlotten. ik blijf op de bovenste regel allemaal blokjes houden.
doe ik het op de juiste manier ? of zie k iets over het hoofd ?
c code:
#define F_CPU 1000000UL // 1 MHz int osc
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
int xpuls;
int main (void) // Beginpunt
{
DDRB = 0b11111111;
PORTB = 0b00000000;
while(1) // oneindige lus
{
_delay_ms(10);
PORTB |= ( 0b0010 & 0xF0); //function set high nibble
PORTB |= (1 << PINB2); // enable
_delay_ms(10);
PORTB &= ~(1 << PINB2); // enable
PORTB |= ( (0b1000<<4) & 0xF0); //function set low nibble
PORTB |= (1 << PINB2); // enable
_delay_ms(10);
PORTB &= ~(1 << PINB2); // enable
PORTB |= ( 0b0000 & 0xF0); //display on/off high nibble
PORTB |= (1 << PINB2); // enable
_delay_ms(10);
PORTB &= ~(1 << PINB2); // enable
PORTB |= ( (0b1111<<4) & 0xF0); //display on/off low nibble
PORTB |= (1 << PINB2); // enable
_delay_ms(10);
PORTB &= ~(1 << PINB2); // enable
PORTB |= ( 0b0000 & 0xF0); //clear display high nibble
PORTB |= (1 << PINB2); // enable
_delay_ms(10);
PORTB &= ~(1 << PINB2); // enable
PORTB |= ( (0b0001<<4) & 0xF0); //clear display set low nibble
PORTB |= (1 << PINB2); // enable
_delay_ms(10);
PORTB &= ~(1 << PINB2); // enable
PORTB |= ( 0b0000 & 0xF0); //entry node set high nibble
PORTB |= (1 << PINB2); // enable
_delay_ms(10);
PORTB &= ~(1 << PINB2); // enable
PORTB |= ( (0b0110<<4) & 0xF0); //entry mode set low nibble
PORTB |= (1 << PINB2); // enable
_delay_ms(10);
PORTB &= ~(1 << PINB2); // enable
}
}
Wat denkt je hiermee te bereiken? de meeste programmeertalen zijn al voorzien voor de aansturing van zo'n display en een printinstructie.
Ga je dat allemaal zelf ontwikkelen?
Als het de bedoeling is om te leren dan OK, anders is het tijdverlies en begrijp ik de bedoeling niet.
Golden Member
nee, ik wil het niet zelf ontwikkelen of om van te leren. ik wil het gewoon werkend hebben.
ik gebruik atmel studio 7, zijn er voor het aansturen v/h display libary's beschikbaar ?
Special Member
Ben niet vertrouwd met AVR maar als je eens Googlet krijg je zeker enkele voorbeelden oa. deze
Golden Member
oh,..ja croppen. dat hebben ze me pas verteld.
die Initialisatie staat niet in die datasheet van mij, ik vond hem al erg summier.
Golden Member
verdorie MGP dat is een goede link, had ik zelf nog niet gevonden.
edit: libary een beetje aangepast, (welke pinnen op welke outputs) en tekst op het display.
Ik heb ook regelmatig met die 4-bits mode zitten tobben. Het flow diagram is niet helemaal gelijk voor alle displays.
Het laaste project waar ik mee bezig was(ben) specificeerde bijvoorbeeld 15 ms als opstart tijd en die hierboven 30 ms.
Die "function set" moet soms meerdere keren schrijven om je display weer aan de gang te krijgen na een soft reboot bijvoorbeeld.
Bij poweron komt het display op in 8-bit mode en je moet deze dan omschakelen naar 4-bit. Als het programma restart zonder power cycle dan werkt het display niet meer als de init-code wat kort door de bocht is.
Dit zit er in mijn init (op een STM32):
(Oh ja ik gebruik de busy ook gewoon)
code:
/*
* Initialize a Hitachi compatible LCD display
*
* Pass in init structure to the function with the
* correct I/O and row/column configuration. (@@TODO@@ Not yet implemented)
*
* The clock cycle is typical 270 Khz, (190 .. 350 KHz worse case).
* This yields a clock period of 3.7 uS typical (or worse case 5.3 uS)
*/
int HD44780_Init(const struct HD_Config *config) {
HAL_Delay(16); // Wait more than 15mS
// We can't check the busy flag yet.
/* Set GPIO to outputs */
setGpioDataDirection(OUTPUT);
/* Make sure we have no enable active */
setE(false);
/* Select the Instruction register */
setRS(false);
setRW(false);
// The display is set to 8-bit mode after reset, so we need to send 2 cycles to switch back.
// Function set
// DL=1 8 bit interface
// DB7 DB6 DB5 DB4
// 0 0 1 DL
writeNibble(0x03);
HAL_Delay(6); // Wait more than 4.1ms
writeNibble(0x03); // Repeat function set
HAL_Delay(2); // Wait more than 100 uS
// Repeat function set (8-bit interface)
// DL=1 8 bit interface
// DB7 DB6 DB5 DB4
// 0 0 1 DL
writeNibble(0x03);
HAL_Delay(2); // Wait more than 100 uS
// Function set (4-bit interface)
// DL=0 4 bit interface
// DB7 DB6 DB5 DB4
// 0 0 1 DL
writeNibble(0x02);
HAL_Delay(2); // Wait more than 100uS? (not specified)
// BF can be checked now.
// When BF is not checked, the waiting time between instructions
// must be longer than the execution time. (See Instruction set)
// 8-bit writes shall be used from now on (in two nibbles).
// Function set: Specify display lines
// N=rows-1, F=0 (5x8 font)
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 1 0 N F * * 0x28
writeIR(0x28);
// D=1/0 Display on/off, C=1/0 Cursor on/off, B=1/0 Blink on/off
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 0 1 D C B 0x08 Display off, Cursor off, Blink off
writeIR(0x08); // Display off
// Clear Display
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 0 0 0 0 1 0x01 Display CLEAR
writeIR(0x01);
// Entry mode set
// I/D=1 , S=0
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 0 0 1 I/D S 0x06 entry mode set I=1 auto increment, S=0 No shift.
writeIR(0x06);
// --- END INIT ---
// D=1/0 Display on/off, C=1/0 Cursor on/off, B=1/0 Blink on/off
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 0 1 D C B 0x08 Display OFF, Cursor OFF, Blink OFF
writeIR(0x0E); // Display on/cursor on/blink off
return 0;
}
WriteIR() en WriteDR() zijn dus functies die dus 2 nibbles schrijven. Eerst HIGH dan LOW deel (+Enable puls met de juiste timing).
WriteNibble() schrijft alleen de 4 LSB's (+E puls).
De code moet ik nog een keer fixen dat die ook de mee-gepassede struct met de IO pinnen gebruikt. Ben ook daar nog niet aan toegekomen net als de rest van het project wat al een jaar stil ligt.