Simpel C kod för en vanlig HD44780

Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

Supertack mrhedin :)

tänkte kolla om det är förlite ström, men jag vet att folk har kortslutit det mesta genom att mäta fel, så bäst att jag frågar... vart ska ja mäta?
mrhedin
Inlägg: 114
Blev medlem: 3 maj 2005, 19:46:24
Ort: Trollhättan/Kiruna
Kontakt:

Inlägg av mrhedin »

För lite ström borde det ju inte vara eftersom du fick LCD:n att lysa.
En atmega8 med lcd vet jag drar ungefär 115mA, så har du nåt som klarar att leverera det borde det ju vara lugnt.

Strömmen mäter du genom att bryta kretsen, ta utgången från din strömförsörjning, koppla den in i din multimeter, sedan från multimetern tillbaka till kretsen igen.
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

det är nog som du säjer, tänke aldrig så långt...

men, va fan kan de va?

ska ta en bild på hur det är kopplat ikväll... så kasnske någon kan se ifall något är galet...

det är denna display så, det är ingen lcd, utan oled men, den är ju hd44780 kompartibel så det borde ju inte vara något problem, eller?

http://www.lawicel-shop.se/shop/custom/ ... &refcode=p
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

känns lite som att ifall inte lcd:n va sönder när ja fick den så är den definitivt nu...

aja, här är två bilder på hur jag "riggat"

Bild

Bild

hoppas att ni ser där, och att någon kan se vad som är fel...
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

I och med att du bara kör med 4 bitars kommunikation istället för 8 bitar så bör du binda de anda fyra till GND som du inte använder.

Annars kan de inta ett okänt nivå tex 1 eller 0.
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

okej:)

