display RS485

Arco

Special Member

Als dat ook tienduizenden dezelfde displays zijn...

Nee, tientallen verschillende merken...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
trix

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
			
	}
}



eigenwijs = ook wijs

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.

LDmicro user.
trix

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 ?

eigenwijs = ook wijs
Arco

Special Member

Je moet een foto eerst even 'croppen' voordat je 'm plaatst. (zo'n postzegel op een enorm wit vlak is niet handig... ;) )
Initialisatie staat in elke 16x2 lcd datasheet:

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Ben niet vertrouwd met AVR maar als je eens Googlet krijg je zeker enkele voorbeelden oa. deze

LDmicro user.
trix

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.

eigenwijs = ook wijs
trix

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.

eigenwijs = ook wijs

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.

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.