gjort de, ingen förändring :(

den är kolsvart
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> I och med att du bara kör med 4 bitars kommunikation istället för 8 bitar så bör du binda de anda fyra till GND som du inte använder.

Säker på det ? Jag har för mig att de 4 oanvända data linjerna bör/ska vara "floating". LCD controllern håller dom "uppe" med interna pull-ups. Och när man switchar om RW för att läsa så kan en "hård" pull-up/down av signalerna komma i konflikt med det data som controllern (försöker) lägger ut.
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

hmm...

sak samma, den är stendöd :(

finns det något sätt så att den bara lyser? alltså, så att kolla ifall den funkar bara...
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Du kan prova den här gamla koden som jag skrev när jag höll på och lära mig AVR. Koppla precis som define-raderna antyder och ändra ingenting. För det tror jag nämnligen inte att koden klarar av i sitt nuvarande skick. :)

Det var faktiskt just en OLED-display jag använde då.

Kod: Markera allt

#include <avr/io.h>
#include <avr/delay.h>
#include <inttypes.h>

#define LCD_D4 PB1
#define LCD_D5 PB2
#define LCD_D6 PB3
#define LCD_D7 PB4

#define LCD_RS PD0
#define LCD_E  PD1

#define delay _delay_loop_2

// Initieringskommandon till LCD:n
static const uint8_t lcd_init_cmds[] =
{
	_BV(LCD_D5)|_BV(LCD_D4),
	_BV(LCD_D5)|_BV(LCD_D4),
	_BV(LCD_D5)|_BV(LCD_D4),
	_BV(LCD_D5),
	_BV(LCD_D5),
	_BV(LCD_D7),
	_BV(0), _BV(LCD_D7),
	_BV(0), _BV(LCD_D4),
	_BV(0), _BV(LCD_D6)|_BV(LCD_D5),
	_BV(0), _BV(LCD_D7)|_BV(LCD_D6)
};


void lcd_cmd(uint8_t cmd)
{
	PORTB &= ~(_BV(LCD_D7)|_BV(LCD_D6)|_BV(LCD_D5)|_BV(LCD_D4));
	PORTB |= cmd;

	PORTD |= _BV(LCD_E);
	delay(10);
	PORTD &= ~_BV(LCD_E);

	delay(1000);
}

void lcd_byte(uint8_t byte)
{
	PORTD |= _BV(LCD_RS);
	delay(10);

	lcd_cmd((byte&0xf0) >> 3);
	lcd_cmd((byte&0xf) << 1);

	PORTD &= ~_BV(LCD_RS);
	delay(10);
}

void lcd_print_string(uint8_t *string)
{
	while (*string)
		lcd_byte(*string++);
}

void lcd_move_cursor(const uint8_t row, const uint8_t offset)
{
	lcd_cmd(_BV(LCD_D7) | (row==1 ? _BV(LCD_D6) : 0) | (offset&16 ? _BV(LCD_D4) : 0));
	lcd_cmd((offset&0xf) << 1);
}

void lcd_init()
{
	uint8_t i;

	DDRB |= _BV(LCD_D4)|_BV(LCD_D5)|_BV(LCD_D6)|_BV(LCD_D7);
	PORTB |= _BV(LCD_D4)|_BV(LCD_D5)|_BV(LCD_D6)|_BV(LCD_D7);

	DDRD |= _BV(LCD_RS)|_BV(LCD_E);
	PORTD &= ~(_BV(LCD_RS)|_BV(LCD_E));
	
	delay(20000); //20ms

	for (i=0;i<sizeof(lcd_init_cmds);i++)
		lcd_cmd(lcd_init_cmds[i]);
}

int main()
{
	lcd_init();
	lcd_move_cursor(0,0);
	lcd_print_string("Hej");

	return 0;
}
edit: Ändrade en grejj i koden
edit2: delay
Senast redigerad av cykze 14 oktober 2005, 23:13:36, redigerad totalt 1 gång.
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

-------- begin --------
avr-gcc (GCC) 3.4.3
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Compiling: display.c
avr-gcc -c -mmcu=atmega32 -I. -gstabs -DF_CPU=8000000UL -O0 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=display.lst -std=gnu99 -MD -MP -MF .dep/display.o.d display.c -o display.o
display.c: In function `lcd_cmd':
display.c:35: warning: implicit declaration of function `delay'
display.c: At top level:
display.c:66: warning: function declaration isn't a prototype
display.c:82: warning: function declaration isn't a prototype
display.c:87:3: warning: no newline at end of file

Linking: display.elf
avr-gcc -mmcu=atmega32 -I. -gstabs -DF_CPU=8000000UL -O0 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=display.o -std=gnu99 -MD -MP -MF .dep/display.elf.d display.o --output display.elf -Wl,-Map=display.map,--cref -lm
display.o(.text+0x3a): In function `lcd_cmd':
display.c:35: undefined reference to `delay'
display.o(.text+0x4e):display.c:38: undefined reference to `delay'
display.o(.text+0x88): In function `lcd_byte':
display.c:44: undefined reference to `delay'
display.o(.text+0xbc):display.c:50: undefined reference to `delay'
display.o(.text+0x1d8): In function `lcd_init':
display.c:75: undefined reference to `delay'
make.exe: *** [display.elf] Error 1


det blir fel, den antyder att de itne finns någon delay funktion....


Edit: ändrade till _delay_loop_2 då kompilerade den... men, fortfarande kolsvart på displayen
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

nu har jag mätt och dessa är resultaten:

data1 1,4v - 2,2v
data2 5v
data3 1,4v - 2,2v
data4 1,4 - 2,2v
rs 5v
rw 5v
e 0,4v

lite konstigt tycker jag ändå att det är...

det är den koden som cykze skrev... men jag tvivlar på att det är den som det är fel på...
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Ja, det skulle vara _delay_loop_2 istället. Tråkigt att det ändå inte fungerar. :(

Kopplade du så här?

#define LCD_D4 PB1
#define LCD_D5 PB2
#define LCD_D6 PB3
#define LCD_D7 PB4
#define LCD_RS PD0
#define LCD_E PD1

Enligt output:en så kör du AVR:en i 12 MHz. Stämmer det? Om du kör med den interna oscillatorn och inte har ändrat på något bör den gå i 1 MHz, om jag inte minns fel. Nu spelar det ingen roll i det här fallet men du bör ändå sätta F_CPU till rätt värde i Makefile:en.
mrhedin
Inlägg: 114
Blev medlem: 3 maj 2005, 19:46:24
Ort: Trollhättan/Kiruna
Kontakt:

Inlägg av mrhedin »

Använder du den kopplingen som du har där så kan du inte använda min kod heller p.g.a. att den baserar sig på 8-bitars överföring.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

RW ska du koppla till jord.
mrhedin
Inlägg: 114
Blev medlem: 3 maj 2005, 19:46:24
Ort: Trollhättan/Kiruna
Kontakt:

Inlägg av mrhedin »

Men du! När jag vänder på min LCD som ser identisk ut som den du har där på baksidan, så är stiften numrerade från höger till vänster. Det ser ut som du spegelvänt det hela...
Skriv svar